vi キーバインドで、なぜ J が下で K が上なのか?
この記事はPlayGroundAdventCalenderの2日目です。担当はamaです。
こんにちは!バックエンドコースの ama です。今回は私が愛用しているエディタのVimについて考えた内容を話したいと思います。Vimの移動キーは何が由来なのでしょうか?
裏付け情報は調べましたが情報が不足していたので推測も混じります。ご容赦ください。ご指摘いただけると幸いでございます。
Vimとは
Vimはテキストエディタの一つで、Bill Joyが開発したviエディタを元に、Bram Moolenaarが拡張したものです。モードチェンジによる効率的なテキスト編集、強力な正規表現を使った検索置換、プログラマブルな設定言語およびそれによる多数のプラグインが特徴です。FSFが認めるOSSの一つで長年にわたり開発が続けられており、Unix系OSなど多くのプラットフォームで利用できます。
Vimではモードによる効率的な編集が特徴で、初期状態でテキスト入力ができないというのは聞いたことがあると思います。初期状態のノーマルモードでコピペや削除などテキスト操作全般を行い、テキストを挿入する時のみモードを切り替える、というスタイルで編集をするわけです。ノーマルモードではアルファベットキー単体でもショートカットキーにできるので、多くのショートカットを割りあてることができます。
本題
カーソル移動もノーマルモードで行います。移動に用いるキーは H
J
K
L
で、それぞれ 左, 下, 上, 右 に対応しています。そう、QWERTYの横一列になっているわけです。今回はなぜ移動キーがこのキーになっているかを考えようと思います。
Lv. 1: ADM-3Aキーボード
vi開発者のBill JoyはADM-3Aというマシンを使っていました。
上を見て分かるように、ADM-3Aのキーボードは上下左右のキーが別途には用意されておらず、H
J
K
L
のキーに修飾キーを組み合わせて上下左右を表現していたわけです。これを踏襲し、ノーマルモードでの左下上右が H
J
K
L
に対応した、ということはよく知られています。
これは余談ですが、UNIX系シェルにおいて ~
キーでホームディレクトリを指定するのは ~
に HOME
が印字されていたからと言われていますね。
それでは、そもそもADM-3Aキーボードで H
J
K
L
がそれぞれ左下上右に対応させた由来は何なのでしょうか?
Lv. 2: なぜ J が下で K が上なのか?(推測)
今回の本題です。配列的に H
が左で L
が右なのは分かると思いますが、 J
が下で K
が上の理由は何なのでしょうか?これについて考える前に、修飾キーとASCIIの伝統的な関わりについて話したいと思います。
キーコードにおける修飾キーの機能について
現在は全くこの限りではありませんが、元々 Ctrl
キーや SHIFT
キーはそれぞれキーコードを -0x40
、-0x20
する役割がありました。
キー | キーコード | 結果 |
---|---|---|
SHIFT + a |
0x61 - 0x20 = 0x41 |
A |
Ctrl + L |
0x4C - 0x40 = 0x0C |
Form Feed |
Ctrl + M |
0x4D - 0x40 = 0x0D |
Carriage Return |
Ctrl + D |
0x44 - 0x40 = 0x04 |
End of Transmission |
今でも入力の終了(EOF
)を Ctrl + D
で送信したり、Ctrl + L
でターミナルをクリアすると思います。
これは余談ですが、 Esc
は Ctrl + [
で送信できるので MacBook Pro TouchBar モデルでも物理キーでノーマルモードに戻ることができます。 また、Backspace
が遠い時 Ctrl + H
で送信することもできます。
参考: https://tyru.hatenablog.com/entry/2018/10/04/151740
ADM-3Aの場合は?
実はADM-3Aが上下左右を入力する修飾キーは Ctrl
でした。 Ctrl + [HJKL]
に対応するキーコードは何でしょうか?
キー | キーコード | 結果 |
---|---|---|
Ctrl + H |
0x4C - 0x40 = 0x48 |
Backspace |
Ctrl + J |
0x4C - 0x40 = 0x4A |
Newline |
Ctrl + K |
0x4C - 0x40 = 0x4B |
Vertical Tab |
Ctrl + L |
0x4C - 0x40 = 0x4C |
Form Feed |
悩ましいところですが、これらを上下左右に対応させるには Backspace
を左、改行に対応する Newline
を下にするのが素直なのかなと考えました。
結論としては、「viの上下左右キーはADM-3Aキーボード由来で、さらにその由来に H
J
K
L
のASCIIコードが関わっているのではないか」といったところでしょうか。
まとめ
- viの移動キーはADM-3Aのキーボード印字が由来と言われている。
- 修飾キーはキーコードを増減する役割がある。
H
J
K
L
の割り当てについてはキーコード由来ではないか (推測)
ADM-3Aの話やキーコードの修飾キーの役割までは調べられましたが、最後の方は推測になってしまいました。修正などございましたらご連絡くださると幸いです。
次回はyujiさんの記事です。