VimでESCキーの代わりになるキー(Ctrl-[ と Ctrl-c の違い)
ノーマルモードに戻るたびに右手を伸ばしてEscを押していました。この移動が地味に手の流れを止めていることに気づいてから、ホームポジションを崩さずに済む代替キーを探すようになりました。
目次(11項目)
| キー | これだけ覚える |
|---|---|
| Ctrl-[ | Escの完全な代替。進行中の操作もそのまま確定する |
| Ctrl-c | 強制キャンセル。進行中の操作が取り消されることがある |
| jk / jj | インサートモード専用の自作Esc代替(任意設定) |
2つの代替キー
Ctrl-[ " Escの単純な代替
Ctrl-c " 強制キャンセル
どちらもノーマルモードに戻る点は同じですが、動作の細部が異なります。
Ctrl-[ はEscの完全な代替
Ctrl-[はEscとまったく同じ動作をする、正真正銘の代替キーです。ホームポジションから小指を動かすだけで届くため、Escキーまで手を伸ばすより移動距離が短くて済みます。多くのVimmerがjjやjkのようなインサートモード用マッピングを別途作る一方で、ノーマルモードへの復帰自体にはCtrl-[を使う人も多くいます。
ただしこの方法はCtrlが押しやすい位置にあることが前提になります。標準配列のようにCtrlが左下端にあると、Escへ手を伸ばす代わりに小指を伸ばすだけで、移動距離があまり減りません。CapsLockをCtrlに入れ替える設定や、キーボード自体の選び方はVimmerがキーボード選びで重視すべきポイントにまとめています。
Ctrl-c は「キャンセル」の意味合いが強い
Ctrl-cも一見同じように見えますが、実行中のコマンドを強制的に取り消す性質があります。たとえばブロックビジュアルモードで3行選択し、$Aで各行末に文字を追記する操作を例にすると、確定に使うキーで結果が変わります。
| 入力 | Ctrl-[で確定 | Ctrl-cで確定 |
|---|---|---|
aaabbbccc | aaa_Xbbb_Xccc_X | aaa_Xbbbccc |
Ctrl-[なら全3行に反映されますが、Ctrl-cだと1行目にしか反映されません。挿入操作の確定処理そのものが打ち切られるため、2行目以降への反映が行われずに終わってしまいます。
使い分けの目安
| 状況 | おすすめ |
|---|---|
| 普段のモード復帰 | Ctrl-[ |
| 操作自体をキャンセルしたい | Ctrl-c |
「脱Esc」がVim習熟の通過儀礼のように語られることもありますが、その真偽はさておき、ホームポジションを維持できるCtrl-[を知っておいて損はありません。
コマンドラインモードでも同じキーが使える
Ctrl-[はコマンドラインモードでもEscの代替として機能します。検索や置換コマンドを入力中にやめたくなったときも、同じキーでキャンセルできるので、モードをまたいで統一した操作感で使えます。
インサートモード専用の代替マッピング
さらに手を伸ばす距離を減らしたいなら、インサートモードに限定してjkやjjのような連続入力をEscとして扱うマッピングを自作する人も多くいます。
inoremap jk <Esc>
この手のマッピングは通常のタイピングでjkと続けて打つ機会が少ない言語ほど相性がよくなります。日本語入力中に頻発するようなら、別のキーの組み合わせを選んだほうが安全です。
Ctrl-cで済ませていた頃、ビジュアルモードでの挿入操作が思った通りに反映されず戸惑ったことがあります。Ctrl-[に切り替えてからその問題が起きなくなり、両者の違いを体感として理解できました。今では用途に応じて自然に使い分けられるようになっています。
マッピングにすると入力が遅れる
jk や jj を Esc に割り当てると、j を打った時点でVimが次のキーを待ちます。この待ち時間があるため、j で始まる単語を打つと一瞬止まって見えます。
set timeoutlen=300 " マッピングの待ち時間を縮める
短くしすぎると、打つのが遅いときにマッピングが成立しなくなります。300ミリ秒あたりが折り合いの付く値ですが、自分の打鍵の速さで調整してください。待ちが気になるなら、そもそも設定なしで使える Ctrl-[ のほうが確実です。
Escを押したときのカーソルの動き
挿入モードから抜けると、カーソルが1つ左に動きます。挿入モードの間だけは行の最後の文字より1つ先まで進めるためで、ノーマルモードに戻るときに戻されています。
この動きが煩わしいなら、抜けたあとに1つ右へ戻す割り当てを書く方法があります。ただし行末では意図どおりに動かないので、慣れてしまうほうが素直です。
抜けたあとに元の位置から続きを打ちたいときは gi が使えます。最後に挿入モードを抜けた位置に戻って、そのまま入力を再開できます。
ターミナルによっては Ctrl-[ が届かない
Ctrl-[ は端末が Esc と同じ信号として送ります。そのため原理的にはどこでも動きますが、キーボードの配列によっては [ の位置が違い、押しにくいことがあります。
日本語配列では [ が右手の小指の位置にあり、英語配列より押しやすいという人もいます。逆に、修飾キーの割り当てを変えている場合は届かないこともあるので、自分の環境で一度試してから常用するかを決めてください。挿入モードで使えるキーは1文字移動の記事にもまとめています。
まとめ
Ctrl-[とCtrl-cは似ているようで意味が異なります。普段の復帰はCtrl-[、操作の取り消しが目的ならCtrl-cと覚えておくと事故を防げます。