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.

2015-08-13/comparison.png

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

Discussion