読者です 読者をやめる 読者になる 読者になる

Vim で Esc を置き換えたキーマッピングと本来の Esc の挙動が違うことがある?

まだ根本解決できてないけどメモ。

現象

こんな設定をしてみたのだけど、 をしてもハイライトが消えない。

"ノーマルモード時 <Esc> を <C-j> にマッピング
nnoremap <C-j> <Esc>

"Escの2回押しでハイライト消去
nnoremap <Esc><Esc> :<C-u>nohlsearch<CR><Esc>

試したこと

何人かの方から noremap だからじゃない?と教えてもらったのでこんな風にした。

"ノーマルモード時 <Esc> を <C-j> にマッピング 
nmap <C-j> <Esc>

やっぱりできない。
Key mapping についての理解が足りないのを痛感したので、この辺読んで勉強する。
Vim: Key mappingを極める - while (“im automaton”);

以下引用。

:map等のコマンドに対して:noremapというコマンドが存在します。両者の違いは、{rhs}に他のkey mappingsの{lhs}が含まれていた場合、それが再帰的に展開されるかどうかです(この再展開のことをremapと呼びます)。:noremap系のコマンドではremapが行われず、:map系のコマンドではremapが行われます。

Vim: Key mappingを極める - while (“im automaton”);

nnoremap では再帰的に展開されなくてだめなのは分かったけど、今回のケースだと {rhs} は で、 単独で {lhs} になっているマッピングはないので、これが原因じゃない気がする。
根本的に理解が間違ってるとかあったら指摘をしてもらえるとうれしいです。

試行錯誤の中で だとタイムアウトが一回だけど、 だとタイムアウト 2 回ということに気づいた。
色々ググって、この辺が参考になりそうだったので熟読する。
VimでESCの反応を素早くする,再び ~timeoutlenとttimeoutlen~ | PCと遊ぶ日々の記録
Vim documentation: options

他に と組み合わせたマッピングはないので、キーコード待ちでタイムアウトになっているらしい。
は、キーコード待ち -> のキーコードと認識されるが、 は、キーコード待ち -> キーコード待ちになってるみたい。
結局、原因はよくわかっていない。

暫定対策

"ノーマルモード時 <Esc> を <C-j> にマッピング 
nmap <C-j> <Esc>

"Escでハイライト消去
nnoremap <Esc> :<C-u>nohlsearch<CR><Esc>

他に で始まるキーマップがなければ、即ハイライトが消える。
ある場合はマッピング待ちが発生するので、timeoutlen だけ待つ or 2 回押しでハイライトが消える。

またはこっちでもいいかも。

"<C-j>2回でハイライト消去
nnoremap <C-j><C-j> :<C-u>nohlsearch<CR><Esc>

とりあえずこれで良しとする。