Enhanced hlsearch in Vim

2014-10-07 14:15

A while back I watched the talk More Instantly Better Vim by Damian Conway from OSCON 2013.

There were a lot of interesting Vim stuff in that talk and the talk it self was entertaining (go watch it).

One of the things I took away from the talk was enhanced hlsearch. When there's a lot of matches it can be kind of hard to see what occurence you just jumped to. This snippet makes the current match flash for a brief period of time.

Unfortunately there's a drawback from using it since the implementations involves the use of sleep. It's not optimal but when fine tuned to serve its purpose without being annoying I found it quite useful.

Put the following snippet into your .vimrc and give it a spin.

" Highlight search matches and next
set hlsearch

" create a HLNext (from http://www.youtube.com/watch?v=aHm36-na4-4)
nnoremap <silent> n n:call HLNext(0.2)<cr>
nnoremap <silent> N N:call HLNext(0.2)<cr>
highlight WhiteOnRed ctermbg=white guibg=red
function! HLNext (blinktime)
  let [bufnum, lnum, col, off] = getpos('.')
  let matchlen = strlen(matchstr(strpart(getline('.'),col-1),@/))
  let target_pat = '\c\%#'.@/
  let blinks = 3
  for n in range(1,blinks)
    let red = matchadd('WhiteOnRed', target_pat, 101)
    redraw
    exec 'sleep ' . float2nr(a:blinktime / (2*blinks) * 1000) . 'm'
    call matchdelete(red)
    redraw
    exec 'sleep ' . float2nr(a:blinktime / (2*blinks) * 1000) . 'm'
  endfor
endfunction