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 を使用する
需要があればプラグイン化するかもしれない。