Sneaky Vim motions
Although I am a Vim user for almost ten years now, I still learn something new
every once in a while that will improve my editing to be more efficient or
comfortable. This time – and I have to admit that it’s almost embarrassing – I
quickly grew accustomed to the f
and t
motions. In essence
you type f or t followed by a character to which the
cursor will jump on or right before. Typing ; and ,
repeats the motion forward and backward. Before this enlightenment, I was
trodding through long lines by repeating w and e motions
until I reached my final destination.
There are two reasons why I missed these character-based motions for so long. First of all f and t can only reach targets on the current line whereas programming tasks often involve line and word crossings. Second of all, the non-existant visualization of the motion destinations make it really hard for me to make sense of these motions.
The very handy vim-sneak plugin alleviates both of these problems with the
additional benefit of allowing two-character search motions using the
s and S keys thus covering middle ground between f
motions and full-blown /
searches. To skip unused targets, vim-sneak provides
the streak mode similar to vim-easymotion that allows to reach a target by
typing a third character.
In the given example I was searching for “mo” starting on the first character on
line 6. Streak provides shortcuts a
and s
to avoid having to type
; two or three times. To enable the streak mode, you have to add the
following to your .vimrc
:
let g:sneak#streak = 1
By default, vim-sneak does not interfere with f
and t
motions thus to
benefit from highlighting and multi-line f
and t
motions you have to map the
corresponding keys:
nmap f <Plug>Sneak_f
nmap F <Plug>Sneak_F
nmap t <Plug>Sneak_t
nmap T <Plug>Sneak_T
By the way, I link the target colors to type and function syntax colors as follows to get rid of the pesky default pink:
hi link SneakPluginTarget Type
hi link SneakPluginScope Function
hi link SneakStreakTarget Type
hi link SneakStreakMask Function