
結論
vim.keymap.set("n", "<ESC>", function()
if vim.v.hlsearch == 1 and vim.fn.searchcount().total > 0 then
return "<CMD>nohlsearch<CR>"
else
return "<ESC>"
end
end, { expr = true, desc = "Clear search highlight" })
背景
もともとは <Esc><Esc> で消すキーマップを設定していました。
こんな感じ。
vim.api.nvim_create_autocmd("FileType", {
pattern = "*",
callback = function(event)
if event.file ~= "TelescopePrompt" and event.file ~= "DressingInput" then
vim.api.nvim_buf_set_keymap(event.buf, "n", "<ESC><ESC>", "<CMD>nohlsearch<CR>", {})
end
end,
})
単に <Esc><Esc> のマッピングを登録すると、<Esc> の入力後に待機が発生してしまいます。
そのため、一部のファイルタイプではマッピングを登録しないようにしていました。
これでもなんとかなっていたのですが、たまにストレスを感じることがあり、見直して見ることにしました。
結果は上で示したとおりですが、地味ですが良い改善ができたと思います。
ちょっと解説
-
vim.v.hlsearchとは検索による強調表示がオンになっているかどうかを示す変数。
-
vim.fn.searchcount()とは最後の検索数の取得もしくは更新をする。
ハイライトの有無に限らず、現在のバッファにおける最後の検索結果の数を取得できます。
上記の2つを組み合わせることで、ハイライトがある場合にのみ <Esc> でハイライトを消すようにできます。
それ以外の場合は、通常の <Esc> として動作するため <Esc> のキーバインドがあるプラグインとも競合しません。
快適!!