Vim tips
Here’s a list of vim tips that I’ve learned over the years. I tried to put the ones I find the most useful or less known first.
-
To cycle throught the delete registers, first type
"1p
and then you can cycle through the delete registers withu.
. -
You can use numbers to fetch the delete registers. For instance
"1p
will paste the last delete,"2p
will paste the last but one… -
Put a count before a
<action>i(
to go at a parent level of parentheses. For instance, if you’re here:
if (function(param1, param2, param2)) {
^
Do 2di(
to delete the content of the condition.
-
Use the register
+
and*
to access the system clipboard and selection. You need vim to be compiled with+clipboard
for that to work or neovim + xclip. -
Use capital
W
(likediW
instead ofdiw
) in your actions to do it on every character connected to the current one instead of the "word". -
Use
=%
to indent a block of code. -
Type
Ctrl-o <normal mode command>
to execute a normal mode command in insert mode. (edit: added March 8th 2020) -
Use
C-o
(orC-i
) to go back (or forward) in the jump history. -
Use
g;
to go to a previous edit location,g,
to go to the next one. The command:changes
shows the list of changes, with a number for each that you can put in front ofg;
org,
to go to that specific change. (edit: added February 5th 2021) -
Do
''
(go to the mark'
, which is an implicit mark) to go to the latest position in the jump history. -
You can search with word boundary by doing
/\<word\>
. -
Use
f<char>
to move to a character in the current line. It’s useful when combining with actions likedf)
. -
In addition to the visual mode, there’s a line visual mode that you enable with
Shift+v
and a block visual mode that you enable withCtrl+v
. You can switch from one mode to the other without going back to normal mode by pressing the corresponding bindings. -
@@
executes the last executed macro. -
Use
C-^
to go to the alternate (previous) file. (It’s very useful when you often need to toggle between two files you’re working on.) -
Use
gv
to recreate the last selection. -
Use
C-]
to navigate through a link in the help pages. -
Use
gf
to open the file with the name coming from the word under the cursor. -
Use
{
(or}
) to go to the previous (next) blank line. -
Once you jump to a character on the same line with
f<char>
, you can jump to the next occurrence with;
. -
When you selected a block with
vi{
you can select the outer block by typingi{
and you can do this as much as you want. (Sounds useful for lisp programmers.) -
Use
:retab
to convert the buffer to your setup for indentation. For instance, if you configured vim to have 4 spaces for indentation, it will convert the tabs to 4 spaces. -
Enable the
relativenumber
option to have relative line numbers. It makes it easier to do actions with a count prefix. -
In neovim, use the option
set inccommand=split
to get an incremental visual feedback when doing the substitude command. -
Move by visual line (instead of actual line) with
gj
andgk
. If you prefer that way of moving, you can remapj
andk
to these. -
Use K on a word to open its manpage. Very useful when reading C code.
-
You can hide all windows except the focused one with
:only
. -
You can hide a window with the
:hide
command. -
Increase (decrease) the size of a window with
C-w +
(C-w -
). You can use the count before to specify how many lines (or columns) to increase/decrease at once. -
You can remove trailing spaces with the command
:%s/\s\+$/
. -
Pressing
o
in visual mode switches the cursor at the other end of the selection -
Pressing
%
in normal mode goes to the matching parens. -
To go to the end of the previous word, type
ge
. -
Use
zt
,zz
orzb
to respectively move the the view towards to the top, the center or the bottom. -
In addition to being able to do
/search/e
you can do/search/e+2
to go 2 characters after the end. It also works with-
as in/search/e-2
and from the beginning withb
like/search/b+2
. -
_
can be used instead of^
to go to the first non-blank character. -
Use
=
to indent your code. Most useful if combined with visual mode or with a count parameter before. -
In command or search mode, type
Ctrl-r 0
to paste from the yank register. This also works in insert mode. (edit: completed on March 23th 2020) -
You can enable the option
gdefault
to have global substitute by default (all matches in a line will be substituted). -
Use the option
scrolloff
to keep a context of a certain number of lines when you scroll or move the cursor. For instance, withset scrolloff=3
, vim will keep 3 lines visible below the cursor when you scroll down. -
Use
C-a
(C-x
) to increment (decrement) the next number. It’s very useful in macros. -
0
goes to the beginning of the line, but if you want to go to the first non-space character of the line, use^
. -
In normal mode, use
C-e
andC-y
to move the view up and down. -
In visual mode, filter your selection with a shell command by typing
!cmd
. It’s useful to sort your file, for instance:V<move>!sort
. -
You can have global marks (i.e. marks for other files than the current one) but using capital-letter marks (like
mA
). -
Map the leader key to some accessible key like space (
let mapleader = "\<Space>"
) or comma and create bindings to be able to do common actions quicker like:nnoremap <Leader>w :w<CR>
. -
You can create a session with
:mksession <name>
and reload that session later with:source <name>
. There are many parameters to configure what goes into the session file. -
You can configure what you want to save in a session. For instance, if you only want to save the opened buffers and the current directory, use
set sessionoptions=buffers,curdir
. -
Quit vim by setting exit code with
:cq
. That is useful to exit the vim opened bygit rebase
to cancel the rebase, for instance. -
vit
to select XML tags. And you can typeit
again to select the parent tag. -
_
is the black hole register. You can use it to delete stuff without overwriting a buffer as in"_dd
. -
Enter the command
:set spell
to enable spell checking the the buffer. You can specify the language with:set spelllang=fr
for french. -
You can repeat the last command entered with
:
by typing@:
and the subsequent repeats can be done with@@
. -
Add this option
set matchpairs+=<:>
to be able to use%
to jump from<
to>
. -
In command or search mode, use the up arrow (or
ctrl-p
) to select the previous command. -
In insert mode, use
C-e
to type the same character as the line below andC-y
to type the same character as the one above. -
You can open .gz files containing text in vim (seems to come from a built-in plugin). Also works for .tar files.
-
If you want to scroll all your split windows at the same time, bind them together with:
:windo set scrollbind
. -
<C-g>
show some info (less thang<C-g>
) about the current file. -
If you want to save a read-only file (forget to open vim with sudo), use the following command:
:w !sudo tee %