Vim でカーソル下の単語を移動するたびにハイライトする

この記事は Vim Advent Calendar 2013 52日目の記事になります。


quickhl.vim の延長線なのですが、カーソル下の単語を移動するたびにハイライトするようなスクリプトを書いてみました。
どういうことかというと以下のような感じ。



そもそも quickhl.vim にも同じような機能があったのですが、挙動があまり好きではなかったので自分で実装した感じです。

[ソース]

" 1 が設定されていれば有効になる
let g:enable_highlight_cursor_word = 0
" let g:enable_highlight_cursor_word = 1


augroup highlight-cursor-word
    autocmd!
    autocmd CursorMoved * call s:hl_cword()
    " カーソル移動が重くなったと感じるようであれば
    " CursorMoved ではなくて
    " CursorHold を使用する
"     autocmd CursorHold * call s:hl_cword()
    " 単語のハイライト設定
    autocmd ColorScheme * highlight CursorWord guifg=Red
    " アンダーラインでハイライトを行う場合
"     autocmd ColorScheme * highlight CursorWord gui=underline guifg=NONE
    autocmd BufLeave * call s:hl_clear()
    autocmd WinLeave * call s:hl_clear()
    autocmd InsertEnter * call s:hl_clear()
augroup END


function! s:hl_clear()
    if exists("b:highlight_cursor_word_id") && exists("b:highlight_cursor_word")
        silent! call matchdelete(b:highlight_cursor_word_id)
        unlet b:highlight_cursor_word_id
        unlet b:highlight_cursor_word
    endif
endfunction

function! s:hl_cword()
    let word = expand("<cword>")
    if    word == ""
    return
    endif
    if get(b:, "highlight_cursor_word", "") ==# word
        return
    endif

    call s:hl_clear()
    if !g:enable_highlight_cursor_word
        return
    endif

    if !empty(filter(split(word, '\zs'), "strlen(v:val) > 1"))
        return
    endif

    let pattern = printf("\\<%s\\>", expand("<cword>"))
    silent! let b:highlight_cursor_word_id = matchadd("CursorWord", pattern)
    let b:highlight_cursor_word = word
endfunction


vimrc などにコピペすればそのまま使用できると思います。
有効にしたい場合は g:enable_highlight_cursor_word に 1 を設定して下さい。

  • その他雑多
    • マルチバイト文字は未対応
    • 単語の検出は expand("") を使用しているのでスペース上だと前方の単語になる
    • ハイライト処理は重いのでカーソル移動が遅く感じるのであれば CursorHold を使用する
    • ハイライトが騒がしければ underline を使用する


需要があればプラグイン化するかもしれない。