Skip to content

Latest commit

 

History

History
1678 lines (1678 loc) · 71.1 KB

vi-original.man.md

File metadata and controls

1678 lines (1678 loc) · 71.1 KB

.bd S 3 .if t .ds dg (dg .if n .ds dg + .if t .ds dd (dd .if n .ds dd ++ .RP .TL An Introduction to Display Editing with Vi .AU William Joy*(dg .AI Computer Science Division Department of Electrical Engineering and Computer Science University of California, Berkeley Berkeley, Ca.  94720 .AB .PP .I Vi (visual) is a display oriented interactive text editor. When using .I vi the screen of your terminal acts as a window into the file which you are editing.  Changes which you make to the file are reflected in what you see. .PP Using .I vi you can insert new text any place in the file quite easily. Most of the commands to .I vi move the cursor around in the file. There are commands to move the cursor forward and backward in units of characters, words, sentences and paragraphs. A small set of operators, like .B d for delete and .B c for change, are combined with the motion commands to form operations such as delete word or delete paragraph, in a simple and natural way. This regularity and the mnemonic assignment of commands to keys makes the editor command set easy to remember and to use. .PP .I Vi will work on a large number of display terminals, and new terminals are easily driven after editing a terminal description file. While it is advantageous to have an intelligent terminal which can locally insert and delete lines and characters from the display, the editor will function quite well on dumb terminals over slow phone lines. The editor makes allowance for the low bandwidth in these situations and uses smaller window sizes and different display updating algorithms to make best use of the limited speed available. .PP It is also possible to use the command set of .I vi on hardcopy terminals, storage tubes and ``glass tty's'' using a one line editing window; thus .I vi's command set is available on all terminals. On large machines, the full command set of the more traditional, line oriented editor .I ex is available within .I vi; it is quite simple to switch between the two modes of editing. .AE .NH 1 Getting started .PP .FS *(dg The financial support of an \s-2IBM\s0 Graduate Fellowship and the National Science Foundation under grants MCS74-07644-A03 and MCS78-07291 is gratefully acknowledged. .FE This manual provides a quick introduction to .I vi. You should be running .I vi on a file you are familiar with while you are reading this. The first part of this document (sections 1 through 5) describes the basics of using .I vi. Some topics of special interest are presented in section 6, and some nitty-gritty details of how the editor functions are saved for section 7 to avoid cluttering the presentation here. .PP There is also a short appendix here, which gives for each character the special meanings which this character has in \fIvi\fR.  Attached to this document should be a quick reference card. This card summarizes the commands of .I vi in a very compact format.  You should have the card handy while you are learning .I vi. .NH 2 Specifying terminal type .PP Before you can start .I vi you must tell the system what kind of terminal you are using. Here is a (necessarily incomplete) list of terminal type codes. If your terminal does not appear here, you should consult with one of the staff members on your system to find out the code for your terminal. If your terminal does not have a code, one can be assigned and a description for the terminal can be created. .LP .TS center; ab ab ab a a a. Code     Full name     Type _ 2621     Hewlett-Packard 2621A/P     Intelligent 2645     Hewlett-Packard 264x     Intelligent act4     Microterm ACT-IV     Dumb act5     Microterm ACT-V     Dumb adm3a     Lear Siegler ADM-3a     Dumb adm31     Lear Siegler ADM-31     Intelligent c100     Human Design Concept 100     Intelligent dm1520     Datamedia 1520     Dumb dm2500     Datamedia 2500     Intelligent dm3025     Datamedia 3025     Intelligent fox     Perkin-Elmer Fox     Dumb h1500     Hazeltine 1500     Intelligent h1510     Hazeltine 1510     Intelligent i100     Infoton 100     Intelligent mime     Imitating a smart act5     Intelligent owl     Perkin-Elmer Owl     Intelligent t1061     Teleray 1061     Intelligent vt52     Dec VT-52     Dumb .TE .PP Assume for the time being that you have a Hewlett-Packard HP2621A terminal.  The code used by the system for this terminal is `2621'. In this case you can use one of the following commands to tell the system the type of your terminal: .DS % \fBsetenv TERM\fP 2621 .DE This command works with the shell .I csh on both version 6 and 7 systems. If you are using the standard version 7 shell then you should give the command .DS $ \fBTERM=\fP2621 .DE .PP The editor command set is independent of the terminal you are using.  On some terminals with cursor positioning keys, these keys will also work within the editor.* .FS

  • The current version of the editor does not support the use of cursor keys if these keys send multi-character codes. .FE This works, for instance, on the .I dm1520. On the .I adm3a, the \fBh j k\fR and \fBl\fR keys work as cursor positioning keys (these are labelled with arrows). .NH 2 Editing a file .PP After telling the system which kind of terminal you have, you should make a copy of a file you are familiar with, and run .I vi on this file, giving the command .DS % \fBvi\fR \fIname\fR .DE replacing \fIname\fR with the name of the copy file you just created. The screen should clear and the text of your file should appear on the screen.  If something else happens refer to the footnote.*(dg .FS *(dg If you gave the system an incorrect terminal type code then the editor may have just made a mess out of your screen.  This happens when it sends control codes for one kind of terminal to some other kind of terminal.  In this case hit the keys \fB:q\fR (colon and the q key) and then hit the \s-2RETURN\s0 key. This should get you back to the command level interpreter. Figure out what you did wrong (ask someone else if necessary) and try again.      Another thing which can go wrong is that you typed the wrong file name and the editor just printed an error diagnostic.  In this case you should follow the above procedure for getting out of the editor, and try again this time spelling the file name correctly.      If the editor doesn't seem to respond to the commands which you type here, try sending an interrupt to it by hitting the \s-2DEL\s0 or \s-2RUB\s0 key on your terminal, and then hitting the \fB:q\fR command again followed by a carriage return. .sp .FE .NH 2 The editor's copy: the buffer .PP The editor does not directly modify the file which you are editing. Rather, the editor makes a copy of this file, in a place called the .I buffer, and remembers the file's name.  You do not affect the contents of the file unless and until you write the changes you make back into the original file. .NH 2 Notational conventions .PP In our examples, input which must be typed as is will be presented in \fBbold face\fR. Text which should be replaced with appropriate input will be given in \fIitalics\fR.  We will represent special characters in \s-2SMALL CAPITALS\s0. .NH 2 Special characters: \s-2ESC\s0 and \s-2DEL\s0 .PP Several of these special characters are very important, so be sure to find them right now.  Look on your keyboard for a key labelled \s-2ESC\s0 or \s-2ALT\s0.  It should be near the upper left corner of your terminal. Try hitting this key a few times.  The editor will ring the bell to indicate that it is in a quiescent state.*(dd .FS *(dd On smart terminals where it is possible, the editor will quietly flash the screen rather than ringing the bell. .FE Partially formed commands are cancelled by \s-2ESC\s0, and when you insert text in the file you end the text insertion with \s-2ESC\s0.  This key is a fairly harmless one to hit, so you can just hit it if you don't know what is going on until the editor rings the bell. .PP Another very useful key is the \s-2DEL\s0 or \s-2RUB\s0 key, which generates an interrupt, telling the editor to stop what it is doing. It is a forceful way of making the editor listen to you, or to return it to the quiescent state if you don't know or don't like what is going on.  Try hitting the /' key on your terminal.  This key is used when you want to specify a string to be searched for.  The cursor should now be positioned at the bottom line of the terminal after a /' printed as a prompt.  You can get the cursor back to the current position by hitting the \s-2DEL\s0 or \s-2RUB\s0 key; try this now. From now on we will simply refer to hitting the \s-2DEL\s0 or \s-2RUB\s0 key as ``sending an interrupt.''* .FS
  • On some systems, this interruptibility comes at a price: you cannot type ahead when the editor is computing with the cursor on the bottom line. .FE .PP The editor often echoes your commands on the last line of the terminal. If the cursor is on the first position of this last line, then the editor is performing a computation, such as computing a new position in the file after a search or running a command to reformat part of the buffer. When this is happening you can stop the editor by sending an interrupt. .NH 2 Getting out of the editor .PP After you have worked with this introduction for a while, and you wish to do something else, you can give the command \fB:wq\fR\s-2ESC\s0 to the editor.*(dg .FS *(dg All commands which read from the last display line can also be terminated with a \s-2RETURN\s0 as well as an \s-2ESC\s0. .FE This will write the contents of the editor's buffer back into the file you are editing, saving your changes, and then quitting from the editor.  You can also end an editor session by giving the command \fB:q!\fR\s-2ESC\s0; this is a dangerous but occasionally essential command which ends the editor session and discards all your changes. You need to know about this command in case you change the editor's copy of a file you wish only to look at.  Be very careful not to give this command when you really want to save the changes you have made. .NH 1 Moving around in the file .NH 2 Scrolling and paging .PP The editor has a number of commands for moving around in the file. The most useful of these is generated by hitting the control and D keys at the same time, a control-D or ^D'.  We will use this two character notation for referring to these control keys from now on.  You may have a key labelled ^' on your terminal.  This key will be represented as \(ua' in this document; ^' is exclusively used as part of the ^x' notation for control characters.\*(dd .FS \*(dd If you don't have a ^' key on your terminal then there is probably a key labelled \(ua'; in any case these characters are one and the same. .FE .PP As you know now if you tried hitting \fB^D\fR, this command scrolls down in the file.  The \fBD\fR thus stands for down.  Many editor commands are mnemonic and this makes them much easier to remember.  For instance the command to scroll up is \fB^U\fR.  Many dumb terminals can't scroll up at all, in which case hitting \fB^U\fR clears the screen and refreshes it with a line which is farther back in the file at the top. .PP There are other ways to move around in the file; the keys \fB^F\fR and \fB^B\fR move forward and backward a page, keeping a couple of lines of continuity between screens so that it is possible to read through a file using these rather than \fB^D\fR and \fB^U\fR if you wish. .PP Notice the difference between scrolling and paging.  If you are trying to read the text in a file, hitting \fB^F\fR to move forwarda a page will leave you only a little context to look back at.  Scrolling on the other hand leaves more context, and happens more smoothly.  You can continue to read the text as scrolling is taking place. .NH 2 Searching, goto, and previous context .PP Another way to position yourself in the file is by giving the editor a string to search for.  Type the character \fB/\fR followed by a string of characters terminated by \s-2ESC\s0.  The editor will position the cursor at the first occurrence of this string on a line after the current line. Try hitting \fBn\fR to go to the next line with an occurrence of this string. The character \fB?\fR will search backwards from where you are, and is otherwise like \fB/\fR.\*(dg .FS \*(dg These searches will normally wrap around the end of the file, and thus find the string even if it is not on a line in the direction you search provided it is anywhere else in the file.  You can disable this wraparound in scans by giving the command \fB:se nowrapscan\fR\s-2ESC\s0, or more briefly \fB:se nows\fR\s-2ESC\s0. .FE .PP If the search string you give the editor is not present in the file the editor will print a diagnostic on the last line of the screen, and the cursor will be returned to its initial position. .PP If you wish the search to match only at the beginning of a line, begin the search string with an \fB\(ua\fR.  To match only at the end of a line, end the search string with a \fB$\fR. Thus \fB/\(uasearch\fR\s-2ESC\s0 will search for the word search' at the beginning of a line, and \fB/last$\fR\s-2ESC\s0 searches for the word last' at the end of a line. .PP The command \fBG\fR, when preceded by a number will position the cursor at that line in the file. Thus \fB1G\fR will move the cursor to the first line of the file.  If you give \fBG\fR no count, then it moves to the end of the file. .PP If you are near the end of the file, and the last line is not at the bottom of the screen, the editor will place only the character ~' on each remaining line.  This indicates that the last line in the file is on the screen; that is, the ~' lines are past the end of the file. .PP You can find out the state of the file you are editing by typing a \fB^G\fR. The editor will show you the name of the file you are editing, the number of the current line, the number of lines in the buffer, and the percentage of the way through the buffer which you are. Try doing this now, and remember the number of the line you are on. Give a \fBG\fR command to get to the end and then another \fBG\fR command to get back where you were. .PP You can also get back to a previous position by using the command \fB\(ga\(ga\fR (two back quotes). This is often more convenient than \fBG\fR because it requires no advance preparation. Try giving a \fBG\fR or a search with \fB/\fR or \fB?\fR and then a \fB\(ga\(ga\fR to get back to where you were.  If you accidentally hit \fBn\fR or any command which moves you far away from a context of interest, you can quickly get back by hitting \fB\(ga\(ga\fR. .NH 2 Moving around on the screen .PP Now try just moving the cursor around on the screen. Hit the \fB+\fR key.  Each time you do, notice that the cursor advances to the next line in the file, at the first non-white position on the line.  The \fB\-\fR key is like \fB+\fR but goes the other way. .PP These are very common keys for moving up and down lines in the file. Notice that if you go off the bottom or top with these keys then the screen will scroll down (and up if possible) to bring a line at a time into view.  The \s-2RETURN\s0 key has the same effect as the \fB+\fR key. .PP .I Vi also has commands to take you to the top, middle and bottom of the screen. \fBH\fR will take you to the top (home) line on the screen. Try preceding it with a number as in \fB3H\fR. This will take you to the third line on the screen. Many .I vi commands take preceding numbers and do interesting things with them. Try \fBM\fR, which takes you to the middle line on the screen, and \fBL\fR, which takes you to the last line on the screen. \fBL\fR also takes counts, thus \fB5L\fR will take you to the fifth line from the bottom. .PP .I Vi also has commands which take you to the next or previous line in the same horizontal position (column) as the one you start in. Try \fB^N\fP to move to the next line in the same column, \fB^P\fP to move to the previous line in the same column. .NH 2 Moving within a line .PP Now try picking a word on some line on the screen, not the first word on the line. move the cursor using \s-2RETURN\s0 and \fB\-\fR to be on the line where the word is. Try hitting the \fBw\fR key.  This will advance the cursor to the next word on the line. Try hitting the \fBb\fR key to back up words in the line. Also try the \fBe\fR key which advances you to the end of the current word rather than to the beginning of the next word. Also try \s-2SPACE\s0 (the space bar) which moves right one character and the \s-2BS\s0 (backspace or \fB^H\fR) key which moves left one character. The key \fBh\fR works as \fB^H\fR does and is useful if you don't have a \s-2BS\s0 key. .PP If the line had punctuation in it you may have noticed that that the \fBw\fR and \fBb\fR keys stopped at each group of punctuation.  You can also go back and forwards words without stopping at punctuation by using \fBW\fR and \fBB\fR rather than the lower case equivalents.  Think of these as bigger words. Try these on a few lines with punctuation to see how they differ from the lower case \fBw\fR and \fBb\fR. .PP The word keys never move off the end of the line, but rather stop at the end.  You can get easily to the beginning of the next line by doing a \s-2RETURN\s0 at the end of the current line. To get to the end of the previous line type \fB\-$\fR. .NH 2 Summary .IP .TS lw(.50i)b a. \fR\s-2SPACE\s0\fP     advance the cursor one position ^B     backwards to previous page ^D     scrolls down in the file ^F     forward to next page ^G     tell what is going on ^H     backspace the cursor ^N     next line, same column ^P     previous line, same column +     next line, at the beginning \-     previous line, at the beginning /     scan for a following string forwards ?     scan backwards B     back a word, ignoring punctuation G     go to specified line, last default H     home screen line M     middle screen line L     last screen line W     forward a word, ignoring punctuation b     back a word e     end of current word n     scan for next instance of \fB/\fR or \fB?\fR pattern w     word after this word .TE .NH 1 Making simple changes .NH 2 Inserting .PP One of the most useful commands is the \fBi\fR (insert) command. After you type \fBi\fR, everything you type until you hit \s-2ESC\s0 is inserted into the file. Try this now; position yourself to some word in the file and try inserting text before this word. If you are on an dumb terminal it will seem, for a minute, that some of the characters in your line have been overwritten, but they will reappear when you hit \s-2ESC\s0. .PP Now try finding a word which can, but does not, end in an s'. Position yourself at this word and type \fBe\fR (move to end of word), then \fBa\fR for append and then s\s-2ESC\s0' to terminate the textual insert. This sequence of commands can be used to easily pluralize a word. .PP Try inserting and appending a few times to make sure you understand how this works; \fBi\fR placing text to the left of the cursor, \fBa\fR to the right. .PP It is often the case that you want to add new lines to the file you are editing, before or after some specific line in the file.  Find a line where this makes sense and then give the command \fBo\fR to create a new line after the line you are on, or the command \fBO\fR to create a new line before the line you are on.  After you create a new line in this way, text you type up to an \s-2ESC\s0 is inserted on the new line. .PP Many related editor commands are invoked by the same letter key and differ only in that one is given by a lower case key and the other is given by an upper case key.  In these cases, the upper case key often differs from the lower case key in its sense of direction, with the upper case key working backward and/or up, while the lower case key moves forward and/or down. .PP Whenever you are typing in text, you can give many lines of input or just a few characters. To type in more than one line of text, hit a \s-2RETURN\s0 at the middle of your input.  A new line will be created for text, and you can continue to type.  If you are on a slow and dumb terminal the editor may choose to wait to redraw the tail of the screen, and will let you type over the existing screen lines. This avoids the lengthy delay which would occur if the editor attempted to keep the tail of the screen always up to date.  The tail of the screen will be fixed up, and the missing lines will reappear, when you hit \s-2ESC\s0. .PP While you are inserting new text, you can use the characters you normally use at the system command level (usually \fB^H\fR or \fB#\fR) to backspace over the last character which you typed, and the character which you use to kill input lines (usually \fB@\fR or \fB^X\fR) to erase the input you have typed on the current line.\*(dg .FS \*(dg In fact, the character \fB^H\fR (backspace) always works to erase the last input character here, regardless of what your erase character is. .FE The character \fB^W\fR will erase a whole word and leave you after the space after the previous word; it is useful for quickly backing up in an insert. .PP Notice that when you backspace during an insertion the characters you backspace over are not erased; the cursor moves backwards, and the characters remain on the display.  This is often useful if you are planning to type in something similar.  In any case the characters disappear when when you hit \s-2ESC\s0; if you want to get rid of them immediately, hit an \s-2ESC\s0 and then \fBa\fR again. .PP Notice also that you can't erase characters which you didn't insert, and that you can't backspace around the end of a line.  If you need to back up to the previous line to make a correction, just hit \s-2ESC\s0 and move the cursor back to the previous line.  After making the correction you can return to where you were and use the insert or append command again. .NH 2 Making small corrections .PP You can make small corrections in existing text quite easily. Find a single character which is wrong or just pick any character. Get near the character with the word motion keys and then either backspace (hit the \s-2BS\s0 key or \fB^H\fR or even just \fBh\fR) or \s-2SPACE\s0 (using the space bar) until the cursor is on the character which is wrong. If the character is not needed then hit the \fBx\fP key; this deletes the character from the file.  It is analogous to the way you \fBx\fP out characters when you make mistakes on a typewriter (except it's not as messy). .PP If the character is incorrect, you can replace it with the correct character by giving the command \fBr\fR\fIc\fR, where \fIc\fR is replaced by the correct character. Finally if the character which is incorrect should be replaced by more than one character, give the command \fBs\fR which substitutes a string of characters, ending with \s-2ESC\s0, for it. If there are a small number of characters which are wrong you can precede \fBs\fR with a count of the number of characters to be replaced.  Counts are also useful with \fBx\fR to specify the number of characters to be deleted. .NH 2 More corrections: operators .PP You already know almost enough to make changes at a higher level. All you need to know now is that the .B d key acts as a delete operator.  Try the command .B dw to delete a word. Try hitting \fB.\fR a few times.  Notice that this repeats the effect of the \fBdw\fR.  The command \fB.\fR repeats the last command which made a change.  You can remember it by analogy with an ellipsis \fB...\fR'. .PP Now try \fBdb\fR. This deletes a word backwards, namely the preceding word. Try \fBd\fR\s-2SPACE\s0.  This deletes a single character, and is equivalent to the \fBx\fR command. .PP Another very useful operator is .B c or change.  The command .B cw thus changes the text of a single word. You follow it by the replacement text ending with an \s-2ESC\s0. Find a word which you can change to another, and try this now. Notice that the end of the text to be changed was marked with the character `$' so that you can see this as you are typing in the new material. .NH 2 Operating on lines .PP It is often the case that you want to operate on lines. Find a line which you want to delete, and type \fBdd\fR, the .B d operator twice.  This will delete the line. If you are on a dumb terminal, the editor may just erase the line on the screen, replacing it with a line with only an @ on it.  This line does not correspond to any line in your file, but only acts as a place holder.  It helps to avoid a lengthy redraw of the rest of the screen which would be necessary to close up the hole created by the deletion on a terminal without a delete line capability. .PP Try repeating the .B c operator twice; this will change a whole line, erasing its previous contents and replacing them with text you type up to an \s-2ESC\s0.*(dg .FS *(dg The command \fBS\fR is a convenient synonym for for \fBcc\fR, by analogy with \fBS\fR.  Think of \fBS\fR as a substitute on lines, while \fBs\fR is a substitute on characters. .FE .PP You can delete or change more than one line by preceding the .B dd or .B cc with a count, i.e. \fB5dd\fR deletes 5 lines. You can also give a command like \fBdL\fR to delete all the lines upto and including the last line on the screen, or \fBd3L\fR to delete through the third from the bottom line.  Try some commands like this now. Notice that the editor lets you know when you change a large number of lines so that you can see the extent of the change. The editor will also always tell you when a change you make affects text which you cannot see. .NH 2 Undoing .PP Now suppose that the last change which you made was incorrect; you could use the insert, delete and append commands to put the correct material back.  However, since it is often the case that we regret a change or make a change incorrectly, the editor provides a .B u (undo) command to reverse the last change which you made. Try this a few times, and give it twice in a row to notice that an .B u also undoes a .B u. .PP The undo command lets you reverse only a single change.  After you make a number of changes to a line, you may decide that you would rather have the original state of the line back.  The .B U command restores the current line to the state before you started changing it. .PP You can recover text which you delete, even if undo will not bring it back; see the section on recovering lost text below. .NH 2 Summary .IP .TS lw(.50i)b a. \fR\s-2SPACE\s0\fP     advance the cursor one position ^H     backspace the cursor ^W     erase a word during an insert \fRerase\fP     your erase (usually ^H or #), erases a character during an insert \fRkill\fP     your kill (usually @ or ^X), kills the insert on this line &\fB.\fP     repeats the changing command O     opens and inputs new lines, above the current U     undoes the changes you made to the current line a     appends text after the cursor c     changes the object you specify to the following text d     deletes the object you specify i     inserts text before the cursor o     opens and inputs new lines, below the current u     undoes the last change .TE .NH 1 Moving about; rearranging and duplicating text .NH 2 Low level character motions .PP Now move the cursor to a line where there is a punctuation or a bracketing character such as a parenthesis or a comma or period.  Try the command \fBf\fR\fIx\fR where \fIx\fR is this character.  This command finds the next \fIx\fR character to the right of the cursor in the current line.  Try then hitting a \fB;\fR, which finds the next instance of the same character.  By using the \fBf\fR command and then a sequence of \fB;\fR's you can often get to a particular place in a line much faster than with a sequence of word motions or \s-2SPACE\s0s. There is also a \fBF\fR command, which is like \fBf\fR, but searches backward.  The \fB;\fR command repeats \fBF\fR also. .PP When you are operating on the text in a line it is often desirable to deal with the characters up to, but not including, the first instance of a character.  Try \fBdf\fR\fIx\fR for some \fIx\fR now and notice that the \fIx\fR character is deleted.  Undo this with \fBu\fR and then try \fBdt\fR\fIx\fR;  the \fBt\fR here stands for to, i.e. delete up to the next \fIx\fR, but not the \fIx\fR.  The command \fBT\fR is the reverse of \fBt\fR. .PP When working with the text of a single line, an \fB(ua\fR moves the cursor to the first non-white position on the line, and a \fB$\fR moves it to the end of the line.  Thus \fB$a\fR will append new text at the end of the current line. .PP Your file may have tab (\fB^I\fR) characters in it.  These characters are represented as a number of spaces expanding to a tab stop, where tab stops are every 8 positions.* .FS
  • This is settable by a command of the form \fB:se ts=\fR\fIx\fR\s-2ESC\s0, where \fIx\fR is 4 to set tabstops every four columns.  This has effect on the screen representation within the editor. .FE When the cursor is at a tab, it sits on the last of the several spaces which represent that tab.  Try moving the cursor back and forth over tabs so you understand how this works. .PP On rare occasions, your file may have nonprinting characters in it. These characters are displayed in the same way they are represented in this document, that is with a two character code, the first character of which is ^'.  On the screen non-printing characters resemble a ^' character adjacent to another, but spacing or backspacing over the character will reveal that the two characters are, like the spaces representing a tab character, a single character. .PP The editor normally discards control characters if you attempt to insert them in your file.  You can get a control character in the file by beginning an insert and then typing a \fB^Q\fR before the control character.  The \fB^Q\fR quotes the following character, causing it to be inserted directly into the file. .PP .NH 2 Higher level text objects .PP In working with a document it is often advantageous to work in terms of sentences, paragraphs, and sections.  The operations \fB(\fR and \fB)\fR move to the beginning of the previous and next sentences respectively. Thus the command \fBd)\fR will delete the rest of the current sentence; likewise \fBd(\fR will delete the previous sentence if you are at the beginning of the current sentence, or the current sentence up to where you are if you are not at the beginning of the current sentence. .PP A sentence is defined to end at a .', !' or ?' which is followed by either the end of a line, or by two spaces.  Any number of closing )', ]', "' and \(aa' characters may appear after the .', !' or ?' before the spaces or end of line. .PP The operations \fB{\fR and \fB}\fR move over paragraphs and the operations \fB[[\fR and \fB]]\fR move over sections.*(dg .FS *(dg The \fB[[\fR and \fB]]\fR operations require the operation character to be doubled because they can move the cursor far from where it currently is.  While it is easy to get back with the command \fB(ga(ga\fP. these would be frustrating if it was easy to hit them accidentally. .FE .PP A paragraph begins after each empty line, and also at each of a set of paragraph macros, specified by the pairs of characters in the definition of the string valued option \fIparagraphs\fR. The default setting for this option defines the paragraph macros of the \fI-ms\fR macro package, i.e. the .IP', .LP', .PP' and .QP' macros.*(dd .FS *(dd You can easily change or extend this set of macros by assigning a different string to the \fIparagraphs\fR option in your .exrc' file. See section 6.2 for details. The .bp' directive is also considered to start a paragraph. .FE Each paragraph boundary is also a sentence boundary.  The sentence and paragraph commands can be given counts to operate over groups of sentences and paragraphs. .PP Sections in the editor begin after each macro in the \fIsections\fR option, normally .NH' and .SH', and each line with a formfeed \fB^L\fR in the first column. Section boundaries are always line and paragraph boundaries also. .PP Try experimenting with the sentence and paragraph commands until you are sure how they work.  If you have a large document, try looking through it using the section commands. The section commands interpret a preceding count as a different window size in which to redraw the screen at the new location, and this window size is the base size for newly drawn windows until another size is specified. This is very useful if you are on a slow terminal and are looking for a particular section. You can give the first section command a small count to then see each successive section heading in a small window. .NH 2 Rearranging and duplicating text .PP The editor has a single unnamed buffer where the last deleted or changed away text is saved, and a set of named buffers \fBa\fR-\fBz\fR which you can use to save copies of text and to move text around in your file and between files. .PP The operator .B y yanks a copy of the object which follows into the unnamed buffer. If preceded by a buffer name, \fB"\fR\fIx\fR|\fBy\fR, where \fIx\fR here is replaced by a letter \fBa-z\fR, it places the text in the named buffer.  The text can then be put back in the file with the commands .B p and .B P; \fBp\fR puts the text after or below the cursor, while \fBP\fR puts the text before or above the cursor. .PP If the text which you yank forms a part of a line, or is an object such as a sentence which partially spans more than one line, then when you put the text back, it will be placed after the cursor (or before if you use \fBP\fR).  If the yanked text forms whole lines, they will be put back as whole lines, without changing the current line.  In this case, the put acts much like a \fBo\fR or \fBO\fR command. .PP Try the command \fBYP\fR.  This makes a copy of the current line and leaves you on this copy, which is placed before the current line. The command \fBY\fR is a convenient abbreviation for \fByy\fR. The command \fBYp\fR will also make a copy of the current line, and place it after the current line.  You can give \fBY\fR a count of lines to yank, and thus duplicate several lines; try \fB3YP\fR. .PP To move text within the buffer, you need to delete it in one place, and put it back in another.  You can precede a delete operation by the name of a buffer in which the text is to be stored as in \fB"a5dd\fR deleting 5 lines into the named buffer \fIa\fR.  You can then move the cursor to the eventual resting place of the these lines and do a \fB"ap\fR or \fB"aP\fR to put them back. In fact, you can switch and edit another file before you put the lines back, by giving a command of the form \fB:e \fR\fIname\fR\s-2ESC\s0 where \fIname\fR is the name of the other file you want to edit.  You will have to write back the contents of the current editor buffer (or discard them) if you have made changes before the editor will let you switch to the other file. .NH 2 Summary. .IP .TS lw(.50i)b a. (ua     first non-white on line $     end of line )     forward sentence }     forward paragraph ]]     forward section (     backward sentence {     backward paragraph [[     backward section f\fIx\fR     find \fIx\fR forward in line p     put text back, after cursor or below current line y     yank operator, for copies and moves t\fIx\fR     upto \fIx\fR forward, for operators F\fIx\fR     f backward in line P     put text back, before cursor or above current line T\fIx\fR     t backward in line .TE .NH 1 High level commands .NH 2 Writing, quitting, editing new files .PP So far we have seen how to enter .I vi and to write out our file using either \fB:wq\fR\s-2ESC\s0 or \fB:w\fR\s-2ESC\s0. The first writes and quits from the editor, the second writes and stays in the editor. .PP If you have changed the editor's copy of the file but do not wish to save your changes, either because you messed up the file or decided that the changes are not an improvement to the file, then you can give the command \fB:q!\fR\s-2ESC\s0 to quit from the editor without writing the changes. You can also reedit the same file (starting over) by giving the command \fB:e!\fR\s-2ESC\s0.  These commands should be used only rarely, and with caution, as it is not possible to recover the changes you have made after you discard them in this manner. .PP You can edit a different file without leaving the editor by giving the command \fB:e\fR\ \fIname\fR\s-2ESC\s0.  If you have not written out your file before you try to do this, then the editor will tell you this, and delay editing the other file.  You can then give the command \fB:w\fR\s-2ESC\s0 to save your work and then the \fB:e\fR\ \fIname\fR\s-2ESC\s0 command again, or carefully give the command \fB:e!\fR\ \fIname\fR\s-2ESC\s0, which edits the other file discarding the changes you have made to the current file. .NH 2 Escaping to a shell .PP You can get to a shell to execute a single command by giving a .I vi command of the form \fB:!\fIcmd\fR\s-2ESC\s0. The system will run the single command .I cmd and when the command finishes, the editor will ask you to hit a \s-2RETURN\s0 to continue.  When you have finished looking at the output on the screen, you should hit \s-2RETURN\s0 and the editor will clear the screen and redraw it.  You can then continue editing. You can also give another \fB:\fR command when it asks you for a \s-2RETURN\s0; in this case the screen will not be redrawn. .PP If you wish to execute more than one command in the shell, then you can give the command \fB:sh\fR\s-2ESC\s0. This will give you a new shell, and when you finish with the shell, ending it by typing a \fB^D\fR, the editor will clear the screen and continue. .NH 2 Marking and returning .PP The command \fB(ga(ga\fR returned to the previous place after a motion of the cursor by a command such as \fB/\fR, \fB?\fR or \fBG\fR.  You can also mark lines in the file with single letter tags and return to these marks later by naming the tags.  Try marking the current line with the command \fBm\fR\fIx\fR, where you should pick some letter for \fIx\fR, say a'.  Then move the cursor to a different line (any way you like) and hit \fB\(gaa\fR.  The cursor will return to the place which you marked. Marks last only until you edit another file. .PP When using operators such as .B d and referring to marked lines, it is often desirable to delete whole lines rather than deleting to the exact position in the line marked by \fBm\fR. In this case you can use the form \fB\(aa\fR\fIx\fR rather than \fB\(ga\fR\fIx\fR.  Used without an operator, \fB\(aa\fR\fIx\fR will move to the first non-white character of the marked line; similarly \fB\(aa\(aa\fR moves to the first non-white character of the line containing the previous context mark \fB\(ga\(ga\fR. .NH 2 Adjusting the screen .PP If the screen image is messed up because of a transmission error to your terminal, or because some program other than the editor wrote output to your terminal, you can hit a \fB^L\fR, the \s-2ASCII\s0 form-feed character, to cause the screen to be refreshed. .PP On a dumb terminal, if there are @ lines in the middle of the screen as a result of line deletion, you may get rid of these lines by typing \fB^R\fR to cause the editor to retype the screen, closing up these holes. .PP Finally, if you wish to place a certain line on the screen at the top middle or bottom of the screen, you can position the cursor to that line, and then give a \fBz\fR command. You should follow the \fBz\fR command with a \s-2RETURN\s0 if you want the line to appear at the top of the window, a \fB.\fR if you want it at the center, or a \fB\-\fR if you want it at the bottom. .NH 1 Special topics .NH 2 Editing on slow terminals .PP When you are on a slow terminal, it is important to limit the amount of output which is generated to your screen so that you will not suffer long delays, waiting for the screen to be refreshed.  We have already pointed out how the editor optimizes the updating of the screen during insertions on dumb terminals to limit the delays, and how the editor erases lines to @ when they are deleted on dumb terminals. .PP The use of the slow terminal insertion mode is controlled by the .I slowopen option.  You can force the editor to use this mode even on faster terminals by giving the command \fB:se slow\fR\s-2ESC\s0.  If your system is sluggish this helps lessen the amount of output coming to your terminal. You can disable this option by \fB:se noslow\fR\s-2ESC\s0. .PP The editor can simulate an intelligent terminal on a dumb one.  Try giving the command \fB:se redraw\fR\s-2ESC\s0.  This simulation generates a great deal of output and is generally tolerable only on lightly loaded systems and fast terminals.  You can disable this by giving the command \fB:se noredraw\fR\s-2ESC\s0. .PP The editor also makes editing more pleasant at low speed by starting editing in a small window, and letting the window expand as you edit. This works particularly well on intelligent terminals.  The editor can expand the window easily when you insert in the middle of the screen on these terminals.  If possible, try the editor on an intelligent terminal to see how this works. .PP You can control the size of the window which is redrawn each time the screen is cleared by giving window sizes as argument to the commands which cause large screen motions: .DS .B ":  /  ?  [[  ]]  ^F  ^B  \(ga  \(aa" .DE Thus if you are searching for a particular instance of a common string in a file you can precede the first search command by a small number, say 3, and the editor will draw three line windows around each instance of the string which it locates. .PP You can easily expand or contract the window, placing the current line as you choose, by giving a number on a \fBz\fR command, after the \fBz\fR and before the following \s-2RETURN\s0, \fB.\fR or \fB\-\fR.  Thus the command \fBz5.\fR redraws the screen with the current line in the center of a five line window.\*(dg .FS \*(dg Note that the command \fB5z.\fR has an entirely different effect, placing line 5 in the center of a new window. .FE .PP If the editor is redrawing or otherwise updating large portions of the display, you can interrupt this updating by hitting a \s-2DEL\s0 or \s-2RUB\s0 as usual.  If you do this you may partially confuse the editor about what is displayed on the screen.  You can still edit the text on the screen if you wish; clear up the confusion by hitting a \fB^L\fR; or move or search again, ignoring the current state of the display. .PP See section 7.8 on \fIopen\fR mode for another way to use the .I vi command set on slow terminals. .NH 2 Options, set, and editor startup files .PP The editor has a set of options, some of which have been mentioned above. The most useful options are given in the following table. .KF .TS lb lb lb lb l l l a. Name     Default     Description _ autoindent     noai     Supply indentation automatically beautify     bf     Discard nonprinting characters in inserts ignorecase     noic     Ignore case in searching lisp     nolisp     \fB( { ) }\fR commands deal with S-expressions list     nolist     Tabs print as ^I; end of lines marked with $ magic     nomagic     The characters . [ and * are special in scans number     nonu     Lines are displayed prefixed with line numbers paragraphs     para=IPLPPPQPbp     Macro names which start paragraphs redraw     nore     Simulate a smart terminal on a dumb one sections     sect=NHSH     Macro names which start new sections shiftwidth     sw=8     Shift distance for <, > and input \fB^D\fP and \fB^T\fR showmatch     nosm     Show matching \fB(\fP or \fB{\fP as \fB)\fP or \fB}\fR is typed slowopen     slow     Postpone display updates during inserts wrapscan     ws     Search around end of buffer if string not found wrapmargin     wm=0     Split lines automatically at space near right margin .TE .KE .PP The options are of three kinds:  numeric options, string options, and toggle options.  You can set numeric and string options by a statement of the form .DS \fBset\fR \fIopt\fR\fB=\fR\fIval\fR .DE and toggle options can be set or unset by statements of one of the forms .DS \fBset\fR \fIopt\fR \fBset\fR \fBno\fR\fIopt\fR .DE These statements can be placed in a file .exrc' in your \s-2HOME\s0 directory, or given while you are running .I vi by preceding them with a \fB:\fR and following them with a \s-2ESC\s0. .PP You can get a list of all options which you have changed by the command \fB:set\fR\s-2ESC\s0, or the value of a single option by the command \fB:set\fR \fIopt\fR\fB?\fR\s-2ESC\s0. .NH 2 Recovering lost lines .PP You might have a serious problem if you delete a number of lines and then regret that they were deleted.  Despair not, the editor saves the last 9 deleted blocks of text in a set of numbered registers 1-9. You can get the \fIn\fR'th previous deleted text back in your file by the command "\fR\fIn\fR|\fBp\fR. The "\fR here says that a buffer name is to follow, \fIn\fR is the number of the buffer you wish to try (use the number 1 for now), and .B p is the put command, which puts text in the buffer after the cursor. If this doesn't bring back the text you wanted, hit .B u to undo this and then \fB&.\fR (period) to repeat the put command. In general the \fB&.\fR command will repeat the last change you made. As a special case, when the last command refers to a numbered text buffer, the \fB.\fR command increments the number of the buffer before repeating the command.  Thus a sequence of the form .DS \fB"1pu.u.u.\fR .DE will, if repeated long enough, show you all the deleted text which has been saved for you. You can omit the .B u commands here to gather up all this text in the buffer, or stop after any \fB&.\fR command to keep just the then recovered text. The command .B P can also be used rather than .B p to put the recovered text before rather than after the cursor. .NH 2 Recovering lost files .PP If the system crashes, you can recover the work you were doing to within a few changes.  You will normally receive mail when you next login giving you the name of the file which has been saved for you. You should then change to the directory where you were when the system crashed and give a command of the form: .DS % \fBvi -r\fR \fIname\fR .DE replacing \fIname\fR with the name of the file which you were editing. This will recover your work to a point near where you left off.*(dg .FS *(dg In rare cases, some of the lines of the file may be lost.  The editor will give you the numbers of these lines and the text of the lines will be replaced by the string LOST'.  These lines will almost always be among the last few which you changed.  You can either choose to discard the changes which you made (if they are easy to remake) or to replace the few lost lines by hand. .FE .PP You can get a listing of the files which are saved for you by giving the command: .DS % \fBvi \-r\fR .DE If there is more than one instance of a particular file saved, the editor gives you the newest instance each time you recover it.  You can thus get an older saved copy back by first recovering the newer copies. .NH 2 Continuous text input .PP When you are typing in large amounts of text it is convenient to have lines broken near the right margin automatically.  You can cause this to happen by giving the command \fB:se wm=12\fR\s-2ESC\s0. This establishes the last 12 columns of your screen as a margin in which a space which you input in text will automatically force a line break. .PP If the editor breaks a input line and you wish to put it back together you can tell it to join the lines with \fBJ\fR.  You can give \fBJ\fR a count of the number of lines to be joined as in \fB3J\fR to join 3 lines.  The editor supplies white space, if appropriate, at the juncture of the joined lines, and leaves the cursor at this white space. You can kill the white space with \fBx\fR if you don't want it. .NH 2 Features for editing programs .PP The editor has a number of commands for editing programs. The thing that most distinguishes editing of programs from editing of text is the desirability of maintaining an indented structure to the body of the program.  The editor has a .I autoindent facility for helping you generate correctly indented programs. .PP To enable this facility you can give the command \fB:se ai\fR\s-2ESC\s0. Now try opening a new line with \fBo\fR and type some characters on the line after a few tabs.  If you now start another line, notice that the editor supplies white space at the beginning of the line to line it up with the previous line.  You cannot backspace over this indentation, but you can use \fB^D\fR key to backtab over the supplied indentation. .PP Each time you type \fB^D\fR you back up one position, normally to an 8 column boundary.  This amount is settable; the editor has an option called .I shiftwidth which you can set to change this value. Try giving the command \fB:se sw=4\fR\s-2ESC\s0 and then experimenting with autoindent again. .PP The character \fB^T\fR acts as a forward tab, much like the \s-2TAB\s0 (\fB^I\fR) character does, except it aligns to the next \fIshiftwidth\fR boundary.  If you have set \fIsw\fR to 4, try creating a new line and hitting a few \fB^T\fR's to see how this works.  This is useful if your indenting style does not use a full physical tab stop at each level of logical indentation of the program. .PP For shifting lines in the program left and right, there are operators .B < and .B >. These shift the lines you specify right or left by one .I shiftwidth. Try .B << and .B >> which shift one line left or right, and .B <L and .B >L shifting the rest of the display left and right. .PP If you have a complicated expression and wish to see how the parentheses match, put the cursor at a left or right parenthesis and hit \fB%\fR. This will show you the matching parenthesis. This works also for braces { and }. .PP If you are editing C programs, you can use the \fB[[\fR and \fB]]\fR keys to advance or retreat to a line starting with a \fB{\fR, i.e. a function declaration at a time.  When \fB]]\fR is used with an operator it stops after a line which starts with \fB}\fR; this is sometimes useful with \fBy]]\fR. .NH 2 Filtering portions of the buffer .PP You can run system commands over portions of the buffer using the operator \fB!\fR. You can use this to sort lines in the buffer, or to reformat portions of the buffer with a pretty-printer. Try typing in a list of random words, one per line and ending them with a blank line.  Back up to the beginning of the list, and then give the command \fB!}sort\fR\s-2ESC\s0.  This says to sort the next paragraph of material, and the blank line ends a paragraph. .NH 2 Commands for editing \s-2LISP\s0 .PP If you are editing a \s-2LISP\s0 program you should set the option .I lisp by doing \fB:se\ lisp\fR\s-2ESC\s0. This changes the \fB(\fR and \fB)\fR commands to move backward and forward over s-expressions. The \fB{\fR and \fB}\fR commands are like \fB(\fR and \fB)\fR but don't stop at atoms.  These can be used to skip to the next list, or through a comment quickly. .PP The .I autoindent option works differently for \s-2LISP\s0, supplying indent to align at the first argument to the last open list.  If there is no such argument then the indent is two spaces more than the last level. .PP There is another option which is useful for typing in \s-2LISP\s0, the .I showmatch option. Try setting it with \fB:se sm\fR\s-2ESC\s0 and then try typing a (' some words and then a )'.  Notice that the cursor shows the position of the (' which matches the )' briefly. This happens only if the matching (' is on the screen, and the cursor stays there for at most one second. .PP The editor also has an operator to realign existing lines as though they had been typed in with .I lisp and .I autoindent set.  This is the \fB=\fR operator. Try the command \fB=%\fR at the beginning of a function.  This will realign all the lines of the function declaration. .PP When you are editing \s-2LISP\s0,, the \fB[[\fR and \fR]]\fR advance and retreat to lines beginning with a \fB(\fR, and are useful for dealing with entire function definitions. .NH 2 Abbreviations .PP The editor has a number of short commands which abbreviate longer commands which we have introduced here.  You can find these commands easily on the quick reference card. They often save a bit of typing and you can learn them as convenient. .NH 1 Nitty-gritty details .NH 2 Line representation in the display .PP The editor folds long logical lines onto many physical lines in the display. Commands which advance display lines advance logical lines and will skip over all the segments of a line in one motion.  The command \fB|\fR moves the cursor to a specific column, and may be useful for getting near the middle of a long line to split it in half.  Try \fB80|\fR on a line which is more than 80 columns long.*(dg .FS *(dg You can make long lines very easily by using \fBJ\fR to join together short lines. .FE .PP The editor only puts full lines on the display; if there is not enough room on the display to fit a logical line, the editor leaves the physical lines empty, placing only an @ on the line as a place holder.  When you delete lines on a dumb terminal, the editor will often just clear the lines to @ to save time (rather than rewriting the rest of the screen.) You can always maximize the information on the screen by giving the \fB^R\fR command. .PP If you wish, you can have the editor place line numbers before each line on the display.  Give the command \fB:se nu\fR\s-2ESC\s0 to enable this, and the command \fB:se nonu\fR\s-2ESC\s0 to turn it off. You can have tabs represented as \fB^I\fR and the ends of lines indicated with $' by giving the command \fB:se list\fR\s-2ESC\s0; \fB:se nolist\fR\s-2ESC\s0 turns this off. .PP Finally, lines consisting of only the character ~' are displayed when the last line in the file is in the middle of the screen.  These represent physical lines which are past the logical end of file. .NH 2 Counts .PP Most .I vi commands will use a preceding count to affect their behavior in some way. The following table gives the common ways in which the counts are used: .DS .TS l lb. new window size     :  /  ?  [[  ]]  ^F  ^B  `  ' scroll amount     ^D  ^U line/column number     z  G  | replicate insert     a  i  A  I repeat effect     \fRmost of the rest\fP .TE .DE .PP The editor maintains a notion of the current default window size. On terminals which run at speeds greater than 1200 baud (faster than 120 characters per second) the editor uses the full terminal screen.  On terminals which are no faster than 1200 baud (dialup lines are in this group) the editor uses half of the screen as the default window size. .PP This size is the size used when the editor clears and refills the screen after a search or other motion moves far from the edge of the current window. The commands which take a new window size as count all often cause the screen to be redrawn.  If you anticipate this, but do not need as large a window as you are currently using, you may wish to change the screen size by specifying the new size before these commands. In any case, the number of lines used on the screen will expand if you move off the top with a \fB-\fR or similar command or off the bottom with a command such as \s-2RETURN\s0 or \fB^D\fR. The window will revert to the last specified size the next time it is cleared and refilled.*(dg .FS *(dg But not by a \fB^L\fR which just redraws the screen as it is. .FE .PP The scroll commands \fB^D\fR and \fB^U\fR likewise remember the amount of scroll last specified, using half the basic window size initially. The simple insert commands use a count to specify a repetition of the inserted text.  Thus \fB10a+----\fR\s-2ESC\s0 will insert a grid-like string of text. A few commands also use a preceding count as a line or column number. .PP Except for a few commands which ignore any counts (such as \fB^R\fR), the rest of the editor commands use a count to indicate a simple repetition of their effect.  Thus \fB5w\fR advances five words on the current line, while \fB5\fR\s-2RETURN\s0 advances five lines.  A very useful instance of a count as a repetition is a count given to the \fB.\fR command, which repeats the last changing command.  If you do \fBdw\fR and then \fB3.\fR, you will delete first one and then three words.  You can then delete two more words with \fB2.\fR. .NH 2 More file manipulation commands .PP The following table lists the file manipulation commands which you can use when you are in .I vi. .KF .DS .TS lb l. :w     write back changes :wq     write and quit :q     quit :q!     quit, discarding changes :e \fIname\fP     edit file \fIname\fR :e!     reedit, discarding changes :e + \fIname\fP     edit, starting at end :e +\fIn\fP     edit, starting at line \fIn\fP :e #     edit alternate file :w \fIname\fP     write file \fIname\fP :w! \fIname\fP     overwrite file \fIname\fP :\fIx,y\fPw \fIname\fP     write lines \fIx\fP through \fIy\fP to \fIname\fP :r \fIname\fP     read file \fIname\fP into buffer :r !\fIcmd\fP     read output of \fIcmd\fP into buffer :n     edit next file in argument list :n!     edit next file, discarding changes to current :n \fIargs\fP     specify new argument list :ta \fItag\fP     edit file containing tag \fItag\fP, at \fItag\fP .TE .DE .KE All of these commands are given followed by an \s-2ESC\s0 or \s-2RETURN\s0. The most basic commands are \fB:w\fR, \fB:wq\fR, \fB:q\fR and \fB:e\fR. A normal editing session on a single file will end with a \fB:wq\fR command. If you are editing for a long period of time you can give \fB:w\fR commands occasionally after major amounts of editing, and then finish with a \fB:wq\fR.   When you edit more than one file, you can finish with one with a \fB:w\fR and start editing a new file by giving a \fB:e\fR command. .PP If you make changes to the editor's copy of a file, but do not wish to write them back, then you must give an \fB!\fR after the command you would otherwise use; this forces the editor to discard any changes you have made.  Use this carefully. .PP The \fB:e\fR command can be given a \fB+\fR argument to start at the end of the file, or a \fB+\fR\fIn\fR argument to start at line \fIn\fR^. In forming new names to the \fBe\fR command, you can use the character \fB%\fR which is replaced by the current file name, or the character \fB#\fR which is replaced by the alternate file name. The alternate file name is generally the last name you typed other than the current file.  Thus if you try to do a \fB:e\fR and get a diagnostic that you haven't written the file, you can give a \fB:w\fR command and then a \fB:e #\fR command to redo the previous \fB:e\fR. .PP You can write part of the buffer to a file by finding out the lines that bound the range to be written using \fB^G\fR, and giving these numbers after the \fB:\fR and before the \fBw\fP, separated by \fB,\fR's. You can also mark these lines with \fBm\fR and then use an address of the form \fB(aa\fR\fIx\fR\fB,\fB(aa\fR\fIy\fR on the \fBw\fR command here. .PP You can read another file into the buffer after the current line by using the \fB:r\fR command.  To read before the current line put a \fB-\fR between the \fB:\fR and the \fBr\fR. You can similarly read in the output from a command, just use \fB!\fR\fIcmd\fR instead of a file name. .PP If you wish to edit a set of files in succession, you can give all the names on the command line, and then edit each one in turn using the command \fB:n\fR.  It is also possible to respecify the list of files to be edited by giving the \fB:n\fR command a list of file names, or a pattern to be expanded as you would have given it on the initial .I vi command. .PP If you are editing large programs, you will find the \fB:ta\fR command very useful.  It utilizes a data base of function names and their locations, which can be created by programs such as .I ctags, to quickly find a function whose name you give. If the \fB:ta\fR command will require the editor to switch files, then you must \fB:w\fR or abandon any changes before switching.  You can repeat the \fB:ta\fR command without any arguments to look for the same tag again. .NH 2 More about searching for strings .PP When you are searching for strings in the file with \fB/\fR and \fB?\fR, the editor normally places you at the next or previous line in the file containing the string.  If you are using an operator such as \fBd\fR, \fBc\fR or \fBy\fR, then you may well wish to affect lines up to the line before the line containing the pattern.  You can give a search of the form \fB/\fR\fIpat\fR\fB/-\fR\fIn\fR to refer to the \fIn\fR'th line before the next line containing \fIpat\fR, or you can use \fB+\fR instead of \fB-\fR to refer to the lines after the one containing \fIpat\fR. .PP You can have the editor ignore the case of words in the searches it does by giving the command \fB:se ic\fR\s-2ESC\s0. The command \fB:se noic\fR\s-2ESC\s0 turns this off. .PP Strings given to searches may actually be regular expressions. When you are running .I vi, the editor normally disables the option .I magic, so that only the characters \fB^\fR and \fB$\fR are special here. The character \fB\e\fR is also special (as it is most everywhere in the system), and may be used to get at the an extended pattern matching facility. It is also necessary to use a \e before a \fB/\fR in a forward scan or a \fB?\fR in a backward scan. The following table gives these extended forms. .DS .TS bl l. (ua     at beginning of pattern, matches beginning of line $     at end of pattern, matches end of line \e\fB&.\fR     matches any character \e<     matches the beginning of a word \e>     matches the end of a word \e[\fIstr\fP]     matches any single character in \fIstr\fP \e[(ua\fIstr\fP]     matches any single character not in \fIstr\fP \e[\fIx\fP-\fIy\fP]     matches any character between \fIx\fP and \fIy\fP \e*     matches any number of the preceding pattern .TE .DE If you intend to use these mechanisms a lot, you can give the command \fB:se magic\fR\s-2ESC\s0 which allows the \fB. [\fR and \fB*\fR primitives to be given without a preceding \e; to include these characters in a pattern while in this mode, give them preceded by a \e. If you wish to use the patterns regularly in .I vi, you can set the option .I magic in your `.exrc' file; see section 6.2 for details. .NH 2 More about input mode .PP There are a number of characters which you can use to make corrections during input mode.  These are summarized in the following table. .DS .TS lb l. ^H     deletes the last input character ^W     deletes the last input word, defined as by \fBb\fR erase     your erase character, same as \fB^H\fP kill     your kill character, deletes the input on this line \e     escapes a following \fB^H\fP and your erase and kill \s-2ESC\s0     ends an insertion \s-2DEL\s0     interrupts an insertion, terminating it abnormally ^D     backtabs over \fIautoindent\fP 0^D     kills all the \fIautoindent\fP (ua^D     same as \fB0^D\fP, but restores indent next line ^Q     quotes the next non-printing character into the file ^T     is a \fIshiftwidth\fP forward tab .TE .DE .PP The most usual way of making corrections to input is by typing \fB^H\fR to correct a single character, or by typing one or more \fB^W\fR's to back over incorrect words.  If you use \fB#\fR as your erase character in the normal system, it will work like \fB^H\fR. .PP Your system kill character, normally \fB@\fR or \fB^X\fR will erase all the input you have given on the current line.  In general, you can neither erase input back around a line boundary nor can you erase characters which you did not insert with this insertion command.  To make corrections on the previous line after a new line has been started you can hit \s-2ESC\s0 to end the insertion, move over and make the correction, and then return to where you were to continue.  The command \fBA\fR which appends at the end of the current line is often useful for continuing. .PP If you wish to type in your erase or kill character (say # or @) then you must precede it with a \fB\e\fR, just as you would do at the normal system command level.  A more general way of typing non-printing characters into the file is to precede them with a \fB^Q\fR.  The \fB^Q\fR echoes as a \fB^\fR character on which the cursor rests.  This indicates that the editor expects you to type a control character.  In fact you may type any character and it will be inserted into the file at that point.* .FS
  • This is not quite true.  The implementation of the editor does not allow the \s-2NULL\s0 (\fB^@\fR) character to appear in files.  Also the \s-2LF\s0 (linefeed or \fB^J\fR) character is used by the editor to separate lines in the file, so it cannot appear in the middle of a line.  You can insert any other character, however, if you wait for the editor to echo the \fB^\fR before you type the character.  In fact, the editor will treat a following letter as a request for the corresponding control character.  This is the only way to type \fB^S\fR, since the system normally uses \fB^S\fR to suspend output and never gives the \fB^S\fR to the editor to process. .FE .PP If you are using \fIautoindent\fR you can backtab over the indent which it supplies by typing a \fB^D\fR.  This backs up to a \fIshiftwidth\fR boundary;  similarly \fB^T\fR will tab over to a \fIshiftwidth\fR boundary. Both of these work only immediately after the supplied \fIautoindent\fR. .PP When you are using \fIautoindent\fR you may wish to place a label at the left margin of a line.  The way to do this easily is to type \fB(ua\fR and then \fB^D\fR.  The editor will move the cursor to the left margin for one line, and restore the previous indent on the next.  You can also type a \fB0\fR followed immediately by a \fB^D\fR if you wish to kill all the indent and not have it come back on the next line. .NH 2 Upper case only terminals .PP If your terminal has only upper case, you can still use .I vi by using the normal system convention for typing on such a terminal. Characters which you normally type are converted to lower case, and you can type upper case letters by preceding them with a \e. The characters { ~ } | (ga are not available on such terminals, but you can escape them as \e( \e(ua \e) \e! \e(aa. These characters are represented on the display in the same way they are typed.*(dd .FS *(dd The \e character you give will not echo until you type another key. .FE .NH 2 Vi and ex .PP .I Vi is actually one mode of editing within the editor .I ex. When you are running .I vi you can escape to the line oriented editor of .I ex by giving the command \fBQ\fR. All of the .B : commands which were introduced above are available in .I ex. Just give them without the \fB:\fR and follow them with a \s-2RETURN\s0. .PP In rare instances, an internal error may occur in .I vi. In this case you will get a diagnostic and be left in the command mode of .I ex. You can then save your work and quit if you wish by giving a command \fBwq\fR after the \fB:\fR which \fIex\fR prompts you with, or you can reenter \fIvi\fR by giving .I ex a .I vi command. .PP There are a number of things which you can do more easily in .I ex than in .I vi. Systematic changes in line oriented material are particularly easy. You can read the advanced editing documents for the editor .I ed to find out a lot more about this style of editing. Experienced users often mix their use of .I ex command mode and .I vi command mode to speed the work they are doing. .NH 2 Open mode: vi on hardcopy terminals and ``glass tty's'' .PP If you are on a hardcopy terminal or a terminal which does not have a cursor which can move off the bottom line, you can still use the command set of .I vi, but in a different mode. When you give a .I vi command, the editor will tell you that it is using .I open mode. This name comes from the .I open command in .I ex, which is used to get into the same mode. .PP The only difference between .I visual mode and .I open mode is the way in which the text is displayed. .PP In .I open mode the editor uses a single line window into the file, and moving backward and forward in the file causes new lines to be displayed, always below the current line. Two commands of .I vi work differently in .I open: .B z and \fB^R\fR. The .B z command does not take parameters, but rather draws a window of context around the current line and then returns you to the current line. .PP If you are on a hardcopy terminal, the .B ^R command will retype the current line. On such terminals, the editor normally uses two lines to represent the current line. The first line is a copy of the line as you started to edit it, and you work on the line below this line. When you delete characters, the editor types a number of \e's to show you the characters which are deleted.  The editor also reprints the current line soon after such changes so that you can see what the line looks like again. .PP It is sometimes useful to use this mode on very slow terminals which can support .I vi in the full screen mode. You can do this by entering .I ex and using an .I open command.