:nohlsearch に少しハマった
結論だけ言うと、「:nohlsearch
はautocmd
とユーザー定義関数内で使用できない」
私はvim-watchdogsというシンタックスチェックプラグインを愛用しています。 また、vim-hierというプラグインを使って、エラー箇所をハイライトしています。
そして、nnoremap <Esc><Esc> :<C-u>nohlsearch<CR>
して、<Esc>
2回で検索のハイライトを消しています。
そうすると、<Esc><Esc>
で:nohlsearch
された上でvim-hierのハイライトも消えてほしいと思いますよね。
試しに、てきとーに書いてみました。
function! s:my_noh() nohlsearch if exists(':HierClear') HierClear endif endfunction nnoremap <Esc><Esc> :<C-u>call <SID>my_noh()<CR>
HierClear
が、vim-hierのハイライトを消すコマンドです。遅延読み込みしているのでコマンドの存在を確認しています。
上記を設定した状態で<Esc><Esc>
してみると、何故か:nohlsearch
が効きません。
helpを読んでみたところ、こんな記述を見つけました。
:help :nohlsearch
:noh :nohlsearch :noh[lsearch] 'hlsearch' オプションによる強調表示をやめます。検索コ マンドを使うか、'hlsearch' をオンに設定すると、再び強 調表示されます。このコマンドはオートコマンド中は機能し ません。オートコマンドを実行する時に強調表示の状態を保 存し、実行後に元に戻すからです。autocmd-searchpat ユーザー関数を呼び出したときも同様。
どうやら、ユーザー関数の中で:nohlsearch
を使っても効果が無いようです。
そのため、このように変更しました。
function! s:hier_clear() if exists(':HierClear') HierClear endif endfunction nnoremap <silent> <Esc><Esc> :<C-u>nohlsearch<CR>:<C-u>call <SID>hier_clear()<CR>
:nohlsearch
だけ関数の外に出しました。
うーん、もっといい方法ないのかなぁ…