vi/vim notes
I first created and posted these notes online on May 28, 2002. They may be the most useful thing I ever do. I collected most of these over the years from several sources, but I can’t give proper credit since those links are all dead now.
Changing Text
| cc | change a line |
| C | change from current cursor position to the end-of-line |
| cw | change from current cursor position to the end of the word |
| J | joins the next line to the current line (inserts a space between the two) |
| gJ | joins the next line to the current line (without a space) |
| :12,24j | join lines 12 thru 24, leaving a space between each line. |
| ~ | switch lower and upper cases |
| r | replace the current character with the next character typed |
| 4rx | replace next four characters with “x” |
| R | overwrite until <esc> |
| s | substitute the current character and go into insert mode. Same as “rxi <ESC>“ |
| S | substitute the current line, erase it, and go into insert mode, starting at the indentation of the line. Same as “cc” |
| >> | shift current line forward |
| 3>> | shift three lines forward |
| >% | shift all lines until a matching brace or parenthesis |
| >} | shift to the end of the paragraph |
| >’m | shift to the marked line |
| << | shift current line backward |
| vEU | change from here to end of word to uppercase |
| vEu | change from here to end of word to lowercase |
Copying and Pasting
| yl | yank (copy) current character |
| yn | yank n characters |
| yw | yank the current word |
| yy | yank the current line |
| Y | yank a line, same as “yy” |
| nyy | yank n lines of text |
| y$ | yank to end of line |
| y) | yank to the end of the sentence |
| y’x | yank from current line to the mark x (use mx to mark as x) |
| y/word | yank from current position to "word" |
| “ay’m | yank from here to the mark. Place this into the named buffer “a”. This will also allow one to switch files using the “:e fn” or “:n fn” command and then place the buffer back. |
| “ayy | yank current line into buffer a. |
| “a3Y | yank three lines, place into buffer “a” |
| “A3Y | append 3 lines, place into “a”. This allows one to build up a buffer. |
| “ap | paste the contents of “a” back, below current line. |
| "zyy @z |
"zyy places the highlighted text into buffer z; @z will run the contents of buffer z. This allows a search pattern to be written in the document and then reused. |
| p | paste to the right of the cursor |
| P | paste to the left of the cursor |
Deleting
| x | delete the character under the cursor |
| dd | delete the current line |
| d^ | delete from current cursor position to the beginning of the line |
| d$ | delete from current cursor position to the end of the line |
| dw | delete from current cursor position to the end of the word |
| d3w | delete three words |
| 3dd | delete three lines |
| d/word | delete until you find word |
| dfx | delete from here until the character “x” |
| D | delete everything to the end of the current line (same as d$) |
| 3dd | delete everything to the end of the current line and the following 2 lines |
| u | undo deletion |
| U | undo the line you just changed |
Inserting
| i | insert at the current character |
| I | insert at the beginning of the current line |
| 20I <ESC> | insert 20 dashes (-) at the beginning of the line |
| a | append to the right of the current character |
| A | append at the end of the current line |
| o | insert a new line immediately following the current line |
| O | insert a new line immediately before the current line |
Moving
| h | move the cursor one character to the left |
| j | move the cursor one character down |
| k | move the cursor one character up |
| l | move the cursor one character to the right |
| 0 | move cursor to the beginning of the current line |
| $ | move cursor to the end of the current line |
| w | move cursor forward a word |
| 3w | move cursor forward three words |
| W | move cursor forward, ignoring punctuation |
| b | move cursor back a word |
| B | move cursor back a word, ignoring punctuation |
| e | move cursor to the end of the word |
| E | move cursor to the end of the word, ignoring punctuation |
| G | move cursor to the last line of the file |
| nG | move cursor to the beginning of line n |
| 1G | move to the first line of a file |
| n| | moves the cursor to the beginning of column n |
| f | find a character in the line, forward |
| fa | find the character “a” in the line, forward |
| 2fa | find the second occurrence of “a” in the line, forward |
| F | find a character in the line, backward |
| Fz | find the character “z” in the line, backward |
| t | find up to a character in the line, forward |
| ) | jump to the next sentence |
| } | jump to the next paragraph |
| ] | jump to the next section |
| % | find matching brace or parenthesis |
| ^b | scroll backwards one page. A count scrolls that many pages |
| ^f | scroll forwards one page. A count scrolls that many pages |
| ^u | scroll up half a screen |
| ^d | scroll down half a screen |
| z <enter> | put current line at top of screen |
| z. | put current line at middle of screen |
| z- | put current line at bottom of screen |
| m | start a mark, the next character is the name, any character from a-z |
| ma | mark this spot with the character “a” |
| ‘a | return to the line marked “a” |
| `a | return to the character marked “a” |
| ” | return to previous line (auto-mark) |
| “ | return to previous character (auto-mark) |
Search and Replace
| /word | search forward for word |
| ?word | search backward for word |
| ?word?z. | search forward for word, put line at the middle of screen |
| n | jump forward to next occurance of word |
| N | jump backward to next occurance of word |
| * | search forward for word under cursor (vim) |
| # | search backward for word under cursor (vim) |
| g* | search forward for word under cursor (partial match) (vim) |
| g# | search backward for word under cursor (partial match) (vim) |
| :noh | stop highlighting the word that was searched for |
| :s/old/new/ | replaces first occurence of old with new on current line |
| :s/old/new/g | globally replaces old with new on current line |
| :%s/old/new/g | globally replaces old with new on all lines |
| :s/old/new/gc | confirms replacements |
| :%s/^V^M//g | globally remove DOS carriage returns |
| :%s/,/^V^M/g | globally replace commas with newlines (yes, I know this looks like it would insert DOS carriage returns, but it only inserts the newlines on Unix) |
| :%s/\s*$// | strip blanks from end of lines |
| :%s/^.\{30}// | remove the first 30 characters from each line |
| :%s/[ ^I]*$/!d | remove trailing whitespace (where ^I is produced by pressing the tab key) |
| :%s/.*/\L&/ | convert the entire file to lowercase. |
| :s/.*/\u&/ | convert the first character of line to uppercase. |
| :%s/\<./\u&/g |
convert the first character of each word to uppercase
|
| :s/book{./\L&/ | convert the first character after the { to lowercase. |
| :’x,.s/\([a-z]\)=/\1 =/ | replace any lowercase character in the alphabet followed by an equal sign with the same character followed by a space and an equal sign, e.g., book= >> book = |
| ::%s/\(That\) or \(this\)/\2 or \1/ | change "that or this" to "this or that" |
| ::%s/\(^\\foilhead{\(.*\)}\)/ %\1^M\\section{\2}/ |
comment out each line beginning with ‘\foilhead’ and replace with a line beginning with ‘\section’; note the nested backreferences for keeping the rest of the line the same |
| ::%s/\(.*\)/<a href="\1">\1<\/a>/ | add HTML tags for references to files |
| :s/ \(\d\{1,2}\)\.\(\d\{1,2}\)\(.*\)/<a href="\1-\2.sh">\1.\2\3<\/a> |
change a line of the form |
:’x,.s:^\([^ ]\+\) \(.*\): |
change a line of the form Colons are used here instead of the usual slashes for separating the ‘find’ and ‘replace’ parts. The part ^\([^ ]\+\) finds all of the characters up to the first space and saves them for use in the ‘replace’ part as \1. |
| :’x,.s/^/#/ | insert a pound sign (#) at the beginning of the line from the line marked with mx to the current line |
| :%s/word1\nword2// | remove word1 from the end of a line and word2 from the beginning of the next line; \n represents the newline between the two |
| :& | repeat previous substitution |
| :<up arrow> | recall : history |
| :g/string/d | deletes every line that contains string |
| :g/\.c/+|s/^/\.cc/ | look for all “.c” commands, jump to next line, substitute the beginning of line with “.cc”. |
| :g/^\..*/|s//\U&/ | convert all characters at beginning of line that start with a “.” to upper case. |
| :v/string/d | deletes every line that does not contain string |
|
:g/.*/m0 |
This will reverse the order of the lines in the current file. m0 is the ex command to move the line to line 0. |
|
:v/./d or :g/^$/d |
Remove all blank lines. |
| :g/^\s*$/d | Removes all lines that only have whitespace. |
| :v/./.,/./-1join | Replaces multiple blank lines with just one blank line. |
Options
| :se ai | autoindent (unset with :se noai) |
| :se ff=unix | set fileformat to unix |
| set fileencoding=utf-8 | change from Unicode to ASCII |
| :se ic | ignore case when searching |
| :se list | display tabs and carriage returns |
| :se nu | display line numbers in the file. They are not actually in the file. (unset with :se nonu) |
| :se sm | show matching brace or parenthesis while inserting |
| :se smd | display the mode |
| :se sw=2 | set shifting to 2 spaces |
| :se tabstop=4 | set tabs to 4 spaces |
| ^^D | turn off autoindent for current line, resume same place for the next line (up carrot and control-D) |
| 0^D | reset the autoindent, start at the left margin |
Using External Programs
| !cmd | execute an external program called cmd |
| !!cmd | execute an external program, replacing the output with the results |
| !$ | send from here to the end-of-line |
| !L | send from here to the last line of screen |
| !23G | send from here to line 23 |
| !/word | send from here until you find “word” |
| !) | send from here until the next sentence |
| !} | send from here until the next paragraph |
| !!date | adds the date |
| !!cut -c41- | cut the first 40 characters from a file |
| 3!!sort | send three lines to sort, and return the output |
| !Grev | send from here to the end of file to the “rev” command; the results will reverse the characters in each line |
| !}sort | sends from the current line until the first blank line to sort |
| :’x,.!sort | will sort from the line marked with mx to the current line |
| :r !ll | read the output of an “ll” command, and put it after the current line. |
| :’t,’b !spell | check spelling from mark t to mark b |
| :’t,. !awk ‘{print $3 ” ” $2 ” ” $1}’ | reverse the order of three columns |
| :%! sed G | double space the entire file. |
| :1,5! sed G | double space the lines from 1-5 |
| :’x,.!sed ‘/^$/d’ | remove the blank lines from mark x to the current line |
Miscellaneous
| ^g | give file name, status, current line number and relative position |
| ^l | refresh the screen (sometimes `^P‘ or `^R‘) |
| ^v | visual mode. in Windows, Ctrl-v is mapped to paste text. Use Ctrl-q instead (vim) |
| . | repeat latest command |
| & | repeat latest `ex’ substitute command, e.g. :s/wrong/good/ |
| :ab lg longer | create an abbreviation. Whenever lg is typed, it will be replaced with longer. |
| vi +/string filename | start vi, jumping to the first occurrence of string |
| vi -r filename | recovers an open file after a crash |
| vi `cat somefile` | open a list of files that are in the file somefile |
| :r filename | insert file filename, placing its contents after current line |
| :1,4w filename | write lines 1 through 4 to filename |
| :e filename | edit filename |
| :f filename | change current file name to filename |
| :n | edit next file |
| :sh | call up the shell, run commands until a ^d (CONTROL-d), then return to editing |
| :vi | VI MODE. Used if “Q” is pressed, or called up ex, and now wish to use the visual mode |
| In Insert mode, press the Ctrl-p or Ctrl-n key to complete part of a word that has been typed. This is useful for entering function names. | |
| :<up arrow> | recall : history |