Being able to search by regular expression is a pretty fundamental thing in a text editor. Vim takes it to the next level by making entering a search into a motion all on its own, and even a few weeks’ Vim experience and you’ll probably catch yourself using the search to navigate your buffers.
One of the things I most commonly see recommended in threads and discussions
about useful Vim features includes turning on two kinds of search
highlighting: first, highlighting the search result on which you’ll land as you
type it, and secondly, once you’ve pressed
Enter to run your search,
highlighting all of the matches. You turn these on like this:
:set incsearch :set hlsearch
This ends up being great for editing code in particular, because if you search
for variable or function names, you can see at a glance where they’re declared,
defined, or used in your code. Couple that with the quick forward and backward
search that you can do with the
# keys, and you have a very
convenient way to flick through successive uses of an identifier.
The only snag, really, is that it doesn’t turn itself off, and it gets visually distracting when you’ve moved on from whatever task prompted the search, and because you might search to move around, you don’t always actually want the highlighting to stay there. Text editors following a Windows model would probably clear away the highlighting as soon as you close the search box, or insert some text. This isn’t the case with Vim, which can be good or bad, but most people I’ve spoken to about this feature seem to find it annoying.
Bram Moolenar, the author of Vim, addressed this very topic in a Google Tech Talk he gave about effective text editing. You can turn off the highlighting temporarily by typing:
This is different from
:set nohlsearch in that it doesn’t
permanently disable the highlighting. It’ll turn it on next time you search.
I find this is kind of a pain to type, so I alias it to Ctrl+L in my
file, so that in addition to its default behaviour of clearing the screen it
clears the search highlighting as well:
nnoremap <C-l> :nohlsearch<CR><C-l>
Additionally, I like to set leader keys to quickly turn the highlighting option
on and off completely if for some particular project it’s just thoroughly
unhelpful. In this example, typing
\h will toggle the
hlsearch settings on and off, respectively. I’m assuming you’re using the
backslash key as your
nnoremap <leader>i :set incsearch!<CR> nnoremap <leader>h :set hlsearch!<CR>
Finally, I find that while I’m in insert mode, I usually don’t want to see the highlighting, so I define events to turn the highlighting off temporarily in the current buffer while I’m inserting text:
autocmd InsertEnter * :setlocal nohlsearch autocmd InsertLeave * :setlocal hlsearch
I find these shortcuts make the search highlighting behaviour much less
annoying. Interestingly, according to Vim’s help, you can’t simply add an event
hook to run
:nohlsearch when you enter Insert mode (from
This command doesn’t work in an autocommand, because the highlighting state is saved and restored when executing autocommands. Same thing for when invoking a user function.
You can work around this by setting the search pattern to empty instead, as
suggested by this Stack Overflow answer, but I don’t really like doing
that because I often like to recurse through more search results with
N after leaving insert mode.