In and out of vi
To Start vi
| vi filename | edit filename starting at line 1 |
| vi -r filename | recover filename that was being edited when system crashed |
To Exit vi
| :x<Return> | quit vi, writing out modified file to file named in original invocation |
| :wq<Return> | quit vi, writing out modified file to file named in original invocation |
| :q<Return> | quit (or exit) vi |
| :q!<Return> | quit vi even though latest changes have not been saved for this vi call |
Moving the Cursor
| j or <Return> [or down-arrow] | move cursor down one line |
| k [or up-arrow] | move cursor up one line |
| h or <Backspace> [or left-arrow] | move cursor left one character |
| l or <Space> [or right-arrow] | move cursor right one character |
| 0 (zero) | move cursor to start of current line (the one with the cursor) |
| $ | move cursor to end of current line |
| w | move cursor to beginning of next word |
| b | move cursor back to beginning of preceding word |
| :0<Return> or 1G | move cursor to first line in file |
| :n<Return> or nG | move cursor to line n |
| :$<Return> or G | move cursor to last line in file |
Screen Manipulation
| ^f | move forward one screen |
| ^b | move backward one screen |
| ^d | move down (forward) one half screen |
| ^u | move up (back) one half screen |
| ^l | redraws the screen |
| ^r | redraws the screen, removing deleted lines |
Adding, Changing, and Deleting Text
| u | UNDO WHATEVER YOU JUST DID; a simple toggle |
Inserting or Adding Text
| i | insert text before cursor, until <Esc> hit |
| I | insert text at beginning of current line, until <Esc> hit |
| a | append text after cursor, until <Esc> hit |
| A | append text to end of current line, until <Esc> hit |
| o | open and put text in a new line below current line, until <Esc> hit |
| O | open and put text in a new line above current line, until <Esc> hit |
Changing Text
| r | replace single character under cursor (no <Esc> needed) |
| R | replace characters, starting with current cursor position, until <Esc> hit |
| cw | change the current word with new text, starting with the character under cursor, until <Esc> hit |
| cNw | change N words beginning with character under cursor, until <Esc> hit; e.g., c5w changes 5 words |
| C | change (replace) the characters in the current line, until <Esc> hit |
| cc | change (replace) the entire current line, stopping when <Esc> is hit |
| Ncc or cNc | change (replace) the next N lines, starting with the current line, stopping when <Esc> is hit |
Deleting Text
| x | delete single character under cursor |
| Nx | delete N characters, starting with character under cursor |
| dw | delete the single word beginning with character under cursor |
| dNw | delete N words beginning with character under cursor; e.g., d5w deletes 5 words |
| D | delete the remainder of the line, starting with current cursor position |
| dd | delete entire current line |
| Ndd or dNd | delete N lines, beginning with the current line; e.g., 5dd deletes 5 lines |
Cutting and Pasting Text
| yy | copy (yank, cut) the current line into the buffer |
| Nyy or yNy | copy (yank, cut) the next N lines, including the current line, into the buffer |
| p | put (paste) the line(s) in the buffer into the text after the current line |
Other Commands
Searching Text
| /string | search forward for occurrence of string in text |
| ?string | search backward for occurrence of string in text |
| n | move to next occurrence of search string |
| N | move to next occurrence of search string in opposite direction |
Determining Line Numbers
| :set number :set nonumber | show line numbers hide line numbers |
| :.= | returns line number of current line at bottom of screen |
| := | returns the total number of lines at bottom of screen |
| ^g | provides the current line number, along with the total number of lines, in the file at the bottom of the screen |
Saving and Reading Files
| :r filename<Return> | read file named filename and insert after current line (the line with cursor) |
| :w<Return> | write current contents to file named in original vi call |
| :w newfile<Return> | write current contents to a new file named newfile |
| :12,35w smallfile<Return> | write the contents of the lines numbered 12 through 35 to a new file named smallfile |
| :w! prevfile<Return> | write current contents over a pre-existing file named prevfile |