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} は
根本的に理解が間違ってるとかあったら指摘をしてもらえるとうれしいです。
試行錯誤の中で
色々ググって、この辺が参考になりそうだったので熟読する。
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>
とりあえずこれで良しとする。