An Introduction to Display Editing with Vi William Joy Mark Horton Computer Science Division Department of Electrical Engineering and Computer Science University of California, Berkeley Berkeley, Ca. 94720 _A_B_S_T_R_A_C_T _V_i (visual) is a display oriented interactive text editor. When using _v_i 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. Using _v_i you can insert new text any place in the file quite easily. Most of the commands to _v_i move the cursor around in the file. There are commands to move the cursor forward and backward in units of characters, words, sentences and para- graphs. A small set of operators, like _d for delete and _c for change, are combined with the motion commands to form operations such as delete word or change 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. _V_i 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 func- tion 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 algo- rithms to make best use of the limited speed available. It is also possible to use the command set of _v_i on hardcopy terminals, storage tubes and ``glass tty's'' using a one line editing window; September 2, 1987 - 2 - thus _v_i'_s command set is available on all termi- nals. The full command set of the more tradi- tional, line oriented editor _e_x is available within _v_i; it is quite simple to switch between the two modes of editing. _1. _G_e_t_t_i_n_g _s_t_a_r_t_e_d This document provides a quick introduction to _v_i. (Pro- nounced _v_e_e-_e_y_e.) You should be running _v_i 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 _v_i. 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. There is also a short appendix here, which gives for each character the special meanings which this character has in _v_i. Attached to this document should be a quick refer- ence card. This card summarizes the commands of _v_i in a very compact format. You should have the card handy while you are learning _v_i. _1._1. _S_p_e_c_i_f_y_i_n_g _t_e_r_m_i_n_a_l _t_y_p_e Before you can start _v_i 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. Code Full name Type 8 _____________________________________________________ 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 __________________________ The financial support of an IBM Graduate Fellowship and the National Science Foundation under grants MCS74- 07644-A03 and MCS78-07291 is gratefully acknowledged. 9 September 2, 1987 - 3 - h1500 Hazeltine 1500 Intelligent h19 Heathkit h19 Intelligent i100 Infoton 100 Intelligent mime Imitating a smart act4 Intelligent t1061 Teleray 1061 Intelligent vt52 Dec VT-52 Dumb Suppose for example that you have a Hewlett-Packard HP2621A terminal. The code used by the system for this ter- minal is `2621'. In this case you can use one of the fol- lowing commands to tell the system the type of your termi- nal: % setenv TERM 2621 This command works with the _c_s_h shell. If you are using the standard Bourne shell _s_h then you should give the commands $ TERM=2621 $ export TERM If you want to arrange to have your terminal type set up automatically when you log in, you can use the _t_s_e_t pro- gram. If you dial in on a _m_i_m_e, but often use hardwired ports, a typical line for your ._l_o_g_i_n file (if you use csh) would be setenv TERM `tset - -d mime` or for your ._p_r_o_f_i_l_e file (if you use sh) TERM=`tset - -d mime` _T_s_e_t knows which terminals are hardwired to each port and needs only to be told that when you dial in you are probably on a _m_i_m_e. _T_s_e_t is usually used to change the erase and kill characters, too. _1._2. _E_d_i_t_i_n_g _a _f_i_l_e After telling the system which kind of terminal you have, you should make a copy of a file you are familiar with, and run _v_i on this file, giving the command % vi _n_a_m_e replacing _n_a_m_e 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.++ __________________________ ++ If you gave the system an incorrect terminal type September 2, 1987 - 4 - _1._3. _T_h_e _e_d_i_t_o_r'_s _c_o_p_y: _t_h_e _b_u_f_f_e_r 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 _b_u_f_f_e_r, 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. _1._4. _N_o_t_a_t_i_o_n_a_l _c_o_n_v_e_n_t_i_o_n_s In our examples, input which must be typed as is will be presented in bold face. Text which should be replaced with appropriate input will be given in _i_t_a_l_i_c_s. We will represent special characters in SMALL CAPITALS. _1._5. _A_r_r_o_w _k_e_y_s The editor command set is independent of the terminal you are using. On most terminals with cursor positioning keys, these keys will also work within the editor. If you don't have cursor positioning keys, or even if you do, you can use the h j k and l keys as cursor positioning keys (these are labelled with arrows on an _a_d_m_3_a).* (Particular note for the HP2621: on this terminal the function keys must be _s_h_i_f_t_e_d (ick) to send to the machine, otherwise they only act locally. Unshifted use will leave the cursor positioned incorrectly.) __________________________ 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 termi- nal. In this case hit the keys :q (colon and the q key) and then hit the RETURN 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 er- ror 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 com- mands which you type here, try sending an interrupt to it by hitting the DEL or RUB key on your terminal, and then hitting the :q command again followed by a car- riage return. * As we will see later, _h moves back to the left (like control-h which is a backspace), _j moves down (in the same column), _k moves up (in the same column), and _l moves to the right. September 2, 1987 - 5 - _1._6. _S_p_e_c_i_a_l _c_h_a_r_a_c_t_e_r_s: _E_S_C, _C_R _a_n_d _D_E_L Several of these special characters are very important, so be sure to find them right now. Look on your keyboard for a key labelled ESC or ALT. 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.++ Partially formed commands are can- celled by ESC, and when you insert text in the file you end the text insertion with ESC. 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. The CR or RETURN key is important because it is used to terminate certain commands. It is usually at the right side of the keyboard, and is the same command used at the end of each shell command. Another very useful key is the DEL or RUB 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 DEL or RUB key; try this now.* From now on we will simply refer to hitting the DEL or RUB key as ``sending an interrupt.''** 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. _1._7. _G_e_t_t_i_n_g _o_u_t _o_f _t_h_e _e_d_i_t_o_r After you have worked with this introduction for a while, and you wish to do something else, you can give the command ZZ to the editor. This will write the contents of the editor's buffer back into the file you are editing, if __________________________ ++ On smart terminals where it is possible, the editor will quietly flash the screen rather than ringing the bell. * Backspacing over the `/' will also cancel the search. ** On some systems, this interruptibility comes at a price: you cannot type ahead when the editor is comput- ing with the cursor on the bottom line. September 2, 1987 - 6 - you made any changes, and then quit from the editor. You can also end an editor session by giving the command :q!CR;+ 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. _2. _M_o_v_i_n_g _a_r_o_u_n_d _i_n _t_h_e _f_i_l_e _2._1. _S_c_r_o_l_l_i_n_g _a_n_d _p_a_g_i_n_g The editor has a number of commands for moving around in the file. The most useful of these is generated by hit- ting 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 `|^' in this document; `^' is exclusively used as part of the `^x' notation for control characters.++ As you know now if you tried hitting ^D, this command scrolls down in the file. The D 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 ^U. Many dumb terminals can't scroll up at all, in which case hitting ^U clears the screen and refreshes it with a line which is farther back in the file at the top. If you want to see more of the file below where you are, you can hit ^E to expose one more line at the bottom of the screen, leaving the cursor where it is. The command ^Y (which is hopelessly non-mnemonic, but next to ^U on the keyboard) exposes one more line at the top of the screen. There are other ways to move around in the file; the keys ^F and ^B 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 ^D and ^U if you wish. Notice the difference between scrolling and paging. If you are trying to read the text in a file, hitting ^F to move forward a page will leave you only a little context to look back at. Scrolling on the other hand leaves more con- text, and happens more smoothly. You can continue to read __________________________ + All commands which read from the last display line can also be terminated with a ESC as well as an CR. ++ If you don't have a `^' key on your terminal then there is probably a key labelled `|^'; in any case these characters are one and the same. September 2, 1987 - 7 - the text as scrolling is taking place. _2._2. _S_e_a_r_c_h_i_n_g, _g_o_t_o, _a_n_d _p_r_e_v_i_o_u_s _c_o_n_t_e_x_t Another way to position yourself in the file is by giv- ing the editor a string to search for. Type the character / followed by a string of characters terminated by CR. The editor will position the cursor at the next occurrence of this string. Try hitting n to then go to the next occurrence of this string. The character ? will search backwards from where you are, and is otherwise like /.+ 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. If you wish the search to match only at the beginning of a line, begin the search string with an |^. To match only at the end of a line, end the search string with a $. Thus /|^searchCR will search for the word `search' at the begin- ning of a line, and /last$CR searches for the word `last' at the end of a line.* The command G, when preceded by a number will position the cursor at that line in the file. Thus 1G will move the cursor to the first line of the file. If you give G no count, then it moves to the end of the file. 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 indi- cates that the last line in the file is on the screen; that is, the `~' lines are past the end of the file. You can find out the state of the file you are editing by typing a ^G. 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 __________________________ + 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 any- where else in the file. You can disable this wra- paround in scans by giving the command :se nowrapscanCR, or more briefly :se nowsCR. *Actually, the string you give to search for here can be a _r_e_g_u_l_a_r _e_x_p_r_e_s_s_i_o_n in the sense of the editors _e_x(1) and _e_d(1). If you don't wish to learn about this yet, you can disable this more general facility by do- ing :se nomagicCR; by putting this command in EXINIT in your environment, you can have this always be in effect (more about _E_X_I_N_I_T later.) September 2, 1987 - 8 - through the buffer which you are. Try doing this now, and remember the number of the line you are on. Give a G com- mand to get to the end and then another G command to get back where you were. You can also get back to a previous position by using the command `` (two back quotes). This is often more con- venient than G because it requires no advance preparation. Try giving a G or a search with / or ? and then a `` to get back to where you were. If you accidentally hit n or any command which moves you far away from a context of interest, you can quickly get back by hitting ``. _2._3. _M_o_v_i_n_g _a_r_o_u_n_d _o_n _t_h_e _s_c_r_e_e_n Now try just moving the cursor around on the screen. If your terminal has arrow keys (4 or 5 keys with arrows going in each direction) try them and convince yourself that they work. If you don't have working arrow keys, you can always use _h, _j, _k, and _l. Experienced users of _v_i prefer these keys to arrow keys, because they are usually right underneath their fingers. Hit the + key. Each time you do, notice that the cur- sor advances to the next line in the file, at the first non-white position on the line. The - key is like + but goes the other way. 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 RETURN key has the same effect as the + key. _V_i also has commands to take you to the top, middle and bottom of the screen. H will take you to the top (home) line on the screen. Try preceding it with a number as in 3H. This will take you to the third line on the screen. Many _v_i commands take preceding numbers and do interesting things with them. Try M, which takes you to the middle line on the screen, and L, which takes you to the last line on the screen. L also takes counts, thus 5L will take you to the fifth line from the bottom. _2._4. _M_o_v_i_n_g _w_i_t_h_i_n _a _l_i_n_e Now try picking a word on some line on the screen, not the first word on the line. move the cursor using RETURN and - to be on the line where the word is. Try hitting the w key. This will advance the cursor to the next word on the line. Try hitting the b key to back up words in the line. Also try the e key which advances you to the end of the current word rather than to the beginning of the next word. Also try SPACE (the space bar) which moves right one September 2, 1987 - 9 - character and the BS (backspace or ^H) key which moves left one character. The key h works as ^H does and is useful if you don't have a BS key. (Also, as noted just above, l will move to the right.) If the line had punctuation in it you may have noticed that that the w and b keys stopped at each group of punctua- tion. You can also go back and forwards words without stop- ping at punctuation by using W and B 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 w and b. The word keys wrap around the end of line, rather than stopping at the end. Try moving to a word on a line below where you are by repeatedly hitting w. _2._5. _S_u_m_m_a_r_y SPACE advance the cursor one position ^B backwards to previous page ^D scrolls down in the file ^E exposes another line at the bottom ^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 ^U scrolls up in the file ^Y exposes another line at the top + 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 / or ? pattern w word after this word _2._6. _V_i_e_w If you want to use the editor to look at a file, rather than to make changes, invoke it as _v_i_e_w instead of _v_i. This will set the _r_e_a_d_o_n_l_y option which will prevent you from accidently overwriting the file. September 2, 1987 - 10 - _3. _M_a_k_i_n_g _s_i_m_p_l_e _c_h_a_n_g_e_s _3._1. _I_n_s_e_r_t_i_n_g One of the most useful commands is the i (insert) com- mand. After you type i, everything you type until you hit ESC is inserted into the file. Try this now; position your- self 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 ESC. Now try finding a word which can, but does not, end in an `s'. Position yourself at this word and type e (move to end of word), then a for append and then `sESC' to terminate the textual insert. This sequence of commands can be used to easily pluralize a word. Try inserting and appending a few times to make sure you understand how this works; i placing text to the left of the cursor, a to the right. 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 o to create a new line after the line you are on, or the command O 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 ESC is inserted on the new line. 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. 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 RETURN 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 ESC. While you are inserting new text, you can use the char- acters you normally use at the system command level (usually ^H or #) to backspace over the last character which you typed, and the character which you use to kill input lines September 2, 1987 - 11 - (usually @, ^X, or ^U) to erase the input you have typed on the current line.+ The character ^W 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. 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 some- thing similar. In any case the characters disappear when when you hit ESC; if you want to get rid of them immedi- ately, hit an ESC and then a again. 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 ESC 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 com- mand again. _3._2. _M_a_k_i_n_g _s_m_a_l_l _c_o_r_r_e_c_t_i_o_n_s You can make small corrections in existing text quite easily. Find a single character which is wrong or just pick any character. Use the arrow keys to find the character, or get near the character with the word motion keys and then either backspace (hit the BS key or ^H or even just h) or SPACE (using the space bar) until the cursor is on the char- acter which is wrong. If the character is not needed then hit the x key; this deletes the character from the file. It is analogous to the way you x out characters when you make mistakes on a typewriter (except it's not as messy). If the character is incorrect, you can replace it with the correct character by giving the command r_c, where _c is replaced by the correct character. Finally if the character which is incorrect should be replaced by more than one char- acter, give the command s which substitutes a string of characters, ending with ESC, for it. If there are a small number of characters which are wrong you can precede s with a count of the number of characters to be replaced. Counts are also useful with x to specify the number of characters to be deleted. _3._3. _M_o_r_e _c_o_r_r_e_c_t_i_o_n_s: _o_p_e_r_a_t_o_r_s You already know almost enough to make changes at a higher level. All you need to know now is that the _d key __________________________ + In fact, the character ^H (backspace) always works to erase the last input character here, regardless of what your erase character is. September 2, 1987 - 12 - acts as a delete operator. Try the command _d_w to delete a word. Try hitting . a few times. Notice that this repeats the effect of the dw. The command . repeats the last com- mand which made a change. You can remember it by analogy with an ellipsis `...'. Now try db. This deletes a word backwards, namely the preceding word. Try dSPACE. This deletes a single charac- ter, and is equivalent to the x command. Another very useful operator is _c or change. The com- mand _c_w thus changes the text of a single word. You follow it by the replacement text ending with an ESC. 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. _3._4. _O_p_e_r_a_t_i_n_g _o_n _l_i_n_e_s It is often the case that you want to operate on lines. Find a line which you want to delete, and type dd, the _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. Try repeating the _c operator twice; this will change a whole line, erasing its previous contents and replacing them with text you type up to an ESC.+ You can delete or change more than one line by preced- ing the _d_d or _c_c with a count, i.e. 5dd deletes 5 lines. You can also give a command like dL to delete all the lines up to and including the last line on the screen, or d3L 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 __________________________ + The command S is a convenient synonym for for cc, by analogy with s. Think of S as a substitute on lines, while s is a substitute on characters. * One subtle point here involves using the / search after a d. This will normally delete characters from the current position to the point of the match. If what is desired is to delete whole lines including the two points, give the pattern as /pat/+0, a line ad- dress. September 2, 1987 - 13 - tell you when a change you make affects text which you can- not see. _3._5. _U_n_d_o_i_n_g Now suppose that the last change which you made was incorrect; you could use the insert, delete and append com- mands 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 _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 _u also undoes a _u. 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 _U command restores the current line to the state before you started changing it. You can recover text which you delete, even if undo will not bring it back; see the section on recovering lost text below. _3._6. _S_u_m_m_a_r_y SPACE advance the cursor one position ^H backspace the cursor ^W erase a word during an insert erase your erase (usually ^H or #), erases a character during an insert kill your kill (usually @, ^X, or ^U), kills the insert on this line . 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 _4. _M_o_v_i_n_g _a_b_o_u_t; _r_e_a_r_r_a_n_g_i_n_g _a_n_d _d_u_p_l_i_c_a_t_i_n_g _t_e_x_t _4._1. _L_o_w _l_e_v_e_l _c_h_a_r_a_c_t_e_r _m_o_t_i_o_n_s Now move the cursor to a line where there is a punctua- tion or a bracketing character such as a parenthesis or a comma or period. Try the command f_x where _x is this charac- ter. This command finds the next _x character to the right of the cursor in the current line. Try then hitting a ;, which finds the next instance of the same character. By using the f command and then a sequence of ;'s you can often September 2, 1987 - 14 - get to a particular place in a line much faster than with a sequence of word motions or SPACEs. There is also a F com- mand, which is like f, but searches backward. The ; command repeats F also. 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 df_x for some _x now and notice that the _x character is deleted. Undo this with u and then try dt_x; the t here stands for to, i.e. delete up to the next _x, but not the _x. The command T is the reverse of t. When working with the text of a single line, an |^ moves the cursor to the first non-white position on the line, and a $ moves it to the end of the line. Thus $a will append new text at the end of the current line. Your file may have tab (^I) characters in it. These characters are represented as a number of spaces expanding to a tab stop, where tab stops are every 8 positions.* 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. On rare occasions, your file may have nonprinting char- acters 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. The editor sometimes discards control characters, depending on the character and the setting of the _b_e_a_u_t_i_f_y option, 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 ^V before the control character. The ^V quotes the following character, causing it to be inserted directly into the file. _4._2. _H_i_g_h_e_r _l_e_v_e_l _t_e_x_t _o_b_j_e_c_t_s In working with a document it is often advantageous to work in terms of sentences, paragraphs, and sections. The operations ( and ) move to the beginning of the previous and __________________________ * This is settable by a command of the form :se ts=_xCR, where _x is 4 to set tabstops every four columns. This has effect on the screen representation within the edi- tor. September 2, 1987 - 15 - next sentences respectively. Thus the command d) will delete the rest of the current sentence; likewise d( 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 sen- tence. 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 `'' characters may appear after the `.', `!' or `?' before the spaces or end of line. The operations { and } move over paragraphs and the operations [[ and ]] move over sections.+ 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 _p_a_r_a_g_r_a_p_h_s. The default setting for this option defines the paragraph macros of the -_m_s and -_m_m macro packages, i.e. the `.IP', `.LP', `.PP' and `.QP', `.P' and `.LI' macros.++ Each paragraph boundary is also a sentence boundary. The sen- tence and paragraph commands can be given counts to operate over groups of sentences and paragraphs. Sections in the editor begin after each macro in the _s_e_c_t_i_o_n_s option, normally `.NH', `.SH', `.H' and `.HU', and each line with a formfeed ^L in the first column. Section boundaries are always line and paragraph boundaries also. Try experimenting with the sentence and paragraph com- mands 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 dif- ferent 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 __________________________ + The [[ and ]] operations require the operation char- acter 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 ``, these commands would still be frustrating if they were easy to hit acciden- tally. ++ You can easily change or extend this set of macros by assigning a different string to the _p_a_r_a_g_r_a_p_h_s op- tion in your EXINIT. See section 6.2 for details. The `.bp' directive is also considered to start a para- graph. September 2, 1987 - 16 - small window. _4._3. _R_e_a_r_r_a_n_g_i_n_g _a_n_d _d_u_p_l_i_c_a_t_i_n_g _t_e_x_t The editor has a single unnamed buffer where the last deleted or changed away text is saved, and a set of named buffers a-z which you can use to save copies of text and to move text around in your file and between files. The operator _y yanks a copy of the object which follows into the unnamed buffer. If preceded by a buffer name, "_xy, where _x here is replaced by a letter a-z, it places the text in the named buffer. The text can then be put back in the file with the commands _p and _P; p puts the text after or below the cursor, while P puts the text before or above the cursor. 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 P). 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 o or O command. Try the command YP. This makes a copy of the current line and leaves you on this copy, which is placed before the current line. The command Y is a convenient abbreviation for yy. The command Yp will also make a copy of the current line, and place it after the current line. You can give Y a count of lines to yank, and thus duplicate several lines; try 3YP. 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 "a5dd deleting 5 lines into the named buffer _a. You can then move the cursor to the eventual resting place of the these lines and do a "ap or "aP 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 :e _n_a_m_eCR where _n_a_m_e 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. An ordinary delete command saves the text in the unnamed buffer, so that an ordinary put can move it else- where. However, the unnamed buffer is lost when you change files, so to move text from one file to another you should use an unnamed buffer. September 2, 1987 - 17 - _4._4. _S_u_m_m_a_r_y. |^ first non-white on line $ end of line ) forward sentence } forward paragraph ]] forward section ( backward sentence { backward paragraph [[ backward section f_x find _x forward in line p put text back, after cursor or below current line y yank operator, for copies and moves t_x up to _x forward, for operators F_x f backward in line P put text back, before cursor or above current line T_x t backward in line _5. _H_i_g_h _l_e_v_e_l _c_o_m_m_a_n_d_s _5._1. _W_r_i_t_i_n_g, _q_u_i_t_t_i_n_g, _e_d_i_t_i_n_g _n_e_w _f_i_l_e_s So far we have seen how to enter _v_i and to write out our file using either ZZ or :wCR. The first exits from the editor, (writing if changes were made), the second writes and stays in the editor. 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 improve- ment to the file, then you can give the command :q!CR to quit from the editor without writing the changes. You can also reedit the same file (starting over) by giving the com- mand :e!CR. 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. You can edit a different file without leaving the edi- tor by giving the command :e _n_a_m_eCR. If you have not writ- ten 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 :wCR to save your work and then the :e _n_a_m_eCR command again, or carefully give the command :e! _n_a_m_eCR, which edits the other file discarding the changes you have made to the current file. To have the edi- tor automatically save changes, include _s_e_t _a_u_t_o_w_r_i_t_e in your EXINIT, and use :n instead of :e. _5._2. _E_s_c_a_p_i_n_g _t_o _a _s_h_e_l_l You can get to a shell to execute a single command by giving a _v_i command of the form :!_c_m_dCR. The system will September 2, 1987 - 18 - run the single command _c_m_d and when the command finishes, the editor will ask you to hit a RETURN to continue. When you have finished looking at the output on the screen, you should hit RETURN and the editor will clear the screen and redraw it. You can then continue editing. You can also give another : command when it asks you for a RETURN; in this case the screen will not be redrawn. If you wish to execute more than one command in the shell, then you can give the command :shCR. This will give you a new shell, and when you finish with the shell, ending it by typing a ^D, the editor will clear the screen and con- tinue. On systems which support it, ^Z will suspend the editor and return to the (top level) shell. When the editor is resumed, the screen will be redrawn. _5._3. _M_a_r_k_i_n_g _a_n_d _r_e_t_u_r_n_i_n_g The command `` returned to the previous place after a motion of the cursor by a command such as /, ? or G. 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 m_x, where you should pick some letter for _x, say `a'. Then move the cursor to a dif- ferent line (any way you like) and hit `a. The cursor will return to the place which you marked. Marks last only until you edit another file. When using operators such as _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 m. In this case you can use the form '_x rather than `_x. Used without an operator, '_x will move to the first non-white character of the marked line; similarly '' moves to the first non-white character of the line containing the previ- ous context mark ``. _5._4. _A_d_j_u_s_t_i_n_g _t_h_e _s_c_r_e_e_n If the screen image is messed up because of a transmis- sion error to your terminal, or because some program other than the editor wrote output to your terminal, you can hit a ^L, the ASCII form-feed character, to cause the screen to be refreshed. 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 ^R to cause the editor to retype the screen, closing up these holes. Finally, if you wish to place a certain line on the screen at the top middle or bottom of the screen, you can September 2, 1987 - 19 - position the cursor to that line, and then give a z command. You should follow the z command with a RETURN if you want the line to appear at the top of the window, a . if you want it at the center, or a - if you want it at the bottom. _6. _S_p_e_c_i_a_l _t_o_p_i_c_s _6._1. _E_d_i_t_i_n_g _o_n _s_l_o_w _t_e_r_m_i_n_a_l_s 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 inser- tions on dumb terminals to limit the delays, and how the editor erases lines to @ when they are deleted on dumb ter- minals. The use of the slow terminal insertion mode is con- trolled by the _s_l_o_w_o_p_e_n option. You can force the editor to use this mode even on faster terminals by giving the command :se slowCR. If your system is sluggish this helps lessen the amount of output coming to your terminal. You can dis- able this option by :se noslowCR. The editor can simulate an intelligent terminal on a dumb one. Try giving the command :se redrawCR. This simu- lation 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 :se noredrawCR. 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. 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: : / ? [[ ]] ` ' 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. You can easily expand or contract the window, placing the current line as you choose, by giving a number on a z September 2, 1987 - 20 - command, after the z and before the following RETURN, . or -. Thus the command z5. redraws the screen with the current line in the center of a five line window.+ If the editor is redrawing or otherwise updating large portions of the display, you can interrupt this updating by hitting a DEL or RUB as usual. If you do this you may par- tially 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 ^L; or move or search again, ignoring the current state of the display. See section 7.8 on _o_p_e_n mode for another way to use the _v_i command set on slow terminals. _6._2. _O_p_t_i_o_n_s, _s_e_t, _a_n_d _e_d_i_t_o_r _s_t_a_r_t_u_p _f_i_l_e_s The editor has a set of options, some of which have been mentioned above. The most useful options are given in the following table. Name Default Description 8______________________________________________________________________________________ autoindent noai Supply indentation automatically autowrite noaw Automatic write before :n, :ta, ^|^, ! ignorecase noic Ignore case in searching lisp nolisp ( { ) } 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=IPLPPPQPbpP LI Macro names which start paragraphs redraw nore Simulate a smart terminal on a dumb one sections sect=NHSHH HU Macro names which start new sections shiftwidth sw=8 Shift distance for <, > and input ^D and ^T showmatch nosm Show matching ( or { as ) or } is typed slowopen slow Postpone display updates during inserts term dumb The kind of terminal you are using. 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 set _o_p_t=_v_a_l and toggle options can be set or unset by statements of one of the forms set _o_p_t set no_o_p_t 9__________________________ + Note that the command 5z. has an entirely different effect, placing line 5 in the center of a new window. September 2, 1987 - 21 - These statements can be placed in your EXINIT in your environment, or given while you are running _v_i by preceding them with a : and following them with a CR. You can get a list of all options which you have changed by the command :setCR, or the value of a single option by the command :set _o_p_t?CR. A list of all possible options and their values is generated by :set allCR. Set can be abbreviated se. Multiple options can be placed on one line, e.g. :se ai aw nuCR. Options set by the set command only last while you stay in the editor. It is common to want to have certain options set whenever you use the editor. This can be accomplished by creating a list of _e_x commands+ which are to be run every time you start up _e_x, _e_d_i_t, or _v_i. A typical list includes a set command, and possibly a few map commands. Since it is advisable to get these commands on one line, they can be separated with the | character, for example: set ai aw terse|map @ dd|map # x which sets the options _a_u_t_o_i_n_d_e_n_t, _a_u_t_o_w_r_i_t_e, _t_e_r_s_e, (the _s_e_t command), makes @ delete a line, (the first _m_a_p), and makes # delete a character, (the second _m_a_p). (See section 6.9 for a description of the map command) This string should be placed in the variable EXINIT in your environment. If you use the shell _c_s_h, put this line in the file ._l_o_g_i_n in your home directory: setenv EXINIT 'set ai aw terse|map @ dd|map # x' If you use the standard shell _s_h, put these lines in the file ._p_r_o_f_i_l_e in your home directory: EXINIT='set ai aw terse|map @ dd|map # x' export EXINIT Of course, the particulars of the line would depend on which options you wanted to set. _6._3. _R_e_c_o_v_e_r_i_n_g _l_o_s_t _l_i_n_e_s 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 _n'th previ- ous deleted text back in your file by the command "_np. The " here says that a buffer name is to follow, _n is the number of the buffer you wish to try (use the number 1 for now), and _p is the put command, which puts text in the buffer __________________________ + All commands which start with : are _e_x commands. September 2, 1987 - 22 - after the cursor. If this doesn't bring back the text you wanted, hit _u to undo this and then . (period) to repeat the put command. In general the . command will repeat the last change you made. As a special case, when the last com- mand refers to a numbered text buffer, the . command incre- ments the number of the buffer before repeating the command. Thus a sequence of the form "1pu.u.u. will, if repeated long enough, show you all the deleted text which has been saved for you. You can omit the _u commands here to gather up all this text in the buffer, or stop after any . command to keep just the then recovered text. The command _P can also be used rather than _p to put the recovered text before rather than after the cursor. _6._4. _R_e_c_o_v_e_r_i_n_g _l_o_s_t _f_i_l_e_s 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: % vi -r _n_a_m_e replacing _n_a_m_e with the name of the file which you were editing. This will recover your work to a point near where you left off.+ You can get a listing of the files which are saved for you by giving the command: % vi -r 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. For this feature to work, _v_i must be correctly installed by a super user on your system, and the _m_a_i_l pro- gram must exist to receive mail. The invocation ``_v_i -_r'' __________________________ + 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. September 2, 1987 - 23 - will not always list all saved files, but they can be recovered even if they are not listed. _6._5. _C_o_n_t_i_n_u_o_u_s _t_e_x_t _i_n_p_u_t When you are typing in large amounts of text it is con- venient to have lines broken near the right margin automati- cally. You can cause this to happen by giving the command :se wm=10CR. This causes all lines to be broken at a space at least 10 columns from the right hand edge of the screen. If the editor breaks an input line and you wish to put it back together you can tell it to join the lines with J. You can give J a count of the number of lines to be joined as in 3J 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 x if you don't want it. _6._6. _F_e_a_t_u_r_e_s _f_o_r _e_d_i_t_i_n_g _p_r_o_g_r_a_m_s The editor has a number of commands for editing pro- grams. The thing that most distinguishes editing of pro- grams from editing of text is the desirability of maintain- ing an indented structure to the body of the program. The editor has a _a_u_t_o_i_n_d_e_n_t facility for helping you generate correctly indented programs. To enable this facility you can give the command :se aiCR. Now try opening a new line with o and type some char- acters 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 ^D key to backtab over the supplied indentation. Each time you type ^D you back up one position, nor- mally to an 8 column boundary. This amount is settable; the editor has an option called _s_h_i_f_t_w_i_d_t_h which you can set to change this value. Try giving the command :se sw=4CR and then experimenting with autoindent again. For shifting lines in the program left and right, there are operators < and >. These shift the lines you specify right or left by one _s_h_i_f_t_w_i_d_t_h. Try << and >> which shift one line left or right, and <_L and >_L shifting the rest of the display left and right. 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 %. This will show you the matching parenthesis. This works also for braces { and }, and brack- ets [ and ]. September 2, 1987 - 24 - If you are editing C programs, you can use the [[ and ]] keys to advance or retreat to a line starting with a {, i.e. a function declaration at a time. When ]] is used with an operator it stops after a line which starts with }; this is sometimes useful with y]]. _6._7. _F_i_l_t_e_r_i_n_g _p_o_r_t_i_o_n_s _o_f _t_h_e _b_u_f_f_e_r You can run system commands over portions of the buffer using the operator !. 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 !}sortCR. This says to sort the next paragraph of material, and the blank line ends a paragraph. _6._8. _C_o_m_m_a_n_d_s _f_o_r _e_d_i_t_i_n_g _L_I_S_P If you are editing a LISP program you should set the option _l_i_s_p by doing :se lispCR. This changes the ( and ) commands to move backward and forward over s-expressions. The { and } commands are like ( and ) but don't stop at atoms. These can be used to skip to the next list, or through a comment quickly. The _a_u_t_o_i_n_d_e_n_t option works differently for LISP, sup- plying 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. There is another option which is useful for typing in LISP, the _s_h_o_w_m_a_t_c_h option. Try setting it with :se smCR 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. The editor also has an operator to realign existing lines as though they had been typed in with _l_i_s_p and _a_u_t_o_i_n_- _d_e_n_t set. This is the = operator. Try the command =% at the beginning of a function. This will realign all the lines of the function declaration. When you are editing LISP,, the [[ and ]] advance and retreat to lines beginning with a (, and are useful for dealing with entire function definitions. _6._9. _M_a_c_r_o_s _V_i has a parameterless macro facility, which lets you set it up so that when you hit a single keystroke, the edi- tor will act as though you had hit some longer sequence of September 2, 1987 - 25 - keys. You can set this up if you find yourself typing the same sequence of commands repeatedly. Briefly, there are two flavors of macros: a) Ones where you put the macro body in a buffer register, say _x. You can then type @x to invoke the macro. The @ may be followed by another @ to repeat the last macro. b) You can use the _m_a_p command from _v_i (typically in your _E_X_I_N_I_T) with a command of the form: :map _l_h_s _r_h_sCR mapping _l_h_s into _r_h_s. There are restrictions: _l_h_s should be one keystroke (either 1 character or one function key) since it must be entered within one second (unless _n_o_t_i_m_e_o_u_t is set, in which case you can type it as slowly as you wish, and _v_i will wait for you to finish it before it echoes anything). The _l_h_s can be no longer than 10 characters, the _r_h_s no longer than 100. To get a space, tab or newline into _l_h_s or _r_h_s you should escape them with a ^V. (It may be necessary to double the ^V if the map command is given inside _v_i, rather than in _e_x.) Spaces and tabs inside the _r_h_s need not be escaped. Thus to make the q key write and exit the editor, you can give the command :map q :wq^V^VCR CR which means that whenever you type q, it will be as though you had typed the four characters :wqCR. A ^V's is needed because without it the CR would end the : command, rather than becoming part of the _m_a_p definition. There are two ^_V's because from within _v_i, two ^_V's must be typed to get one. The first CR is part of the _r_h_s, the second terminates the : command. Macros can be deleted with unmap lhs If the _l_h_s of a macro is ``#0'' through ``#9'', this maps the particular function key instead of the 2 character ``#'' sequence. So that terminals without function keys can access such definitions, the form ``#x'' will mean function key _x on all terminals (and need not be typed within one second.) The character ``#'' can be changed by using a macro in the usual way: September 2, 1987 - 26 - :map ^V^V^I # to use tab, for example. (This won't affect the _m_a_p com- mand, which still uses #, but just the invocation from visual mode. The undo command reverses an entire macro call as a unit, if it made any changes. Placing a `!' after the word _m_a_p causes the mapping to apply to input mode, rather than command mode. Thus, to arrange for ^T to be the same as 4 spaces in input mode, you can type: :map ^T ^Vb/b/b/b/ where _b/ is a blank. The ^V is necessary to prevent the blanks from being taken as white space between the _l_h_s and _r_h_s. _7. _W_o_r_d _A_b_b_r_e_v_i_a_t_i_o_n_s A feature similar to macros in input mode is word abbreviation. This allows you to type a short word and have it expanded into a longer word or words. The commands are :_a_b_b_r_e_v_i_a_t_e and :_u_n_a_b_b_r_e_v_i_a_t_e (:ab and :_u_n_a) and have the same syntax as :_m_a_p. For example: :ab eecs Electrical Engineering and Computer Sciences causes the word `eecs' to always be changed into the phrase `Electrical Engineering and Computer Sciences'. Word abbre- viation is different from macros in that only whole words are affected. If `eecs' were typed as part of a larger word, it would be left alone. Also, the partial word is echoed as it is typed. There is no need for an abbreviation to be a single keystroke, as it should be with a macro. _7._1. _A_b_b_r_e_v_i_a_t_i_o_n_s The editor has a number of short commands which abbre- viate 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. _8. _N_i_t_t_y-_g_r_i_t_t_y _d_e_t_a_i_l_s _8._1. _L_i_n_e _r_e_p_r_e_s_e_n_t_a_t_i_o_n _i_n _t_h_e _d_i_s_p_l_a_y The editor folds long logical lines onto many physical lines in the display. Commands which advance lines advance logical lines and will skip over all the segments of a line September 2, 1987 - 27 - in one motion. The command | 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 80| on a line which is more than 80 columns long.+ 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 line 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 ^R command. If you wish, you can have the editor place line numbers before each line on the display. Give the command :se nuCR to enable this, and the command :se nonuCR to turn it off. You can have tabs represented as ^I and the ends of lines indicated with `$' by giving the command :se listCR; :se nolistCR turns this off. 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. _8._2. _C_o_u_n_t_s Most _v_i 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: new window size : / ? [[ ]] ` ' scroll amount ^D ^U line/column number z G | repeat effect most of the rest The editor maintains a notion of the current default window size. On terminals which run at speeds greater than 1200 baud the editor uses the full terminal screen. On ter- minals which are slower than 1200 baud (most dialup lines are in this group) the editor uses 8 lines as the default window size. At 1200 baud the default is 16 lines. 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 __________________________ + You can make long lines very easily by using J to join together short lines. September 2, 1987 - 28 - 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 - or similar command or off the bottom with a command such as RETURN or ^D. The window will revert to the last specified size the next time it is cleared and refilled.+ The scroll commands ^D and ^U 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 10a+----ESC will insert a grid-like string of text. A few commands also use a preceding count as a line or column number. Except for a few commands which ignore any counts (such as ^R), the rest of the editor commands use a count to indi- cate a simple repetition of their effect. Thus 5w advances five words on the current line, while 5RETURN advances five lines. A very useful instance of a count as a repetition is a count given to the . command, which repeats the last changing command. If you do dw and then 3., you will delete first one and then three words. You can then delete two more words with 2.. _8._3. _M_o_r_e _f_i_l_e _m_a_n_i_p_u_l_a_t_i_o_n _c_o_m_m_a_n_d_s The following table lists the file manipulation com- mands which you can use when you are in _v_i. All of these commands are followed by a CR or ESC. The most basic com- mands are :w and :e. A normal editing session on a single file will end with a ZZ command. If you are editing for a long period of time you can give :w commands occasionally after major amounts of editing, and then finish with a ZZ. When you edit more than one file, you can finish with one with a :w and start editing a new file by giving a :e com- mand, or set _a_u_t_o_w_r_i_t_e and use :n . 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 ! after the command you would otherwise use; this forces the editor to discard any changes you have made. Use this care- fully. The :e command can be given a + argument to start at the end of the file, or a +_n argument to start at line _n. In actuality, _n may be any editor command not containing a space, usefully a scan like +/_p_a_t or +?_p_a_t. In forming new __________________________ + But not by a ^L which just redraws the screen as it is. September 2, 1987 - 29 - :w write back changes :wq write and quit :x write (if necessary) and quit (same as ZZ). :e _n_a_m_e edit file _n_a_m_e :e! reedit, discarding changes :e + _n_a_m_e edit, starting at end :e +_n edit, starting at line _n :e # edit alternate file :w _n_a_m_e write file _n_a_m_e :w! _n_a_m_e overwrite file _n_a_m_e :_x,_yw _n_a_m_e write lines _x through _y to _n_a_m_e :r _n_a_m_e read file _n_a_m_e into buffer :r !_c_m_d read output of _c_m_d into buffer :n edit next file in argument list :n! edit next file, discarding changes to current :n _a_r_g_s specify new argument list :ta _t_a_g edit file containing tag _t_a_g, at _t_a_g names to the e command, you can use the character % which is replaced by the current file name, or the character # 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 :e and get a diagnos- tic that you haven't written the file, you can give a :w command and then a :e # command to redo the previous :e. You can write part of the buffer to a file by finding out the lines that bound the range to be written using ^G, and giving these numbers after the : and before the w, separated by ,'s. You can also mark these lines with m and then use an address of the form '_x,'_y on the w command here. You can read another file into the buffer after the current line by using the :r command. You can similarly read in the output from a command, just use !_c_m_d instead of a file name. 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 :n. It is also possible to respecify the list of files to be edited by giving the :n command a list of file names, or a pattern to be expanded as you would have given it on the initial _v_i command. If you are editing large programs, you will find the :ta command very useful. It utilizes a data base of func- tion names and their locations, which can be created by pro- grams such as _c_t_a_g_s, to quickly find a function whose name you give. If the :ta command will require the editor to switch files, then you must :w or abandon any changes before switching. You can repeat the :ta command without any September 2, 1987 - 30 - arguments to look for the same tag again. _8._4. _M_o_r_e _a_b_o_u_t _s_e_a_r_c_h_i_n_g _f_o_r _s_t_r_i_n_g_s When you are searching for strings in the file with / and ?, the editor normally places you at the next or previ- ous occurrence of the string. If you are using an operator such as d, c or y, 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 /_p_a_t/-_n to refer to the _n'th line before the next line containing _p_a_t, or you can use + instead of - to refer to the lines after the one containing _p_a_t. If you don't give a line offset, then the editor will affect characters up to the match place, rather than whole lines; thus use ``+0'' to affect to the line which matches. You can have the editor ignore the case of words in the searches it does by giving the command :se icCR. The com- mand :se noicCR turns this off. Strings given to searches may actually be regular expressions. If you do not want or need this facility, you should set nomagic in your EXINIT. In this case, only the characters |^ and $ are special in patterns. The character \ is also then spe- cial (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 \ before a / in a forward scan or a ? in a backward scan, in any case. The following table gives the extended forms when magic is set. |^ at beginning of pattern, matches beginning of line $ at end of pattern, matches end of line . matches any character \< matches the beginning of a word \> matches the end of a word [_s_t_r] matches any single character in _s_t_r [|^_s_t_r] matches any single character not in _s_t_r [_x-_y] matches any character between _x and _y * matches any number of the preceding pattern If you use nomagic mode, then the . [ and * primitives are given with a preceding \. _8._5. _M_o_r_e _a_b_o_u_t _i_n_p_u_t _m_o_d_e There are a number of characters which you can use to make corrections during input mode. These are summarized in the following table. September 2, 1987 - 31 - ^H deletes the last input character ^W deletes the last input word, defined as by b erase your erase character, same as ^H kill your kill character, deletes the input on this line \ escapes a following ^H and your erase and kill ESC ends an insertion DEL interrupts an insertion, terminating it abnormally CR starts a new line ^D backtabs over _a_u_t_o_i_n_d_e_n_t 0^D kills all the _a_u_t_o_i_n_d_e_n_t |^^D same as 0^D, but restores indent next line ^V quotes the next non-printing character into the file The most usual way of making corrections to input is by typing ^H to correct a single character, or by typing one or more ^W's to back over incorrect words. If you use # as your erase character in the normal system, it will work like ^H. Your system kill character, normally @, ^X or ^U, 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 ESC to end the insertion, move over and make the correc- tion, and then return to where you were to continue. The command A which appends at the end of the current line is often useful for continuing. If you wish to type in your erase or kill character (say # or @) then you must precede it with a \, 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 ^V. The ^V echoes as a |^ 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.* __________________________ * This is not quite true. The implementation of the editor does not allow the NULL (^@) character to appear in files. Also the LF (linefeed or ^J) 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 edi- tor to echo the |^ before you type the character. In fact, the editor will treat a following letter as a re- quest for the corresponding control character. This is the only way to type ^S or ^Q, since the system normal- September 2, 1987 - 32 - If you are using _a_u_t_o_i_n_d_e_n_t you can backtab over the indent which it supplies by typing a ^D. This backs up to a _s_h_i_f_t_w_i_d_t_h boundary. This only works immediately after the supplied _a_u_t_o_i_n_d_e_n_t. When you are using _a_u_t_o_i_n_d_e_n_t you may wish to place a label at the left margin of a line. The way to do this easily is to type |^ and then ^D. The editor will move the cursor to the left margin for one line, and restore the pre- vious indent on the next. You can also type a 0 followed immediately by a ^D if you wish to kill all the indent and not have it come back on the next line. _8._6. _U_p_p_e_r _c_a_s_e _o_n_l_y _t_e_r_m_i_n_a_l_s If your terminal has only upper case, you can still use _v_i by using the normal system convention for typing on such a terminal. Characters which you normally type are con- verted to lower case, and you can type upper case letters by preceding them with a \. The characters { ~ } | ` are not available on such terminals, but you can escape them as \( \|^ \) \! \'. These characters are represented on the display in the same way they are typed.++ _8._7. _V_i _a_n_d _e_x _V_i is actually one mode of editing within the editor _e_x. When you are running _v_i you can escape to the line oriented editor of _e_x by giving the command Q. All of the : commands which were introduced above are available in _e_x. Likewise, most _e_x commands can be invoked from _v_i using :. Just give them without the : and follow them with a CR. In rare instances, an internal error may occur in _v_i. In this case you will get a diagnostic and be left in the command mode of _e_x. You can then save your work and quit if you wish by giving a command x after the : which _e_x prompts you with, or you can reenter _v_i by giving _e_x a _v_i command. There are a number of things which you can do more easily in _e_x than in _v_i. Systematic changes in line oriented material are particularly easy. You can read the advanced editing documents for the editor _e_d to find out a lot more about this style of editing. Experienced users often mix their use of _e_x command mode and _v_i command mode to speed the work they are doing. __________________________ ly uses them to suspend and resume output and never gives them to the editor to process. ++ The \ character you give will not echo until you type another key. September 2, 1987 - 33 - _8._8. _O_p_e_n _m_o_d_e: _v_i _o_n _h_a_r_d_c_o_p_y _t_e_r_m_i_n_a_l_s _a_n_d ``_g_l_a_s_s _t_t_y'_s'' |= 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 _v_i, but in a different mode. When you give a _v_i command, the editor will tell you that it is using _o_p_e_n mode. This name comes from the _o_p_e_n command in _e_x, which is used to get into the same mode. The only difference between _v_i_s_u_a_l mode and _o_p_e_n mode is the way in which the text is displayed. In _o_p_e_n 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 _v_i work differently in _o_p_e_n: _z and ^R. The _z command does not take parameters, but rather draws a win- dow of context around the current line and then returns you to the current line. If you are on a hardcopy terminal, the ^_R command will retype the current line. On such terminals, the editor nor- mally 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 \'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. It is sometimes useful to use this mode on very slow terminals which can support _v_i in the full screen mode. You can do this by entering _e_x and using an _o_p_e_n command. _A_c_k_n_o_w_l_e_d_g_e_m_e_n_t_s Bruce Englar encouraged the early development of this display editor. Peter Kessler helped bring sanity to ver- sion 2's command layout. Bill Joy wrote versions 1 and 2.0 through 2.7, and created the framework that users see in the present editor. Mark Horton added macros and other features and made the editor work on a large number of terminals and Unix systems. _A_p_p_e_n_d_i_x: _c_h_a_r_a_c_t_e_r _f_u_n_c_t_i_o_n_s This appendix gives the uses the editor makes of each character. The characters are presented in their order in the ASCII character set: Control characters come first, then most special characters, then the digits, upper and then lower case characters. September 2, 1987 - 34 - For each character we tell a meaning it has as a com- mand and any meaning it has during an insert. If it has only meaning as a command, then only this is discussed. Section numbers in parentheses indicate where the character is discussed; a `f' after the section number means that the character is mentioned in a footnote. ^@ Not a command character. If typed as the first character of an insertion it is replaced with the last text inserted, and the insert terminates. Only 128 characters are saved from the last insert; if more charac- ters were inserted the mechanism is not available. A ^@ cannot be part of the file due to the editor implementation (7.5f). ^A Unused. ^B Backward window. A count specifies repeti- tion. Two lines of continuity are kept if possible (2.1, 6.1, 7.2). ^C Unused. ^D As a command, scrolls down a half-window of text. A count gives the number of (logical) lines to scroll, and is remembered for future ^D and ^U commands (2.1, 7.2). During an insert, backtabs over _a_u_t_o_i_n_d_e_n_t white space at the beginning of a line (6.6, 7.5); this white space cannot be backspaced over. ^E Exposes one more line below the current screen in the file, leaving the cursor where it is if possible. (Version 3 only.) ^F Forward window. A count specifies repeti- tion. Two lines of continuity are kept if possible (2.1, 6.1, 7.2). ^G Equivalent to :fCR, printing the current file, whether it has been modified, the current line number and the number of lines in the file, and the percentage of the way through the file that you are. ^H (BS) Same as _l_e_f_t _a_r_r_o_w. (See _h). During an insert, eliminates the last input character, backing over it but not erasing it; it remains so you can see what you typed if you wish to type something only slightly dif- ferent (3.1, 7.5). ^I (TAB) Not a command character. When inserted it September 2, 1987 - 35 - prints as some number of spaces. When the cursor is at a tab character it rests at the last of the spaces which represent the tab. The spacing of tabstops is controlled by the _t_a_b_s_t_o_p option (4.1, 6.6). ^J (LF) Same as _d_o_w_n _a_r_r_o_w (see _j). ^K Unused. ^L The ASCII formfeed character, this causes the screen to be cleared and redrawn. This is useful after a transmission error, if charac- ters typed by a program other than the editor scramble the screen, or after output is stopped by an interrupt (5.4, 7.2f). ^M (CR) A carriage return advances to the next line, at the first non-white position in the line. Given a count, it advances that many lines (2.3). During an insert, a CR causes the insert to continue onto another line (3.1). ^N Same as _d_o_w_n _a_r_r_o_w (see _j). ^O Unused. ^P Same as _u_p _a_r_r_o_w (see _k). ^Q Not a command character. In input mode, ^_Q quotes the next character, the same as ^_V, except that some teletype drivers will eat the ^_Q so that the editor never sees it. ^R Redraws the current screen, eliminating logi- cal lines not corresponding to physical lines (lines with only a single @ character on them). On hardcopy terminals in _o_p_e_n mode, retypes the current line (5.4, 7.2, 7.8). ^S Unused. Some teletype drivers use ^_S to suspend output until ^_Qis ^T Not a command character. During an insert, with _a_u_t_o_i_n_d_e_n_t set and at the beginning of the line, inserts _s_h_i_f_t_w_i_d_t_h white space. ^U Scrolls the screen up, inverting ^D which scrolls down. Counts work as they do for ^D, and the previous scroll amount is common to both. On a dumb terminal, ^U will often necessitate clearing and redrawing the screen further back in the file (2.1, 7.2). September 2, 1987 - 36 - ^V Not a command character. In input mode, quotes the next character so that it is pos- sible to insert non-printing and special characters into the file (4.2, 7.5). ^W Not a command character. During an insert, backs up as b would in command mode; the deleted characters remain on the display (see ^H) (7.5). ^X Unused. ^Y Exposes one more line above the current screen, leaving the cursor where it is if possible. (No mnemonic value for this key; however, it is next to ^U which scrolls up a bunch.) (Version 3 only.) ^Z If supported by the Unix system, stops the editor, exiting to the top level shell. Same as :stopCR. Otherwise, unused. ^[ (ESC) Cancels a partially formed command, such as a z when no following character has yet been given; terminates inputs on the last line (read by commands such as : / and ?); ends insertions of new text into the buffer. If an ESC is given when quiescent in command state, the editor rings the bell or flashes the screen. You can thus hit ESC if you don't know what is happening till the editor rings the bell. If you don't know if you are in insert mode you can type ESCa, and then material to be input; the material will be inserted correctly whether or not you were in insert mode when you started (1.5, 3.1, 7.5). ^\ Unused. ^] Searches for the word which is after the cur- sor as a tag. Equivalent to typing :ta, this word, and then a CR. Mnemonically, this com- mand is ``go right to'' (7.3). ^|^ Equivalent to :e #CR, returning to the previ- ous position in the last edited file, or editing a file which you specified if you got a `No write since last change diagnostic' and do not want to have to type the file name again (7.3). (You have to do a :w before ^|^ will work in this case. If you do not wish to write the file you should do :e! #CR instead.) September 2, 1987 - 37 - ^_ Unused. Reserved as the command character for the Tektronix 4025 and 4027 terminal. SPACE Same as _r_i_g_h_t _a_r_r_o_w (see _l). ! An operator, which processes lines from the buffer with reformatting commands. Follow ! with the object to be processed, and then the command name terminated by CR. Doubling ! and preceding it by a count causes count lines to be filtered; otherwise the count is passed on to the object after the !. Thus 2!}_f_m_tCR reformats the next two paragraphs by running them through the program _f_m_t. If you are working on LISP, the command !%_g_r_i_n_dCR,* given at the beginning of a function, will run the text of the function through the LISP grinder (6.7, 7.3). To read a file or the output of a command into the buffer use :r (7.3). To simply execute a command use :! (7.3). " Precedes a named buffer specification. There are named buffers 1-9 used for saving deleted text and named buffers a-z into which you can place text (4.3, 6.3) # The macro character which, when followed by a number, will substitute for a function key on terminals without function keys (6.9). In input mode, if this is your erase character, it will delete the last character you typed in input mode, and must be preceded with a \ to insert it, since it normally backs over the last input character you gave. $ Moves to the end of the current line. If you :se listCR, then the end of each line will be shown by printing a $ after the end of the displayed text in the line. Given a count, advances to the count'th following end of line; thus 2$ advances to the end of the fol- lowing line. % Moves to the parenthesis or brace { } which balances the parenthesis or brace at the current cursor position. & A synonym for :&CR, by analogy with the _e_x & command. __________________________ *Both _f_m_t and _g_r_i_n_d are Berkeley programs and may not be present at all installations. September 2, 1987 - 38 - ' When followed by a ' returns to the previous context at the beginning of a line. The pre- vious context is set whenever the current line is moved in a non-relative way. When followed by a letter a-z, returns to the line which was marked with this letter with a m command, at the first non-white character in the line. (2.2, 5.3). When used with an operator such as d, the operation takes place over complete lines; if you use `, the opera- tion takes place from the exact marked place to the current cursor position within the line. ( Retreats to the beginning of a sentence, or to the beginning of a LISP s-expression if the _l_i_s_p option is set. A sentence ends at a . ! or ? which is followed by either the end of a line or by two spaces. Any number of closing ) ] " and ' characters may appear after the . ! or ?, and before the spaces or end of line. Sentences also begin at para- graph and section boundaries (see { and [[ below). A count advances that many sentences (4.2, 6.8). ) Advances to the beginning of a sentence. A count repeats the effect. See ( above for the definition of a sentence (4.2, 6.8). * Unused. + Same as CR when used as a command. , Reverse of the last f F t or T command, look- ing the other way in the current line. Espe- cially useful after hitting too many ; char- acters. A count repeats the search. - Retreats to the previous line at the first non-white character. This is the inverse of + and RETURN. If the line moved to is not on the screen, the screen is scrolled, or cleared and redrawn if this is not possible. If a large amount of scrolling would be required the screen is also cleared and redrawn, with the current line at the center (2.3). . Repeats the last command which changed the buffer. Especially useful when deleting words or lines; you can delete some words/lines and then hit . to delete more and more words/lines. Given a count, it passes September 2, 1987 - 39 - it on to the command being repeated. Thus after a 2dw, 3. deletes three words (3.3, 6.3, 7.2, 7.4). / Reads a string from the last line on the screen, and scans forward for the next occurrence of this string. The normal input editing sequences may be used during the input on the bottom line; an returns to com- mand state without ever searching. The search begins when you hit CR to terminate the pattern; the cursor moves to the begin- ning of the last line to indicate that the search is in progress; the search may then be terminated with a DEL or RUB, or by backspac- ing when at the beginning of the bottom line, returning the cursor to its initial position. Searches normally wrap end-around to find a string anywhere in the buffer. When used with an operator the enclosed region is normally affected. By mentioning an offset from the line matched by the pat- tern you can force whole lines to be affected. To do this give a pattern with a closing a closing / and then an offset +_n or -_n. To include the character / in the search string, you must escape it with a preceding \. A |^ at the beginning of the pattern forces the match to occur at the beginning of a line only; this speeds the search. A $ at the end of the pattern forces the match to occur at the end of a line only. More extended pattern matching is available, see section 7.4; unless you set nomagic in your ._e_x_r_c file you will have to preceed the char- acters . [ * and ~ in the search pattern with a \ to get them to work as you would naively expect (1.5, 2,2, 6.1, 7.2, 7.4). 0 Moves to the first character on the current line. Also used, in forming numbers, after an initial 1-9. 1-9 Used to form numeric arguments to commands (2.3, 7.2). : A prefix to a set of commands for file and option manipulation and escapes to the sys- tem. Input is given on the bottom line and terminated with an CR, and the command then executed. You can return to where you were September 2, 1987 - 40 - by hitting DEL or RUB if you hit : acciden- tally (see primarily 6.2 and 7.3). ; Repeats the last single character find which used f F t or T. A count iterates the basic scan (4.1). < An operator which shifts lines left one _s_h_i_f_t_w_i_d_t_h, normally 8 spaces. Like all operators, affects lines when repeated, as in <<. Counts are passed through to the basic object, thus 3<< shifts three lines (6.6, 7.2). = Reindents line for LISP, as though they were typed in with _l_i_s_p and _a_u_t_o_i_n_d_e_n_t set (6.8). > An operator which shifts lines right one _s_h_i_f_t_w_i_d_t_h, normally 8 spaces. Affects lines when repeated as in >>. Counts repeat the basic object (6.6, 7.2). ? Scans backwards, the opposite of /. See the / description above for details on scanning (2.2, 6.1, 7.4). @ A macro character (6.9). If this is your kill character, you must escape it with a \ to type it in during input mode, as it nor- mally backs over the input you have given on the current line (3.1, 3.4, 7.5). A Appends at the end of line, a synonym for $a (7.2). B Backs up a word, where words are composed of non-blank sequences, placing the cursor at the beginning of the word. A count repeats the effect (2.4). C Changes the rest of the text on the current line; a synonym for c$. D Deletes the rest of the text on the current line; a synonym for d$. E Moves forward to the end of a word, defined as blanks and non-blanks, like B and W. A count repeats the effect. F Finds a single following character, backwards in the current line. A count repeats this search that many times (4.1). September 2, 1987 - 41 - G Goes to the line number given as preceding argument, or the end of the file if no preceding count is given. The screen is redrawn with the new current line in the center if necessary (7.2). H _H_o_m_e _a_r_r_o_w. Homes the cursor to the top line on the screen. If a count is given, then the cursor is moved to the count'th line on the screen. In any case the cursor is moved to the first non-white character on the line. If used as the target of an operator, full lines are affected (2.3, 3.2). I Inserts at the beginning of a line; a synonym for |^i. J Joins together lines, supplying appropriate white space: one space between words, two spaces after a ., and no spaces at all if the first character of the joined on line is ). A count causes that many lines to be joined rather than the default two (6.5, 7.1f). K Unused. L Moves the cursor to the first non-white char- acter of the last line on the screen. With a count, to the first non-white of the count'th line from the bottom. Operators affect whole lines when used with L (2.3). M Moves the cursor to the middle line on the screen, at the first non-white position on the line (2.3). N Scans for the next match of the last pattern given to / or ?, but in the reverse direc- tion; this is the reverse of n. O Opens a new line above the current line and inputs text there up to an ESC. A count can be used on dumb terminals to specify a number of lines to be opened; this is generally obsolete, as the _s_l_o_w_o_p_e_n option works better (3.1). P Puts the last deleted text back before/above the cursor. The text goes back as whole lines above the cursor if it was deleted as whole lines. Otherwise the text is inserted between the characters before and at the cur- sor. May be preceded by a named buffer specification "_x to retrieve the contents of September 2, 1987 - 42 - the buffer; buffers 1-9 contain deleted material, buffers a-z are available for gen- eral use (6.3). Q Quits from _v_i to _e_x command mode. In this mode, whole lines form commands, ending with a RETURN. You can give all the : commands; the editor supplies the : as a prompt (7.7). R Replaces characters on the screen with char- acters you type (overlay fashion). Ter- minates with an ESC. S Changes whole lines, a synonym for cc. A count substitutes for that many lines. The lines are saved in the numeric buffers, and erased on the screen before the substitution begins. T Takes a single following character, locates the character before the cursor in the current line, and places the cursor just after that character. A count repeats the effect. Most useful with operators such as d (4.1). U Restores the current line to its state before you started changing it (3.5). V Unused. W Moves forward to the beginning of a word in the current line, where words are defined as sequences of blank/non-blank characters. A count repeats the effect (2.4). X Deletes the character before the cursor. A count repeats the effect, but only characters on the current line are deleted. Y Yanks a copy of the current line into the unnamed buffer, to be put back by a later p or P; a very useful synonym for yy. A count yanks that many lines. May be preceded by a buffer name to put lines in that buffer (7.4). ZZ Exits the editor. (Same as :xCR.) If any changes have been made, the buffer is written out to the current file. Then the editor quits. [[ Backs up to the previous section boundary. A section begins at each macro in the _s_e_c_t_i_o_n_s September 2, 1987 - 43 - option, normally a `.NH' or `.SH' and also at lines which which start with a formfeed ^L. Lines beginning with { also stop [[; this makes it useful for looking backwards, a function at a time, in C programs. If the option _l_i_s_p is set, stops at each ( at the beginning of a line, and is thus useful for moving backwards at the top level LISP objects. (4.2, 6.1, 6.6, 7.2). \ Unused. ]] Forward to a section boundary, see [[ for a definition (4.2, 6.1, 6.6, 7.2). |^ Moves to the first non-white position on the current line (4.4). _ Unused. ` When followed by a ` returns to the previous context. The previous context is set when- ever the current line is moved in a non- relative way. When followed by a letter a-z, returns to the position which was marked with this letter with a m command. When used with an operator such as d, the operation takes place from the exact marked place to the current position within the line; if you use ', the operation takes place over complete lines (2.2, 5.3). a Appends arbitrary text after the current cur- sor position; the insert can continue onto multiple lines by using RETURN within the insert. A count causes the inserted text to be replicated, but only if the inserted text is all on one line. The insertion terminates with an ESC (3.1, 7.2). b Backs up to the beginning of a word in the current line. A word is a sequence of alphanumerics, or a sequence of special char- acters. A count repeats the effect (2.4). c An operator which changes the following object, replacing it with the following input text up to an ESC. If more than part of a single line is affected, the text which is changed away is saved in the numeric named buffers. If only part of the current line is affected, then the last character to be changed away is marked with a $. A count causes that many objects to be affected, thus September 2, 1987 - 44 - both 3c) and c3) change the following three sentences (7.4). d An operator which deletes the following object. If more than part of a line is affected, the text is saved in the numeric buffers. A count causes that many objects to be affected; thus 3dw is the same as d3w (3.3, 3.4, 4.1, 7.4). e Advances to the end of the next word, defined as for b and w. A count repeats the effect (2.4, 3.1). f Finds the first instance of the next charac- ter following the cursor on the current line. A count repeats the find (4.1). g Unused. Arrow keys _h, _j, _k, _l, and _H. h _L_e_f_t _a_r_r_o_w. Moves the cursor one character to the left. Like the other arrow keys, either _h, the _l_e_f_t _a_r_r_o_w key, or one of the synonyms (^H) has the same effect. On v2 editors, arrow keys on certain kinds of ter- minals (those which send escape sequences, such as vt52, c100, or hp) cannot be used. A count repeats the effect (3.1, 7.5). i Inserts text before the cursor, otherwise like a (7.2). j _D_o_w_n _a_r_r_o_w. Moves the cursor one line down in the same column. If the position does not exist, _v_i comes as close as possible to the same column. Synonyms include ^_J (linefeed) and ^_N. k _U_p _a_r_r_o_w. Moves the cursor one line up. ^_P is a synonym. l _R_i_g_h_t _a_r_r_o_w. Moves the cursor one character to the right. SPACE is a synonym. m Marks the current position of the cursor in the mark register which is specified by the next character a-z. Return to this position or use with an operator using ` or ' (5.3). n Repeats the last / or ? scanning commands (2.2). September 2, 1987 - 45 - o Opens new lines below the current line; oth- erwise like O (3.1). p Puts text after/below the cursor; otherwise like P (6.3). q Unused. r Replaces the single character at the cursor with a single character you type. The new character may be a RETURN; this is the easi- est way to split lines. A count replaces each of the following count characters with the single character given; see R above which is the more usually useful iteration of r (3.2). s Changes the single character under the cursor to the text which follows up to an ESC; given a count, that many characters from the current line are changed. The last character to be changed is marked with $ as in c (3.2). t Advances the cursor upto the character before the next character typed. Most useful with operators such as d and c to delete the char- acters up to a following character. You can use . to delete more if this doesn't delete enough the first time (4.1). u Undoes the last change made to the current buffer. If repeated, will alternate between these two states, thus is its own inverse. When used after an insert which inserted text on more than one line, the lines are saved in the numeric named buffers (3.5). v Unused. w Advances to the beginning of the next word, as defined by b (2.4). x Deletes the single character under the cur- sor. With a count deletes deletes that many characters forward from the cursor position, but only on the current line (6.5). y An operator, yanks the following object into the unnamed temporary buffer. If preceded by a named buffer specification, "_x, the text is placed in that buffer also. Text can be recovered by a later p or P (7.4). z Redraws the screen with the current line September 2, 1987 - 46 - placed as specified by the following charac- ter: RETURN specifies the top of the screen, . the center of the screen, and - at the bot- tom of the screen. A count may be given after the z and before the following charac- ter to specify the new screen size for the redraw. A count before the z gives the number of the line to place in the center of the screen instead of the default current line. (5.4) { Retreats to the beginning of the beginning of the preceding paragraph. A paragraph begins at each macro in the _p_a_r_a_g_r_a_p_h_s option, nor- mally `.IP', `.LP', `.PP', `.QP' and `.bp'. A paragraph also begins after a completely empty line, and at each section boundary (see [[ above) (4.2, 6.8, 7.6). | Places the cursor on the character in the column specified by the count (7.1, 7.2). } Advances to the beginning of the next para- graph. See { for the definition of paragraph (4.2, 6.8, 7.6). ~ Unused. ^? (DEL) Interrupts the editor, returning it to com- mand accepting state (1.5, 7.5) September 2, 1987 - 47 - . September 2, 1987