From dberg@informix.com (David I. Berg) Newsgroups: comp.editors Subject: Re: In vi: How to delete from str1 to str2 ? Date: 6 Oct 91 20:42:49 GMT Status: O In article <1991Oct6.073919.9071@acsu.buffalo.edu> xiaofei@acsu.buffalo.edu (XiaoFei Wang) writes: >Suppose I have > >blabla string1 more blabla string2 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^ > >and Now I wnat to delete all the underlined ( from string1 to string2 ) >or replace it by something else, how do I do it in vi ? You can delete/change/yank from the cursor position up to but not including a character string. If, for instance, the character string following string2 was " string3", you would position your cursor on the first character you wish to delete/change/yank and enter 'd/ string3' to delete the underscored string in your example. (You would use 'y' to yank, and 'c' to change the string.) You can do this across several lines, eg. position your cursor on "instance" above and 'd/ example'. In the special case where you wish to delete/change/yank through the end of the line, just plain 'D' will delete and 'C' will change through the end of the line. If you wish to yank throuh the end of the line, you must 'y$'. ___ ___ Consultant, Client Srvcs Engineering / ) __ . __/ /_ ) _ __ Informix Software Inc. (303) 850-0210 _/__/ (_(_ (/ / (_(_ _/__> (-' -/~ (_- 5299 DTC Blvd #740 Englewood CO 80111 {uunet|pyramid}!infmx!dberg The opinions expressed herein are mine alone. From hrjoist@immd4.informatik.uni-erlangen.de (Holger Joist) Newsgroups: comp.editors Subject: Re: In vi: How to delete from str1 to str2 ? Date: 7 Oct 91 12:26:40 GMT Status: O xiaofei@acsu.buffalo.edu (XiaoFei Wang) writes: >Suppose I have >blabla string1 more blabla string2 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^ >and Now I wnat to delete all the underlined ( from string1 to string2 ) >or replace it by something else, how do I do it in vi ? How about: :s/string1.*string2/somethingelse/ where somethingelse can be an empty string. Holger --- Name : Holger Joist E-Mail: hrjoist@medusa.informatik.uni-erlangen.de From soh@andromeda.trl.OZ.AU (Kam Hung Soh) Newsgroups: comp.editors Subject: Re: In vi: How to delete from str1 to str2 ? Date: 7 Oct 91 22:12:04 GMT Status: O >Suppose I have >blabla string1 more blabla string2 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^ >and Now I wnat to delete all the underlined ( from string1 to string2 ) >or replace it by something else, how do I do it in vi ? You can try: 4cE ^^ || |+--- End of space-delimited word +---- Change ``E'' can be substituted with ``W'' in this case. If you have the following line instead (C and C++ programming for accessing a member of a structure or record): blabla string1.more.blabla.string2 You will have to type: ``7cw'' or ``7ce'' or ``cW'' or ``cE''. The lowercase range is used when words are not space delimited. You can also type ``C'' (in the same vein as ``D'' for delete until end of line) when you have to change all words until the end of the line. Regards, --- Soh, Kam Hung email: h.soh@trl.oz.au tel: +61 3 541 6836 Telecom Research Laboratories, POB 249 Clayton, Victoria 3168, Australia From dylan@ibmpcug.co.uk (Matthew Farwell) Newsgroups: comp.editors Subject: Re: In vi: How to delete from str1 to str2 ? Date: 7 Oct 91 08:21:53 GMT Reply-To: dylan@ibmpcug.co.uk (Matthew Farwell) Status: O In article <1991Oct6.073919.9071@acsu.buffalo.edu> xiaofei@acsu.buffalo.edu (XiaoFei Wang) writes: >Suppose I have >blabla string1 more blabla string2 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^ >and Now I wnat to delete all the underlined ( from string1 to string2 ) >or replace it by something else, how do I do it in vi ? :s/string1.*string2/wobble wobble im a gertrude/ Dylan. -- dylan@ibmpcug.co.uk || ...!uunet!uknet!ibmpcug!dylan Just follow the simple rule - Rob Pike From bill@camco.Celestial.COM (Bill Campbell) Newsgroups: comp.editors Subject: Re: In vi: How do I put line numbers in frant of each line ? Date: 8 Oct 91 04:04:53 GMT Status: O 1:In <1991Oct6.214237.2266@acsu.buffalo.edu> xiaofei@acsu.buffalo.edu (XiaoFei Wang) writes: 2:>Suppose I have 3:>bla 4:>blabla 5:>blablabla 6:>...... 7:>I would like to change it to 8:>1 bla 9:>2 blabla 10:>3 blablabla 11:>...... 12:>Is there a way to do this automatically in vi ? 13:One way to do this within vi would be to put the cursor at the 14:beginning of the first line and press !Ggrep -n '^.*$' As I did 15:here (except that I put it at the beginning of the body of the 16:message). This gives line number separated by ':' 17: 18:Bill -- INTERNET: bill@Celestial.COM Bill Campbell; Celestial Software UUCP: ...!thebes!camco!bill 6641 East Mercer Way uunet!camco!bill Mercer Island, WA 98040; (206) 947-5591 From roger@quantime.co.uk (Roger Phillips) Newsgroups: comp.editors Subject: Re: writing from buffers Date: 11 Oct 91 16:02:41 GMT Status: O In article <1991Oct10.081809.16080@apricot.co.uk>, peters@apricot.co.uk (Peter Smith) writes: > Is is possible in vi to write from named buffers? > This seems a perfectly acceptable thing to do, > but attempts using ":'aw filename" do not appear to work. ^^ The single quote means "the line marked 'a'". In vi, you refer to named buffers using "a (for example). But in ex (the mode you're in for a command starting with ':'), the " is a comment symbol, so :"aw filename is simply a comment, with no effect. Named buffers are purely a vi-mode thing, I think, so, no, you can't refer to them in any ex-mode commands (such as :w). However, since you have what you want in a named buffer, you can use :e filename"ap that is, edit the new file and 'put' the buffer contents. -- Roger Phillips roger@quantime.co.uk From mitchell@mdd.comm.mot.com (Bill Mitchell) Newsgroups: comp.editors Subject: Re: How to disable 'vi' beep? Keywords: beep bell dope vi Date: 21 Oct 91 15:43:01 GMT Status: O In article <1665@baby.and.nl> jos@and.nl (Jos Horsmeier) writes: >In article <1991Oct18.172458.17044@ux1.cso.uiuc.edu> d-lewart@uiuc.edu (Daniel S. Lewart) writes: >|There is a novice 'vi' user in my office. Every two seconds a beep emanates >|from his terminal. How can this beep be disabled? Typing 'set noerrorbells' >|does not disable the beep one gets from pressing the 'Escape' key ten times. > >I would have loved to know the answer to that! Years ago I worked at a >university with lots of newbies. All these beeps worked like a chinese >water torture! We ended up, cutting all the wires from the speakers ... >We couldn't stand it no more 8^) > >Jos aka jos@and.nl You might try having novice users invoke vi thru a shell script like the following: vi x | tr -d '\007' -- mitchell@mdd.comm.mot.com (Bill Mitchell) From mitchell@mdd.comm.mot.com (Bill Mitchell) Newsgroups: comp.editors Subject: Re: How to disable 'vi' beep? Keywords: beep bell dope vi Date: 21 Oct 91 16:11:32 GMT Status: O In article <1991Oct21.154301.12900@mdd.comm.mot.com> mitchell@mdd.comm.mot.com (Bill Mitchell) writes: > >You might try having novice users invoke vi thru a shell script like >the following: > > vi x | tr -d '\007' Let me be the first to take myself to task for posting this in haste. 1. This worked at a quick trial from the command line, and I posted. 2. After seeing it appear (oops), I tried it as a script with "$1" instead of "x". Suprise - it didn't work. BELs got through. Seems my shell issues BELs at multiple escapes, and tr isn't placed to filter these BELs off. 3. This approach might have problems anyway (and might not) depending on what type of terminal the user is using. On some terminals, the '\007' might show up other than as a BEL character - as part of a cursor positioning sequence for example. Anyway, it might be worth trying vi filename | tr -d '\007' from the command line. If that works, maybe it'll work as an alias. -- mitchell@mdd.comm.mot.com (Bill Mitchell) From ruhtra@turing.toronto.edu (Arthur Tateishi) Newsgroups: comp.editors Subject: Re: Tabs as spaces in VI. Date: 22 Oct 91 04:25:58 GMT Status: O In article <1991Oct21.221438.223@acsu.buffalo.edu> xiaofei@acsu.buffalo.edu (XiaoFei Wang) writes: >/* From the keyboard of eric@tfs.com (Eric Smith) */: >* I'm not sure what the original poster wanted, but can someone tell me >* how to disable vi's usage of tab as a fill character? i.e., when it >* does autoindent, it uses a mixture of tabs and spaces. I just want it >* to use spaces. > >In my opinion, TABs are just a group of spaces and I prefer spaces and >use TABs as less as possible. > >To answer your question as how to disable vi's usage TAB as filling >character, you need to > >set tabstop=1 > >This will set TAB = a single space. I have tested and it worked. Not quite. It looks right in vi but what you have really done is cause lots and lots of tabs to be inserted into the document in order to get indenting. Instead, use: set tabstop=200 So that vi thinks it can't use tabs to get the required small amount of indent. Of course, this now becomes dangerous when you actually hit tab or load in files with tabs already present. Therefore, you may also consider mapping tab in insert mode to ^D which does the desired thing a lot of the time. map! ^V^I ^D -- "The first fact to face is that UNIX was not developed with security, in any reliable sense, in mind; this fact alone guarantees a vast number of holes." -- "On the Security of UNIX", Dennis M. Ritchie Arthur Tateishi ruhtra@turing.utoronto.ca From krisk@ux1.cso.uiuc.edu (Kris Klindworth) Newsgroups: comp.editors Subject: Re: vi question, replace second occurence Keywords: vi, s-e Date: 24 Oct 91 16:24:54 GMT Status: O hess@rosun1.informatik.uni-hamburg.de (Hauke Hess) writes: >Hi, >I'm working on a TeXnification of the jargon file. That's not too difficult, >but there is one thing I would like to do by Search&Replace, which I don't >know how: >In the Jargonfile are many words enclosed in ", like the following sentence >the "slow" brown fox jumps over the "crazy" dog. >I want to change that sentence in: >the ``slow'' brown fox jumps over the ``crazy'' dog. >for the sake of typographical correctness. In other words: how do I replace >each second occurence of a string with another, with not respect to lineends >between the words? >So a sentence like >there is a "problem >extraordinaire" in here. >should be replaced as well. >I thought it would have somthing to do with "finding the Nth occurrence" >as asked a few letters ago, but the answers on that weren't that helpfull. For this problem you can use :%s/"\"/''/ The special pattern \< matches the beginning of what vi considers a word and \> matches the end. You'll still have to check the file to resolve the cases that vi didn't consider words, but this should handle the bulk of your changes. ------------------------------------------------------------------------------ Kris Klindworth Internet: krisk@ux1.cso.uiuc.edu Database Programmer/Analyst Phone : (217)244-7120 Illinois State Water Survey US Mail : 2204 Griffith Dr Champaign, IL 61820 From gwc@root.co.uk (Geoff Clare) Newsgroups: comp.editors Subject: Re: vi question - am I so different? Date: 24 Oct 91 18:07:31 GMT Status: O In <28900002@teecs.UUCP> belkin@teecs.UUCP (Hershel Belkin) writes: >Thanks for the attempted answers, but no cigar yet!! >Any other suggestions, or should I start looking for >a _real_ editor? Here's a macro that provides repeated "n" commands. :map ^N In^V^[l"zd^@z where ^V, ^N and ^[ are CTRL-V, CTRL-N and ESC (but ^@ is ^ then @). To use it, search for the first occurrence of the string, then type CTRL-N E.g. to search for the 96th occurrence of the string "xyz", type: /xyz^M96^N The reason this has a 96 instead of a 95 is that the macro actually searches from the beginning of the current line, not from the cursor, so it finds the first match again (unless it's at the beginning of the line!) You just have to be a bit careful when there are multiple matches on a line, otherwise it works OK. If anyone can think of a way round the "beginning of line" problem, I'd like to hear it! -- Geoff Clare (USA UUCP-only mailers: ...!uunet!root.co.uk!gwc) UniSoft Limited, London, England. Tel: +44 71 729 3773 Fax: +44 71 729 3273 From krisk@ux1.cso.uiuc.edu (Kris Klindworth) Newsgroups: comp.editors Subject: Re: vi question - am I so different? Date: 24 Oct 91 22:48:08 GMT Status: O gwc@root.co.uk (Geoff Clare) writes: >In <28900002@teecs.UUCP> belkin@teecs.UUCP (Hershel Belkin) writes: >>Thanks for the attempted answers, but no cigar yet!! >>Any other suggestions, or should I start looking for >>a _real_ editor? >Here's a macro that provides repeated "n" commands. > :map ^N In^V^[l"zd^@z >where ^V, ^N and ^[ are CTRL-V, CTRL-N and ESC (but ^@ is ^ then @). >If anyone can think of a way round the "beginning of line" problem, I'd >like to hear it! Cool solution. Much better than the one I was about to post. I got around the beginning of line problem by marking the beginning position first and then returning to it before running the @z. Your macro would be something like this :map ^N mzIn^V^[l"zd^`z@z ------------------------------------------------------------------------------ Kris Klindworth Internet: krisk@ux1.cso.uiuc.edu Database Programmer/Analyst Phone : (217)244-7120 Illinois State Water Survey US Mail : 2204 Griffith Dr Champaign, IL 61820 From malte@techfak.uni-bielefeld.de (Malte Uhl) Newsgroups: comp.editors Subject: Re: vi question - am I so different? Date: 25 Oct 91 10:17:39 GMT Status: O In article <3553@root44.co.uk>, gwc@root.co.uk (Geoff Clare) writes: |> |> Here's a macro that provides repeated "n" commands. |> |> :map ^N In^V^[l"zd^@z |> |> where ^V, ^N and ^[ are CTRL-V, CTRL-N and ESC (but ^@ is ^ then @). |> |> To use it, search for the first occurrence of the string, then type |> |> CTRL-N |> |> E.g. to search for the 96th occurrence of the string "xyz", type: |> |> /xyz^M96^N |> |> The reason this has a 96 instead of a 95 is that the macro actually |> searches from the beginning of the current line, not from the cursor, so |> it finds the first match again (unless it's at the beginning of the line!) |> You just have to be a bit careful when there are multiple matches on a |> line, otherwise it works OK. |> |> If anyone can think of a way round the "beginning of line" problem, I'd |> like to hear it! Here it is: :map ^N In^V^[l"zd^n@z just add another n to it. One could also do some experiments with ``, which means "go back to the letter you were before the last command". I'm not familiar with this command; I usually use '', which goes back to the line before the last command. Article: 3325 of comp.editors From lshaw@ccwf.cc.utexas.edu (Logan Shaw) Subject: Re: vi question, replace second occurence Keywords: vi, s-e Date: 26 Oct 91 01:08:15 GMT hess@rosun1.informatik.uni-hamburg.de (Hauke Hess) wants to change the "slow" brown fox jumps over the "crazy" dog. to the ``slow'' brown fox jumps over the ``crazy'' dog. >So a sentence like > >there is a "problem >extraordinaire" in here. > >should be replaced as well. His approach to the problem was to replace every _other_ occurence of the double quote character ('"'). I'd like to suggest a different approach. Replace the quote characters one of the two replacement strings, determining which to replace them with by the surrounding characters. If the quote is at the beginning of the line, it should be a beginning quote. If at the end of the line, and end quote. This assumes you're not going to have a sentence like this: His name was "Phroed " and he was green. nor like this: I'm watching the TV program " Matlock." If a quote has a alphanumeric character before it, and not after it, it should be replaced with and ending quote, and vice versa. If it has a space before it and not after it, an ending quote, and vice versa. The regexp's for this would be something like: :%s/^"/``/ :%s/"$/''/ :%s/ "\([^ ]\)/ ``\1/g :%s/\([^ ]\)" /\1'' /g :%s/\([a-z0-9]\)"\([^a-z0-9]\)/\1''\2/g :%s/\([^a-z0-9]\)"\([a-z0-9]\)/\1``\2/g Hope this helps... Adios, Logan -- : Our trial is which car to buy. Temptation is that extra dessert. : |In the land of orange juice you're better off with the right kind of shirt.| | But take away the naivete; expose the sources of our fears. | :We'll run to missiles if we're pushed too far- proceed to blow it all away.: From gast@oahu.cs.ucla.edu (David Gast) Newsgroups: comp.editors Subject: Re: vi question, replace second occurence Keywords: vi, s-e Date: 28 Oct 91 00:13:51 GMT Status: O In article hess@rosun1.informatik.uni-hamburg.de (Hauke Hess) writes: > how do I replace each second occurence of a string with another [ignoring] > lineends. >there is a "problem >extraordinaire" in here. >should be replaced as well. First off, I am not sure that 100% automated process will work correctly. There is a chance that a problem will develop. For example, there could be a " missing, or an extra one inserted in the wrong place. Additionally, at some point, " could be used by itself as in this sentence. I would first check for some of the above and I would see if you have any "' or '" pairs. Assuming that everything is as it should be, then I suggest the following. It is not the fastest way possible, but you can look at the screen and make sure that everything appears to be working properly. 1. /" (that is, search for a ") 2. put the cursor before the current position in file) 3. Define the following maps. You can use any lefthand side character that you want. :map b ns``^V^M :map e ns''^V^M :map g bebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebe 4. Now type g as many times as necessary. You could do something like :map G ggggggggggggggggggggggggggggggggggggggggggggg and then type G as many times as necessary. If you save your file frequently, then when something goes wrong, you have the problem isolated to a relatively small area. Perhaps I am being pessimistic, but I suspect there is at least one typo in a file that has over one meg in it. David From hansm@cs.kun.nl (Hans Mulder) Newsgroups: comp.editors Subject: Re: removing first field from a number of lines with vi Date: 29 Oct 91 17:52:28 GMT Status: O In <5561@julian.uwo.ca> creider@taptet.sscl.uwo.ca (Chet A. Creider) writes: >I know this is easily done with awk, but would like to know if it >can be done with vi--if one has a file with data in tab-separated >fields and wants to remove the first field from each line (in other >words a dw done at the beginning of each line in the file), how >can this be done? Those are two different questions. If you want to delete everything up to and including the first tab, you could do :%s/[^ ]* // ^ ^ those are tab characters If, on the other hand, you want the equivalent of a dw at the beginning of each line, you would say: :%s/[a-zA-Z0-9_]*[ ]*// ^tab ^space You can leave off trailing slashes on a :s command if you hate wearing out your '/' key. (Or you can use another punctuation character ;-) I don't see any obvious way to get either of these effects by filtering the buffer through awk. But if you know an awk command that does what you want, you can say from within vi 1G!G awk 'whatever' and it ought to work. -- Hope this helps, Hans Mulder hansm@cs.kun.nl From s887212@minyos.xx.rmit.oz.au (S.Riehm) Newsgroups: comp.editors Subject: Re: Smart 'C' editors?!? Date: 29 Oct 91 22:36:49 GMT Status: O valley@gsbsun.uchicago.edu (Doug Dougherty) writes: >A couple of (presumably dumb) questions: > 1) What does map! do (as opposed to plain ol' map) ? > 2) What do things like /*, ca', and ei' mean as map! targets? > (They sure don't look like keys to me) 1: map! defines mappings for keys while in insert mode 2: you can map strings, vi will give you time to type the whole string, and that string will b instantly replaced by whatever you have mapped it to. if you set notimeout, vi will wait forever when you start typing a map string, which can be most annoying if you actually want the string. this is also why J-P Radly put the ' on the end of his macros, because you rarely type wh'. When timeout is set vi will wait about one second after each character in a macro string before timing out and simply using the string as typed ALSO... >jpr@jpradley.jpr.com (Jean-Pierre Radley) writes: >>And these macros might be of interest to you: >>se nu ts=5 wm=0 sw=5 >>map! /* /* */hhi >>map! ca' case : break;k0f:i >>map! ei' else if () {}kk0f(a >>map! el' else {}ki >>map! if' if () {}k0f(a >>map! fo' for (;;) {}k0f(a >>map! wh' while () {}k0f(a >>map #0 :!cc % firstly: there is no reason to set ts=5, tabs are 8 characters by default on 99% of the machines that I have ever heard of, if you less or more your code you will get a nasty surprise. Instead, get used to using ^T and ^D to do your indenting and outdenting (!?) instead of tabs. vi will put tabs in for you where appropriate! secondly: I played with macros like these some time ago, but found them somewhat clumsy, I have now come up with a system of bracketing and jump points. by mapping an unused key to be my 'jump to next jump point' I can quickly nest any number of brackets, and jump around within them with a minimum of fuss. Here the we use backspace (^H) in-stead of del keys, so the del key is my jump key. I have defined a jump point as two tilde's ( ~~ ) as I have NEVER seen this string in any code or text thus far :-) --- cut here --- :set magic sw=4 ai " jump to next jump point :map ^? /\~\~^M2s :map! ^? ^[/\~\~^M2s :map! (( ( )~~^[3hi :map! () ()~~^[2hi :map! [[ [ ]~~^[3hi :map! [] []~~^[2hi :map! "" ""~~^[2hi :map! '' ''~~^[2hi " new block definition :map! }{ ^[A^M{^M}~~^[O^T :map! {{ { }~~^[3hi :map! {} {}~~^[2hi :map! (_ ( );~~^[4hi :map! (+ ( ~~ )}{~~^[?\~\~.*)^M2s :map! // /* ^I*/^[F a :map! *& /*^M */~~^[O* :map! *_ /*^M^M*/^[2ko^M :map! /- ^[0i/*-^[x76po^M^M*/~~^[kO^I " #include lines made easy :map! >< .h>^[Bi<`in^[A :map! >" .h"^[Bi"`in^[A " other # lines made easy :map! `if ^[0i#ifdef :map! `el ^[0i#else :map! `li ^[0i#elseif :map! `en ^[0i#endif :map! `in ^[0i#include :map! `de ^[0i#define :map! argcv argc, argv^[oint argc;^Mchar **argv;^[/\~\~^M2s --- cut here --- I will leave you to work out which ^'s are ^V's :-) one of the problems with these macros is that they tend to make cutting and pasting in Xwindows a little nasty at times, I know of one person who has put a ^U in front of the (( type macros to prevent this. hope these help your productivity catchya ====================================================================== Stephen Riehm [Romulis] s887212@minyos.xx.rmit.edu.au BKX Australia Phone: +61 3 889 0459 Fax: +61 3 889 3227 == Disclaimer: I claim no responsibility for my employer's actions. == From krisk@ux1.cso.uiuc.edu (Kris Klindworth) Newsgroups: comp.editors Subject: Re: vi question, replace second occurence Keywords: vi Date: 30 Oct 91 19:00:29 GMT Status: O (Johathan Chin ask me to post this followup for him. Evidently they are having problems with their news system. krisk@ux1.cso.uiuc.edu) In article <1991Oct24.162454.4759@ux1.cso.uiuc.edu> krisk@ux1.cso.uiuc.edu (Kris Klindworth) writes: >hess@rosun1.informatik.uni-hamburg.de (Hauke Hess) writes: > >>In the Jargonfile are many words enclosed in ", like the following sentence > >>the "slow" brown fox jumps over the "crazy" dog. > >>I want to change that sentence in: > >>the ``slow'' brown fox jumps over the ``crazy'' dog. > >>for the sake of typographical correctness. In other words: how do I replace >>each second occurence of a string with another, with not respect to lineends >>between the words? >>So a sentence like > >>there is a "problem >>extraordinaire" in here. > >>should be replaced as well. > >For this problem you can use >:%s/"\and >:%s/\>"/''/ Perhaps a better way is: :g/$/s/"\([^"]*\)"/``\1''/g which replaces all occurrences of "string" in the file. It does not touch strings that extend over line boundaries though. For that, you could look for the last " on a line, change it to ``, go to next occurrence of " and change to ''. Something like (untested): :1|s/"\([^"]*\)$/``\1/|s/^\([^"]*\)"/\1''/ which changes the first occurrence of the quoted string. Perhaps wrapping this in a global will work: :g/$/1|s/"\([^"]*\)$/``\1/|s/^\([^"]*\)"/\1''/ but I haven't tried it. Have fun, Jonathan Chin shrchin@uk.ac.rdg.susssys1 Department of Cybernetics, University of Reading, England. From asylvain@felix.UUCP (Alvin "the Chipmunk" Sylvain) Newsgroups: comp.editors Subject: Re: filling paragraph in vi Date: 30 Oct 91 21:17:12 GMT Status: O Written in article <754@skyking.UUCP> by jc@skyking.UUCP (J.C. Webber III): : In ckclark@athena.mit.edu : (Calvin Clark) writes: : : >Novice question: : : >How does one fill a paragraph in vi? : : It requires an external unix command (ie. fmt or mfold). : Many unix systems have a formating command called fmt. To use it : within vi you would position your curser on the first character of : the paragraph that you would like to format and then type "!}fmt" : (without the qoutes). If you desire more or less characters than : the default (72 I think), say 60, then you would type "!}fmt 60". Yours may work that way. Mine attempts to format a file named "60". Ah, here we go ... "!}fmt -60" seems to work. Never thot of that. Always wanted that feature, and could never get it to work. Oh well. : For those systems that do not have fmt, there is a public domain : program called mfold that does the job quite nicely. The only problem : I have with it (and I have to use it because I don't have fmt) is that : it drops one of the double spaces after the period between sentences. : I have to go back and put them back in by hand. If anyone has a fix : for this inconvience I would appreciate it. I have a "fix," but it's rather long. However, it has the additional features of automatically hyphenating long multi-syllabled words that almost fit, plus you can turn that off on demand, or, change the line length, indentation, etc., on demand. This makes two important assumptions, and they are: 1) You have "nroff" on your system, located in /usr/bin This is the powerhouse, the engine that drives the utility. This is what allows you to do damn near any kind of ASCII text formatting you'd want. 2) You have "lex" on your system. This gives you the auto-double-spaces after sentences. "nroff" doesn't do that, relying on the user to add these where needed. I guess that saves it from figuring out "Mr." etc. Well, all that's loaded into the "lex" source code provided below. If you do NOT have "lex", this can still work if you write a "pre_nroff" utility by hand. It's job in life is to guarantee that periods at the end of sentences have two spaces, something that "nroff" leaves to the user. Have it filter stdin to stdout. Of course, if you don't have "lex", you probably don't have "nroff" either. First, you copy this shell script and put it on your path somewhere. Call it "Nroff". It's contents are as follows: --------cut here--------Begin of Nroff-------- #!/bin/csh -f # start quicker by avoiding .cshrc # # Nroff: # This script allows me to use "nroff" to format paragraphs from "vi" # Written for the C-shell. # # Alvin "the Chipmunk" Sylvain if ( $#argv == 0 ) then # no arguments, use the default pre_nroff | /usr/bin/nroff -i ~/.Nroff.default else # construct a new defaults file from arguments cp ~/.Nroff.default ~/.Nroff.temp while ( $#argv > 0 ) # add new parms to specifications switch ( $1 ) # check for no-arg parms. case .nh: # no hyphenate case .nf: # no fill case .fi: # fill case .na: # no adjust (turn off right justification) case .ad: # adjust (turn on right justification) echo $1 >> ~/.Nroff.temp shift # advance to next parameter(s) breaksw case *: # all else is assumed to be 1-arg parms echo $1 $2 >> ~/.Nroff.temp shift # advance to next parameter(s) shift breaksw endsw end pre_nroff | /usr/bin/nroff -i ~/.Nroff.temp /bin/rm -f ~/.Nroff.temp endif --------cut here--------End of Nroff-------- Now, this uses a permanent datafile with defaults that instruct "nroff" on how to format a paragraph. They are stored in "$HOME/.Nroff.default", and the ones I've selected that suit me are: --------cut here--------Begin of $HOME/.Nroff.default-------- .na .pl 1 .ll 72 .hy 12 --------cut here--------End of $HOME/.Nroff.default-------- The "nroff" commands above are: .na - no adjust (turns off right justification) .pl 1 - page length of 1 (otherwise, it adds enough empty lines to fill a page) .ll 72 - line-length of 72 (obvious enough) .hy 12 - shoot, I forget how this works, but it controls how it hyphenates. RTFM. You can change these defaults, naturally, but I recommend you leave in the ".pl 1", otherwise, it will give you an entire page each time you use it to format a paragraph. That results in your paragraph followed by enough empty lines to make whatever the page size is. "pre_nroff" is a filter written in "lex" that makes certain, more or less, that the number of spaces after periods is correct. It repairs the complaint in J.C.Webber's article that prompted this whole thing. It also handles question marks, exclamation points, quotes, close parentheses, hyphens, and a few titles ("Mr.", "Dr."). It's contents are: --------cut here--------Begin of pre_nroff.lex-------- punct [\.\!\?] tbsp [\t ] tbspnl [\t \n] clsprn [\"\)\]\}] %% "-"{tbspnl}+ ; etc\." " printf ("etc. "); Dr\.{tbspnl}+ printf ("Dr. "); Mr\.{tbspnl}+ printf ("Mr. "); Mrs\.{tbspnl}+ printf ("Mrs. "); {punct}{tbsp}+ printf ("%c ", yytext [0]); {punct}{clsprn}{tbsp}+ printf ("%c%c ", yytext [0], yytext [1]); {tbsp}+ printf (" "); --------cut here--------End of pre_nroff.lex-------- My version appears to have a bug in handling an ellipis (...) so I left that line out of this version. As you can see, it also attempts to han- dle "Mr. Smith" correctly, but naturally will fail if "Mr." is the last word on the sentence. It also attempts to handles periods within quotes, so that, eg., "These are my words." will be treated as a sen- tence, with two spaces after the ending quote. The paragraph above was left exactly as processed by the pre_nroff/nroff combination, so you can see exactly where it works and where it fails. Apparently the period-quote combination overrides the "Mr." check, ie., it puts two spaces after the period despite the title. Well, it ain't perfect, obviously, and it certainly can't read your mind. It handles hyphens by eliminating them ONLY from the ends of lines. Ie., if the hyphen ends the line, it is removed and the word beginning the next line is glued to the word ending the current line. Within the line, they are ignored. This has an advantage and a disadvantage. The advantage is that if you modify the text such that the word no longer needs to be hyphenated, "pre_nroff" will glue the pieces back together again. "nroff" doesn't do this, assuming that you are using separate source and target files. The disadvantage is that words that are SUPPOSED to be hyphened, such as "mother-in-law," that "nroff" hap- pened to break at the line-end, will ALSO be glued back together. If you use such words, you have to watch out for them. To create the program "pre_nroff" from this "lex" source, perform the following: lex -t pre_nroff.lex > pre_nroff.c cc -o pre_nroff pre_nroff.c -ll USAGE: Don't forget to "chmod +x Nroff" in whichever directory you've placed it. You may also have to enter the "rehash" command before trying it. To run it from inside "vi", follow essentially the same instructions as for "fmt", ie., place your cursor at the beginning of the paragraph you wish to format. The paragraph is delimited by empty lines. Enter: !}Nroff and you'll get a more-or-less perfectly formatted paragraph, including hyphenation where needed. You may pass parameters to "Nroff" in the form of "nroff" dot-commands. For example, if you want a shorter line- length, as exemplified in this paragragh, specify the new line-length as follows: !}Nroff .ll 60 Any "nroff" command (that I can think of and have tested) can be used. The common ones with no arguments are handled, as you can see in the "Nroff" script above, and all others are assumed to have exactly one argument. You can not use any "nroff" dot-commands with more than one argument, altho in common "vi" use you shouldn't need any. For example, I have re-formatted one of my above paragraphs with right- justification, line-length 65, and indentation of 5. My version appears to have a bug in handling an ellipis (...) so I left that line out of this version. As you can see, it also attempts to handle "Mr. Smith" correctly, but naturally will fail if "Mr." is the last word on the sen- tence. It also attempts to handle periods within quotes, so that, eg., "These are my words." will be treated as a sen- tence, with two spaces after the ending quote. That was performed with the command: !}Nroff .ad .ll 65 .in 5 Notice: If you make changes to an indented paragraph like the one above, remove the indentations before re-running the "Nroff" command. This can be done by placing the cursor at the beginning of the paragraph, then entering "<}" until the paragraph is lined up on the left margin again. Otherwise, your results will be somewhat peculiar. I'm not sure why. CONCLUSION: Now, with all the discussions going back and forth about "vi's" ability or inability to handle formatting, and the FAQ about using "fmt" or some clone, I have quietly put this little package together for my own use, and it seems to work fine. This is the first time it's been published. If you try it, I'd appreciate feedback. Murphy's law being what it is, I'm almost 100% sure I left SOMEthing out, but we'll see. -- Alvin "the Chipmunk" Sylvain, alvin@stanton.cts.com, asylvain@felix.UUCP DISCLAIMER: It's all in fun, folks, no flames intended. IF you're real nice, I _might_ just let you have my opinion for free! OBLIGATORY QUOTE FOR THE DAY: You are afraid to eat your words. There is no need to be. I have eaten a great many of mine in my time and on the whole I have found them a most wholesome diet. -- Winston Churchill