vi for REALITY "ED" Line-editor Users
Garrett Hildebrand
The simple guide to vi commands for pick ED experts.
If you are used to using the ROS 'ED' command, this document should serve you as a guide to using vi. It depicts the most commonly used ROS ED commands, and how they might be expressed in vi, the editor.
If you are using any other standard P[a-z]*k "ED" editor, this guide should come close enough to get you started in vi.
If you are using vi, you might find something in here, anyway.
Acknowledgements:
John C. Denney, May 1994, for certain corrections and an addition.
Pete Mastren, 15 July 1993, for the sequence required to do a merge of lines n-m from another file from within vi.
SONNENSCHEIN, "A Guide To vi," for information regarding splitting of lines and pattern-matching examples.
Dick Pick, for making me want to learn another operating system and editor.
ED (ROS) vi (UNIX) Comments --------------- --------------- ---------------------------------------------- *** Cursor Movement, Screen Positioning and Line Positioning *** Gn nG Goto line 'n'. n :n Alternate goto line 'n'.or j Move down one line. U1 k Move up one line. Nn n Move down 'n' lines. Un nk Move up 'n' lines. T 1G Top. B G Bottom. Ln n List 'n' lines. L22 (pagesize) ^F List one page (control-F in vi). U22[L22 ^B Display the previous page (control-B in vi). W ^L Re-display previous page worth of lines. *** Locating text *** L/sstr/ /sstr/ Locate, then list (or move to) line matching the search criteria /sstr/. L:sstr: /^sstr/ Locate, then list (or move to) the line which begins with 'sstr' (col1 search). A n Again or find next (literal character "n"). N Find prev. occurence of last /sstr/ search. Ln-m/sstr/ :n,mg/sstr/ List all occurences of /sstr/ in lines n-m. vi will simply move to the last line in n,m which contains a match for /sstr/. *** Search Criteria *** /sstr/ /sstr/ Simple pattern. :sstr: /^sstr/ Match on line beginning with 'sstr'. /sstr$/ Match on line ending with 'sstr'. /str1^str2/ /str1.str2/ ROS ED wildcard is '^' while vi's is '.'. Unix vi-only Search Patterns... \c interpret the character 'c' literally. . any single character except newline. * any number of characters. May follow '.' or any literal character, or a class... [class] - [] is used to surround a class to match one character... [string] match a char. for any character in string. [a-z] match a char. for any character in range. [^string] match a character for mismatch with all characters in string. \< beginning of word. \> end of word. ^ beginning of line (first char in /sstr/). $ end of line (usu. last char in /sstr/). *** Deleting lines *** DE dd Delete one line. DEn ndd Delete 'n' lines. DE9999 dG Delete to end-of-item (end of file). T[DEn 1Gndd Delete 'n' lines from the top of the item. d1G Delete from wherever you are to top of item. DE9999/sstr/ :g/sstr/d Delete all lines matching search criteria specified in /sstr/ :v/searchstr/d Delete all lines NOT(matching) the search criteria specified in /sstr/. DEn-m :n,md Delete lines 'n' through 'm'. DEn-m/sstr/ :n,mg/sstr/d Delete lines in the range 'n' through 'm' which match the search criteria specified in /sstr/. DE10 :.,+9dd Delete this line and the next nine. :.,/string/d -vi only- Delete all lines from the current position to the first occurence of /string/ *** Replacing Text *** Notes: str1 is any valid search criterion, as in sstr. str2 is simply a text string or a null string. R/str1/str2/ :s/str1/str2 Replace first occurence of 'str1' with 'str2'. R4/str1/str2/ :.,+3s/str1/str2 replace str1 with str2 on this and the next 3 lines (for 4, total). RU/str1/str2/ :s/str1/str2/g Replace all occurences of 'str1' with 'str2' (on the current line only). R9999/str1/str2 :g/str1/s//str2 Replace first occurence of 'str1' with 'str2' on all lines. :%s/str1/str2 <- More better! RU9999/str1/str2 :g/str1/s//str2/g Replace all occurences of 'str1' with 'str2' on all lines. :%s/str1/str2/g <- More better! Rn-m/str1/str2/ :n,ms/str1/str2 Replace first occurence of 'str1' with 'str2' on lines in the range of 'n' through 'm'. RUn-m/str1/str2 :n,ms/str1/str2/g Replace all occurences of 'str1' with 'str2' on lines in the range of 'n' through 'm'. R Sstring Replace current line. R/str1/str2^ /str1/ Replace str1 through end-of-line with str2. Cstr2 R/^^^^/str2/ Rstr2 Overtype characters with str2. ROS ED may require wildcards to be preceeded by a unique match string; vi will require the cursor to be positioned correctly. X u Undo last change (in vi, *all* lines are undone). AR & Repeat last change. ML !!tr A-Z a-z Lowercase characters on the current line. MU !!tr a-z A-Z Uppercase characters on the current line. MLn n!!tr A-Z a-z Lowercase characters on 'n' lines. MUn n!!tr a-z A-Z Uppercase characters on 'n' lines. ~ Toggle case of character under cursor. Note: ROS may have an MCL or MCU command, but it is unknown at this time. *** Inserting Text *** In vi, terminates insert or append mode. I o Enter insert mode after current line. O Enter insert mode before current line. i Enter insert mode at current cursor position. I Enter insert mode at beginning of the current line. AP/string/ $astring Append string to line. :s/$/string Another way... Astring <- More better! AP4/str :.,+3s/$/str Append str to this and the next 3 lines. *** Other stuff *** J J ROS ED leaves line joined in place after line joined with; vi does a true join of the two lines to create one where there were two. MEn-m'' :n,mt. Copy lines 'n' through 'm' after current line. :v/searchstr/d Delete all lines NOT(matching) the search criteria specified in /sstr/. :x,ytn Copy lines 'x' through 'y' after line 'n'. DEn-m[MEn-m'' :n,mm. Move lines 'n' through 'm' after current line. :x,ymn Move lines 'x' through 'y' after line 'n'. Multi-part command: Gk kG Goto line 'k'; DEn ndd Delete 'n' lines; Gi iG Goto line 'i'; MEn''k p Add in deleted lines here. End multi-part command. sp/sstr/ :s/str1/ str1/ Split line at 'str1'. R Split line at current cursor position. ME9999'itemid'1 :r itemid Merge in file/item 'itemid' after current line. MEn-m'itemid' (see below) Merge in lines 'n' through 'm' from itemid. vi has no way to merge in particular lines. Here are three methods you may use: Method One Merge (Compliments of pfm) Multi-part command (vi merge n-m'id'): G go to end of file :r file read the file ma mark this position /xyz/ locate beginning of section mb mark beginning /def/ locate end of section me mark end 'b back to beginning "ay'e yank to end into buffer a 'a back to top of file dG delete file /qrs/ locate context "ap insert contents of buffer a End multi-part command (vi merge). Method Two Merge Multi-part command (vi merge n-m'id'): :!vi -R itemid Escape to shell and vi the other file. :n,mw scratchid Write the desired lines to a scratch file. :q Exit from the other file, return to the original. :r scratchid Read in lines from other file to current position in current file. End multi-part command (vi merge). Method Three Merge :r! awk '{line[NR]=$0} END{for (i=n; i<=m; i++) print line[i]}' itemid - where 'n' is the start line, 'm' is the end line, 'itemid' is the UNIX filename and all other text is typed in exactly as shown. (Garrett's method) :command :!command Perform a TCL or shell command (disabled on ROS ED verb). :sh Go to the UNIX shell, stay until D input. FI :wq File the item and exit. FS :w File the item and don't exit. F no analog in vi. EX :q Exit. EXO :q! Exit, ignoring changes. *** vi-only stuff *** :set showmode Do this upon entering vi to cause the mode of operation to be displayed during insert-mode or append-mode operations. :set [no]number control display of line numbers. ^ Move to start of line. $ Move to end of line. % Move to matching curly-brace. { Move to beginning of paragraph. } Move to end of paragraph. ) Next sentence. ( Previous sentence. h Move left one character. l Move right one character. j Move down one line. k Move up one line. . Repeat most recent change of any kind. u Undo most recent change. U Undo only changes to current line. cw Change only current word. c$ Change from cursor to end of line. d$ Delete from cursor to end of line. D Delete to end-of-line. /sstr/ Search forwards for sstr. ?sstr? Search backwards for sstr. n Next match of sstr. N Previous match of sstr. f Page forward. d Half-page forwared. b Page backwards. u Half-page backward. G display current line, filename, etc. w Next word based on punctuation. W Next word skipping punctuation. b Previous word based on punctuation. W Previoius word skipping punctuation. a Append to right of cursor. A Append to right of current line. i Insert text. I Insert text at beginning of line. o Start new line below in insert mode (open). O As with 'o', but open above. r Replace current character. R Overwrite mode (escape out). s Substitute arbitrary text for current char. S Substitute arbitrary text for current line. c Change text from cursor until . C Change text until end of line. x Delete text one character at-a-time. dw Delete word. dd Delete line. :r !cmd Insert a line containing 'n' lines of output from executing the shell command 'cmd'. !fmt -n } Format the current paragraph (all lines to the next occurence of two contiguous end-of- lines. *** More on vi pattern matching: examples *** /r..d Matches road, read, rind and others. s/./fork Changes first character in line to string fork. :g/^/s//* Preceed all lines in the file with a '*'. :s/$/ EQU */ Append ' EQU *' to the end of the current line. /a* Find a string of zero or more a's. /aa* Find a string of one or more a's. /a Same: any string having at least 1 'a'. /^[^a]*$ Find a string having no a's anywhere in the line (not real intuitive). /r.*d Find any string starting with an 'r' and ending with a 'd'. /[0-9][0-9]* Find any number. s/[0-9][0-9]*/(&) Replace any arbitrary number with that same number in parentheses. /^!.*\*$ Find the next line beginning with '!' and ending with '*'.
Update 04 Mar 1996: Garrett has set up a collecting spot for vi information
at http://www.oac.uci.edu/indiv/gdh/vi.html
Version 2, Revision D - 29 Sept 1994
Version 2, Revision C - 03 June 1994
Version 2, Revisions A-B - 04 May 1994
Version 1, 15 July 1993
