Vimのhjklと矢印キー、結局どっちを使うべきか
矢印キーでも移動できるのに、なぜVimmerはわざわざhjklを使うのか、最初は意味が分かりませんでした。実際にホームポジションから手を動かさずに操作してみると、その理由がはっきり分かりました。1文字より大きい単位の移動はカーソル移動まとめで扱っています。
目次(10項目)
| キー | これだけ覚える |
|---|---|
| hjkl | 左・下・上・右へ1文字ずつ移動 |
| 矢印キー | 同じ動作。全モードで使える |
| 5j / 3l | カウントを前置して複数文字分まとめて移動 |
2つの移動手段
| 方式 | 左 | 下 | 上 | 右 |
|---|---|---|---|---|
| hjkl | h | j | k | l |
| 矢印キー | ← | ↓ | ↑ | → |
矢印キーはすべてのモードで使えるのに対し、hjklはノーマルモードとビジュアルモードでのみ動作します(インサートモードでは通常の文字入力になります)。
hello
hello
hjklが推奨される理由
最大の理由はホームポジションから手を離さずに済むことです。矢印キーを押すには右手をキーボードの右下まで移動させる必要がありますが、hjklはホームポジション付近の右手の位置にそのまま配置されています。移動のたびに手の位置を大きく動かす必要がないぶん、タイピングの流れを止めずに編集を続けられます。
jとkの向きが直感と逆に感じる人もいますが、これはキーボード上でのタイプライター的な配置(上の段が上方向、下の段が下方向に対応しない)に由来するもので、慣れの問題としてすぐに解消することが多いです。
カウントと組み合わせる
5j " 下へ5行移動
3l " 右へ3文字移動
数字を前置きすれば、その回数分まとめて移動できます。近距離ならこれで十分ですが、10行以上先に移動したいなら{行番号}Gや検索コマンドのほうが速いことが多いです。近距離はカウント付きのhjkl、遠距離はジャンプ系コマンド、と距離に応じて手段を切り替えるのが実用的です。何行下かを毎回数えるのが面倒なら、相対行番号を出しておくと、前置きする数字がそのまま画面に並びます。
矢印キーのほうが有利な場面
絶対にhjklを使わなければならないわけではありません。インサートモード中に少しだけカーソルを動かしたいだけなら、いちいちEscでノーマルモードに戻るより矢印キーのほうが早いこともあります。またVimに不慣れな人と画面を共有しながら操作するときは、矢印キーのほうが直感的に伝わりやすくなります。使い分けを頑なに拒む必要はありません。
最初の数週間は矢印キーのほうが速く感じていましたが、hjklに慣れてからは他のエディタで矢印キーを使うほうがむしろ遅く感じるようになりました。慣れるまでの数週間さえ乗り越えれば、体に染みついてもう戻らなくなる類のものだと思います。今ではブラウザやチャットツールでも無意識にj/kを押して戸惑うことがあるくらいです。
キーボード配列によっては見直しが必要なことも
hjklが快適に感じるかどうかは、実は使っているキーボードのレイアウトにも左右されます。標準的な配列を前提にした位置なので、独自のキー配列やコンパクトキーボードを使っている場合は、自分の手の大きさや配置に合わせてキーマッピングを調整している人も多いです。デフォルトのまましっくりこない場合は、無理に矯正せず自分なりの配置を探ってみるのも1つの手です。
方向を逆にして、矢印キーが物理的に無い機種を選んでhjklに強制的に慣れる、という進め方もあります。どんな観点でキーボードを選ぶかはVimmerがキーボード選びで重視すべきポイントに、実際の機種を並べた比較はプログラマー向けキーボード比較にまとめています。
矢印キーを封じる設定はすすめない
覚えるために矢印キーを効かなくする設定がよく紹介されますが、実際にはおすすめしません。挿入モードでの微調整や、コマンドラインでの履歴の呼び出しにも矢印キーを使うためです。
nnoremap <Up> <Nop> " こうしなくても身につく
矢印キーは押すたびに手が動くので、放っておいても不便さから h j k l に移ります。それより、単語単位の移動や検索を先に覚えるほうが、移動そのものの回数が減って効果があります。
挿入モードでの移動
入力中に少しだけ戻りたいとき、Esc で抜けて直してまた入るのは手数がかかります。挿入モードのまま使えるキーを知っておくと、この往復が減ります。
Ctrl-o {コマンド} " 1回だけノーマルモードのコマンドを実行
Ctrl-w " 直前の1単語を消す
Ctrl-u " 打ち始めからこの行に打った内容を消す
Ctrl-o は特に便利で、Ctrl-o A なら行末へ移って入力を続けられます。1回だけ抜けて戻る、という動きなので、モードの切り替えを意識せずに済みます。
1文字移動を減らすことを考える
結局のところ、h と l を何度も押している状態は、移動の手段が足りていないことの表れです。行の中を動くなら f や t、単語なら w や b、行の端なら 0 や $ が用意されています。
1文字移動が担当するのは、目的地の1つ手前まで来たあとの微調整だけです。連打していると気づいたら、そこは別のキーで一気に行ける場所だと考えてください。行の中の移動はf と t の記事、単語単位は単語移動の記事にまとめています。
まとめ
hjklと矢印キーはどちらも1文字移動という点では同じですが、ホームポジションを維持できるhjklのほうが長期的には効率的です。単語単位・行単位のより大きな移動は単語移動や行頭/行末移動を参照してください。
ここで扱ったキーは、ブラウザ上で動くVim道場のカーソルを動かすでそのまま試せます。インストールもログインも要りません。