pockestrap

Programmer's memo

:nohlsearch に少しハマった

結論だけ言うと、「:nohlsearchautocmdとユーザー定義関数内で使用できない」


私は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だけ関数の外に出しました。 うーん、もっといい方法ないのかなぁ…