9
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ViにおけるESCの代替キーマップは何が良いのか?

Posted at

前書き

全てのIDEを捨てNeoVimに乗り換えた人です。

ふと最近、Vimにおける要石「ESC」が押しにくいなと思い代替案を探していました。
調べると同じような人は多くいて、
参考になるような設定がいくつか見つかりましたので紹介しようと思います。

注意

「設定は全て個人の好みである」という考えが前提です。
優劣を決めようという意図はありませんので予めご了承ください。

候補一覧

ESC

本記事の主題に沿わないが、一応紹介

とあるRedditの投稿によると、圧倒的に使用者が多いようだ
結局バニラが一番ということだろうか?

CapsLock

ESCに疲れた多くのVimmerが辿り着くであろう境地

キーボードの一等地を占有する癖に使用頻度はワースト10に入るであろうCapsLock
ここにESCがあるだけでUXがとてつもなく改善される
先ほどのRedditでもCapsLock派を支持する声はとても多かった。

個人的にはとても好きな設定だが、残念ながらここはCtrlキーとして設定したいため却下。
Viしか使わないならESCでもいいが、それ以外のアプリで左手小指にESCがあっても嬉しくないのだ。

Ctrl-[

Vim標準の隠れESC

知っている人も多いと思うが、実はこれでもESCと全く同じ挙動になる。
なぜそうなるのかは以下の回答が参考になった。

In a terminal Ctrl-A is ASCII 0x01, Ctrl-B is ASCII 0x02 and so on. Ctrl-Z is 0x1A and Ctrl-[ is 0x1B.
And 0x1B is also the ASCII code for ESC.
Vim can't differentiate between ESC and Ctrl-[, because it gets the same key code when either is pressed.

ESCCtrl-[のキーコードが同じであるため、Vi側で区別がつかなくなり挙動が一致するらしい
そういうこともあるんだなと思いちょっと面白かった

個人的にはあまり押しやすくない。

Ctrl-C

間違えてVi開いた人を陥れる罠

Vi慣れしていない者がvisudogit config --editなどでうっかり入るとこれで詰む
「コマンドなんてCtrl-Cで止めれるだろ!」という甘い考えを捨てることになる要因

NeoVimにおけるCtrl-Cの定義は、

help Ctrl-c
CTRL-C                  Interrupt current (search) command.
                        In Normal mode, any pending command is aborted.

とのことで、ESCと同義ではないことに注意。

打ちなれているキーだということでしばらくこれを使っていたのだが、以下のような問題があった。

  • VisualModeからShift-iで入れる複数行同時入力ができない
    • ESCで閉じないとキャンセル扱いになり消える
  • PluginによってはESC時に実行されるものがあり、Ctrl-Cでは実行されない
  • そもそもESCと機能的に異なるので気持ち悪さがある

人によっては問題に感じないかもしれないが、いつか困ることになる可能性があるので注意。

jj / jk / kj

最初に思いついた人天才だと思うキーマップ

絶妙に押さないコンビネーションjjESCにする。
ホームポジションを崩さないで押せる上に、すぐにカーソル移動できる状態を保証できる。

ただし、jないしk単体を入力したい際に、timeoutlen秒の待ちが発生するため注意が必要。

個人的には打ち間違いしにくい & Normal Modeで打っても元の位置に戻るjkが好きです。

ii

一癖あるが合理的なアイデア

iでInsertになるならiでNormalになるべきだと言わんばかりの設定。
2回押しが必要なため予期せぬESCは起きにくいだろうが、3回押すと再度Inserになってしまう。
(i連打でループできる)

jkと比べるとホームポジションを外れるため少し押しにくい気もするが、ESCに比べたら遥かに良い。
こちらもi単体を入力したい際に、timeoutlen秒の待ちが発生するため注意が必要。

Tab

インデントに困らないなら非常に優秀

インデントSpace派なら結構良いと思う。
Tabキーの使用頻度が大幅に落ちるため、そこをESCとする。

ふとTab使いたい時に困りそうだが、ポジションは最高。

Enter

鬼才

Enterを上書く。

改行したい時はShift-EnterCtrl-Enterで良いらしい。
押しやすいけどもUX悪そう。

発想は面白いけど絶対使わない。

Ctrl + xxx系

可能性は無限大

デフォルトでInsert時のCtrl + xxxってそこまで多くないので、空いているキーを自由に変える。
よく見かけたのがCtrl-LCtrl-Space

Ctrl-Spaceは結構好きなバインドで、左手で完結できるあたりがとても良い。

個人的結論

色々調べて試し、今現在落ち着いたのはCtrl-gでした。理由はいくつかあります

  • 元々ESCは左手で押すので、左手で完結するキーが良い
  • なるべくホームポジションから押しやすい場所がいい
  • Normal Mode時によく使うキーバインドと同じものは避ける
    • 誤操作防止
  • Ctrl-SpaceはTmuxで使っているためVimでは使えない
  • Karabiner-Elementsでも同様の設定が簡単にできる

jkとこれで悩みましたが、単体入力時の待ちが少し気になったためやめました。
とはいえ今でも癖でjkしてしまう時があるため、とても良い設定だったんだなと思います。

ESC代わりのキーをどこに置くかだけでも操作性は大きく変わるので、
みなさんも自分に合った設定を探してみてはいかがでしょうか。

9
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?