In this post, I will list down some useful vim snippets that I've collected throughout my experience with this beast of an application. I will keep updating this list whenever I encounter something new.
All the below shortcuts are executed in COMMAND mode, unless otherwise specified.
:! ...
Executes an external command.
Example:
:!gcc % Invokes gcc on the current file
:<range>!...
Pipes the text that's in the specified range to an external command and reads back the result into the file
Examples:
:1,6!sort
:%!sort Here, the
% means 1, $ (from line 1 till the end of file)
:%!xxd Turns the file into a hex dump, with the linux
xxd command
:!xxd -r To reverse back to the text
:%!nl -ba or
:%!cat -n Number all lines
:r <filename>
Reads an external file and inserts it at the current cursor position
Example:
:r main.c Inserts the contents of main.c in the next line
:r!
Reads in the results of an external command and inserts it in the next line
Example:
:r! ls -l
:.!
Like :r! but inserts the text in the current line
Example:
:.! ls -l
%
Goes to the matching bracket under the cursor
Example:
<action>i...
works on the enclosing text, specificied by the encloser
Examples:
ci{ Change the text between the { }
vi' Visually select the text between '
vi" Visually select the text between "
diw Delete the current word
CTRL + v
Block-select mode
CTRL + a
Increments the number under the cursor
CTRL + x
Decrements the number under the cursor
'.
Jumps back to the last edited line
`.
Jumps back to the last edited word
gi
Like
`. but goes into INSERT mode
ga
Displays the ASCII, hex and octal value of the character under the cursor
~
Changes the case of the letter under the cursor
CTRL + r (in INSERT mode)
Examples:
" | Unnamed register, containing the text of the last delete or yank |
% | Current filename |
# | Alternate file name |
* | Clipboard contents (X11: primary selection) |
+ | Clipboard contents |
/ | Last search pattern |
: | Last command-line |
. | Last inserted text |
- | Last small (less than a line) delete |
=8*5 | Insert 40 into text (mini-calculator) |
(I have written a
whole post about CTRL + r)
:Explorer
Opens a built in file explorer
Although vim's inbuilt file explorer suffices, I suggest you use
NERDTree for a better file explorer.
:earlier 20m
Reverts the document back to how it was 20 minutes ago
:later 15m
The reversal of :earlier
zz
Scrolls the screen to make the current line in the middle of the page
:changes
View the changelist
g; and g,
Move backwards and forwards through the changelist
ge
Moves the the previous word end
:perldo and
:rubydo
Execute a perl or a ruby one liner on a range of text. If you do not specify a range, the command will execute on all the lines. In the one liner,
$_ refers to the text of the line
Examples:
:perldo $_ = join ' ', reverse split Reverse the words of all the lines
:2,4 rubydo $_ += ";" Inserts a semicolon at the end of lines 2 to 4 (This example can also be achieved with
:2,4 s/$/; )
q:
View command history
gf
Tries to identify the word under the cursor as a file name and open it
CTRL + z
Switch back to the shell. Type in
fg to return back to vim
:sh
Go to sub shell.
CTRL + d or type
exit to go back to vim
ggg?G
ROT13 the current file
*
Finds the next occurrence of the word under the cursor
#
Finds the previous occurrence of the word under the cursor
:set cul
Highlights the line containing the cursor
:set nu
Turns on line numbers in the left margins
:set autochdir
Set the working directory to the location of the current file
:set so=3
Scrolls the text so that (when possible) there are always at least three lines visible above the cursor, and three lines visible below the cursor
Examples:
:set so=999 Keeps the cursor in the middle line, whenever possible
:set showcmd
Shows the command keystrokes as they are being inputted, at the bottom right of the screen
gg=G
Corrects indentation for the whole file
guu
Lowercase the entire line
gUU
Uppercase the entire line
xp
Transpose two characters (switch their positions). This is a simple cut (
x) and paste (
p) after the cursor operation.
CTRL + v (INSERT mode)
Enter a character from its hexadecimal value
CTRL + y (INSERT mode)
Inserts the character above at the current cursor position
CTRL + w (INSERT mode)
Deletes the previous word
gk
Go up one visible line
gj
Go down one visible line
:tab help ...
Open help in a new page
Examples:
:tab help shiftwidth Opens the help for shiftwidth in a new tab
:qa
Close all windows and tabs (
:qa! to force it)