採用はこちら!

Shinonome Tech Blog

株式会社Shinonomeの技術ブログ
3 min read

vi キーバインドで、なぜ J が下で K が上なのか?

vi キーバインドの移動キーについて、配列の由来について掘り下げて考えてみます。

この記事は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というマシンを使っていました。

KB Terminal ADM3A
CC BY-SA 3.0 <http://creativecommons.org/licenses/by-sa/3.0/>, via Wikimedia Commons

上を見て分かるように、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 でターミナルをクリアすると思います。

これは余談ですが、 EscCtrl + [ で送信できるので 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さんの記事です。