アプリを作ろう(番外):キーバインド
・キーバインド:どのキーを押せば何が起こるか
・矢印キーは使わない
・Emacsキーバインドにすれば全て解決
はじめに
この記事はプロを目指す人向けの記事です。初心者は読まなくてもいいですし、読んでも「そんなに必要なことの?」という思いしか抱かないと思います。
キーバインドとは
キーバインドとは、キーを押した時に何が起きるか、その機能とキーを結びつけることになります。例えばCtrlを押しながらCを押せばコピーになり、Ctrlを押しながらVを押せばペーストになります。この組み合わせがキーバインドです。
でも、キーバインドで呼び出す機能ってそんなにあるでしょうか?保存・読み込みなど、便利なのは確かですがマウスで選べば良いだけです。なぜ、プログラマーはキーバインドにこだわるのでしょうか。
プログラマーはマウスと矢印キーを(極力)使わない
プログラマーは一日に大量の文字をタイプします。そのため手元を見ないブラインドタッチは当たり前、ホームポジションから極力指は動かしません。
そのため、マウスを使った操作を極端に嫌い、矢印キーやBackSpaceなんかの「遠い位置にあるキー」を使いたがりません。
そこで、キーバインドで遠い位置にあるキーの代わりを近い位置のキーに割り当てます。この割り当て方には様々な流派があるため、自分の流派に合わせたキーバインドを設定する必要がでてくるのです。
例えばCtrl+Pで上矢印、Ctrl+Nで下矢印といった具合に特定の組み合わせを矢印キーに割り当ててしまいます。こうすることで近い位置のキーだけを使いながらプログラミングすることを可能とします。
ちょっと例を見てみます。
Happy Hacking Keyboard(以下、HHKB)というキーボードをご存じでしょうか。
PFUというメーカーから発売されているプログラマー御用達のキーボードで、価格は2,3万円と高価ながらも絶大な人気を誇っています。
https://www.pfu.fujitsu.com/direct/hhkb/detail_pd-kb401w.html
HHKBは日本初のハッカーと呼ばれる和田栄一先生が作ったキーボードで、昔の余計なキーがたくさんついた巨大なキーボードではなく、持ち運べるサイズのコンパクトなキーボードとして開発されました。キーボードはプログラマーとして最も重要なインターフェースであり、カウボーイの馬の鞍に例え、環境(馬)が変わってもキーボードは体に馴染んだものを使い続けるという思想のもと、必要最低限のキーのみで構成されたシンプルなキーボードになります。
このキーボードを見ても分かるとおり、矢印キーがありません。HHKB Liteは右下部分に矢印キーがあるのですが、Professional版ではなくなります。
一応、Fnキーを使って押すことはできるのですが、ほとんどのプログラマーはキーバインドで解決します。
余談ですが、HHKBを使っているのにFnキーを使ってる人、HHKBを複数使っている人を見かけると悲しい気持ちになります。
英語配列キーボード
プログラマーはなぜか英語配列キーボードを好んで使います。昔はSunのワークステーションなどを買った場合に日本語配列のキーボードが用意されておらず、英語配列キーボードを使わざるを得なかったというのが起源だと勝手に思っていますが詳細は不明です。
一応それらしい理由として、プログラマーがよく使うキーのダブルクォテーション(”)とシングルクォテーション(’)が右手小指のすぐ横にあったり、括弧キーが並んでいて分かりやすいなど言われたりします。しかし、例えば@や+-なんかは逆に使いづらかったりします。
結局は慣れですが、筆者が英語キーボードを使う理由は「Enterキーが横に長く押しやすいから」という理由だけです。
これに慣れると日本語配列のキーボードはEnterが遠くて押しづらく、プログラミングの効率が下がります。とはいえ、慣れです。
Ctrlキーの位置
一方でCtrlのキーはAの左にします。英語配列でも日本語配列でも一緒です。
HHKBの場合は最初からCtrlがAの左にあります。Macの日本語配列も同様です。
そもそもAの左というのはとても良い場所です。左手の小指のすぐ左なのですぐに押すことができます。一等地です。こんないい位置にほとんどの人が使わないCapsLockのキーが割り当てられていることが大変驚きです。
これもまたSun MicrosystemsのキーボードはAの左がCtrlであったことから、この位置にCtrlを持ってくることが大変多いです。後述するEmacsキーバインドをする人はほぼ必須でこの位置にCtrlキーを持ってきます。
Caps LockをCtrlにする方法は全てのOSで用意されています。
Windowsの場合
昔からWindowsでCtrlとCapsを入れ替えるにはレジストリを変更する必要があります。regeditで変更して問題ないのですが、万が一設定を間違えた場合、OSの起動ができなくなる場合があります。
そのため、いまではMicrosoft社が純正のレジストリ変更ツールを用意してくれています。下記のURLからダウンロードできます。
https://docs.microsoft.com/en-us/sysinternals/downloads/ctrl2cap
MacOS/Linuxの場合
MacやLinuxでは設定メニューから変更可能です。Linuxはディストリビューション・バージョンによって変わりますが、設定のキーボードあたりに大体あります。ない場合はXの設定を変更しなければならないかもしれません。これは割愛します。
EmacsかVimか
いよいよ矢印キーのキーバインドを設定していきます。が、その前にプログラマーを二分するエディタ戦争を説明しなければなりません。EmacsとVimの長い戦いの話になります。
Emacs
Emacsは1972年に誕生し、高機能・多機能なテキストエディタとして長く使われています。大変に多機能なのでもはやシェルなどの起動は必要なく、使いこなせばEmacs上で全ての作業が完結します。ブラウザまで動きます。ただ、その反面、起動には時間がかかり、処理も重いという特徴があります。また多機能すぎて初心者には取っつきにくい部分があります。
Vim
VimはVi Improvedの略で、もともとのViというエディタを拡張したものになります。1987年に誕生しましたが、viは1976年に誕生しています。大変軽量に作られている上にLinuxのディストリビューションではほぼ標準的にインストールされているため、サーバーログインしての設定ファイル編集なんかはvimが標準的に使われています。軽量ですが拡張性も高く、今ではプログラマのテキストエディタとしてEmacsを圧倒しています。
キーバインド
EmacsもVimも矢印キーでのカーソル移動が可能です。(筆者は最近までVimで矢印キーのカーソル移動を知りませんでした・・・)
ですが、前述の通り矢印キーでの移動はストレスでしかないので他の方法が用意されています。
まず、Emacsですが、Ctrlを押しながらp(↑)、n(↓)、b(←)、f(→)が割り当てられています。それぞれ、Previous、Next、Back、Forwardの頭文字として覚えると良いです。そのほかにも行の先頭(a:Ahead)や末尾(e:End)などがあります。
一方でVimはそう簡単ではありません。まず、Vimには移動モードと入力モードが存在します。通常は移動モードで、テキストを書き込むときだけ入力モードにします。
移動モードではテキスト入力ができませんが、カーソル移動が楽です。それぞれ、h(←)、j(↓)、k(↑)、l(→)で移動できます。キーボードを見ると分かりますが十字キーを並べたようになっているため分かりやすいです。また、^(行頭)、$(末尾)などもあるほか、数字を入力してからキーを押すとその回数繰り返すといった機能もあります。(5j:5行下に移動)
入力モードにするにはiやaなどを入力して切り替えます。入力モードから戻るにはESCを押します。このモードの切り替えが分かりにくく初学者にとっては鬼門となりますが、慣れてしまうと大変便利です。
ちなみにTwitterなんかはこのキーバインドで画面移動できます。試してみてください。
Emacsキーバインドのすすめ
さて、VS CodeではEmacsキーバインドをおすすめします。世のプログラマーはVimを使っている人が大半ですが、それでもEmacsキーバインドをすすめます。Emacsキーバインドを覚えたらVimキーバインドを覚えなくても良い、などということはありません。絶対にVimも使います。その前提でVS CodeではEmacsキーバインドにしましょう。理由は2つあります。
シェルとの相性
シェルを使う場合、標準でEmacsキーバインドが効きます。しかし、vimのキーバインドは使えません。設定を変更することでvimのキーバインドに変更することは可能ですが、全ての場合で設定変更可能ではありません。プログラマーは環境設定に重きを置く、とは書きましたができる限り標準で利用することが大切です。
モード切替が必要ない
vimを使ってプログラミングをする場合、あまりウィンドウを切り替えることはありません。CUIで作業するにしてもログインしているシェルから切り替えることも少ないでしょう。一方で特に初学者はブラウザやファイラなどウィンドウを切り替えて作業することが多いはずです。Web開発なんかでもブラウザと行き来することが多くなります。
このとき、vimのようにモードがあるとウィンドウを切り替えたり戻ったりするときにどちらのモードだったか忘れがちです。移動モードにしてから切り替える、戻ってきたらESCを連打するなど、いろんなテクはありますがEmacsキーバインドならそういう作業が必要ありません。いつでもキーバインドが効きます。
これは、同様にOSでのキー操作までキーバインドで対応しようとした際に便利になります。例えばWindowsならAutoHotKey(http://ahkwiki.net/Top)を使うことでキーバインドを変更可能です。このときに移動モードなのか入力モードなのかを考え始めるととても煩雑になります。Emacsキーバインドならその必要もありません。
VS CodeでのEmacsキーバインド
VS CodeでEmacsキーバインドを使うなら「Awesome Emacs Keymap」の拡張が良いでしょう。また、使うキーバインドもひとまずは下記のキーバインドだけ覚えれば十分です。C-はCtrlを押しながら、の意味になります。M-はMetaキーを押しながら、なのですがWindowsの場合はAltキーになります。
・↑:C-p、↓:C-n、←:C-b、→:C-f
・先頭:C-a、末尾、C-e
・Page Down:C-v、Page Up:M-v
・選択開始:C-Space、カット:C-w、コピー:M-w、ペースト:C-y
・Delete:C-d、Back Space:C-h、検索:C-s、アンドゥ:C-_
・保存:C-x C-s
最後の保存はC-xを押した後にC-sを入力します。面倒なのでCtrlキーは押しっぱなしにしてx、sと入力します。
他にもたくさんのキーバインドがありますが、無理に覚える必要はなく、よく使う機能は覚えるようにしましょう。
まとめ
この記事ではキーバインドについて解説しました。プログラマーはキー入力の効率を極限まで求めます。その中でEmacsとVimという二つのキーバインドが生まれています。プログラマーは両方とも使えるようになる、ということと、VS CodeではEmacsキーバインドを使うようにしていきましょう。