Last update: Saturday 16th April 2005 11:18 PT, AHD vi hints -------- This document is an aide-memoire for the author and is not a tutorial for beginners. O'Reilly has an excellent book by Linda Lamb entitled: "Learning the vi Editor" vi is a modal editor, meaning it functions in using modes. vi has three modes: ------------------ Command mode - where editing commands such as dd to delete the current line are entered. Pressing the Esc key turns on command mode. Input mode - where text can be entered into any line of text. Input mode is turned on (the only time text entry is permitted) by giving the a, o or i commands in command mode. Status line mode - is used to enter long commands at the bottom of the screen. To enter status mode, press Esc followed by : then type further instructions such as wq to write (save) the current file and quit. Short vi Command List --------------------- vi filename open the vi editor with filename Cursor ops Up, Down, Left & Right arrow keys as required :w Write :wq Write and quit :q Quit without saving if no changes have been made :q! Quit without save, even after change to file Esc a Insert characters to right Esc A Insert characters at end-of-line Esc i Insert left of cursor Esc I Insert at beginning of line Esc o Insert line below cursor Esc O Insert line above cursor Esc x Delete text at cursor Esc dw Delete word right Esc DD Delete line Esc D Delete part of line to right of cursor For a full command list type man vi Search/Replace -------------- To search in vi first make sure you are in command mode (press Esc). Press Esc and then press / followed by your search phrase. To do a case insensitive search, first go into command mode and set case insensitive mode. :set ic Replacing text can be done one of many ways. To replace all text in the file use :%s/old/new/g If you only want to replace text on a block of text you can use :10,20s/old/new/g to replace all text between lines 10 to 20. In addition, the g at the end of the line tells vi to replace all occurrences in the line, not just the first one. Cut/Paste/Buffers ----------------- There are two basic methods to cut and paste in vi. You can use the global buffer, for example, by pressing YY to "Yank" the current line into the global buffer. Then you can paste below the current line using p. You could, of course, add a number of lines to yank into the buffer. 30Y will Yank 30 lines into the buffer. Using named buffers or registers allows you to have more then one in memory at a time. To yank into the buffer A, we would use "a10Y to grab 10 lines into buffer A. Then to paste them, a simple "ap would paste them into the document. Buffers are not case sensitive so A is the same as 'a'. vi calling vi (for text input) without file-specification vi fn calling vi to edit a file fn vi -R fn calling vi in read-only mode on file fn 1.example: show/read file .exrc vi -R .exrc 2.example: edit all files corresponding to filenames *.da?? vi *.da?? This is a small file called 'vi.prac'. This is the second and last line. ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ "vi.prac" 2 lines 103 characters A typical vi screen vi modes command Normal and initial state. [ESC] cancels partial command insert entered by the following commands: a, A, i, I, o, O, c, C, s, S, R. Terminates with [ESC] (or ^C). status line entered by :, /, ? or !. Input is read and echoed at the bottom of the screen. Commands executed by [RETURN] or [ESC], terminated by ^C. Entering and leaving vi vi file edit file vi +n file edit starting at line n vi + file edit starting at end vi +/RE/ file edit starting at RE view file read only mode ZZ exit from vi, saving changes (same as :wq) ^Z stop vi process, for later resumption File manipulation The following are all status line mode commands, so must be preceded by a colon. w save changes, continue editing wq save and quit q quit q! quit, discarding changes w file write to file r file insert from file (at cursor position) e file edit file e! re-edit current file, discarding changes w! file overwrite file ! command execute shell command, then return f show current file and line Some simple commands The following are examples of some compound commands, using the operators listed later. dw delete word dd delete line ndd delete n lines de delete word leaving punctuation xp transpose characters cw text [ESC] change word to text Positioning within the file ^F forward one 'page' ^B back one 'page' ^D scroll down half 'page' ^U scroll up half 'page' nG go to line n (last line default) /RE/ go to next occurrence of RE % find matching bracket Marking `` return to previous cursor position mx mark position with x `x go to mark x Line positioning j next line, same column (same as down arrow) k previous line, same column (same as up arrow) H top line of window (home) M middle line of window L last line of window + next line, at first non-white character - previous line, at first non-white character [RETURN] same as + Character positioning l move cursor right h move cursor left 0 beginning of line $ end of line ^ first non-white in line [SPACE] forward (same as right arrow) fx find x forwards in current line Fx find x backwards in current line ; repeat last find command forwards : repeat last find command backwards n| go to column n Words, sentences, paragraphs w forward to start of next word (delimited by non-alphanumeric character) b back to start of last word e forward to end of next word W as w, with word delimited by blank only B as b, with word delimited by blank only E as e, with word delimited by blank only ) forward to start of next sentence ( Back to start of next sentence } Forward to start of next sentence { Back to start of last sentence Corrections during insert H erase last character (or your usual delete key) W erase last word [ESC] ends insert; back to command mode \ escape character C ends insert Insert and replace commands a append after cursor i insert before cursor A append at end of line I insert before first non-blank o open line below current line O open line above current line [ESC] ends insert; back to command mode rx replace single character with x R string [ESC] replace characters by string Operators The following can be doubled to apply to a line and also preceded by a number to indicate a number of lines. They can be combined with positional commands (e.g.d$ to delete to end of line.) d delete c change y yank Miscellaneous operations x delete character X delete character to left of cursor C change rest of line (same as c$) D delete rest of line (same as d$) J join lines i [CR] [ESC] split line at cursor position Y yank (paste) lines Yank and put p put back after cursor P put back before cursor "xp put from buffer x "xy yank to buffer x "xd delete to buffer x Undo, redo and retrieve u undo last change U restore current line . repeat last command "np retrieve nth last delete manipulate the behaviour of vi /usr/bin/vi editor /etc/d.exrc (default) resource-file with editor settings $HOME/.exrc additive resource-file ****************************************