ご挨拶が遅くなってしまいましたが、はじめまして、hnwです。社内ではカレー部と酒飲み部に所属しています。
さて、今回はシェルでコマンド入力などの操作をする際に、Emacsライクなキーバインディングを知っていると効率が断然違いますよ、という話題です。
業務でプログラミングをする際によく言われることは、「できるだけ自分で書くな」ということです。無駄に分岐させたり、似たコードをコピー&ペーストで大量生産したりしてコードを増やすことは、バグを産む候補が増えるということであり、テストケースも増えてしまいます。できるだけプログラマがコードを書かずに済むような言語やライブラリやフレームワークほど優れていると言えるのではないでしょうか(もちろん他にも判断基準はありますが、重要な要素の一つでしょう)。
同様に、シェルでの操作の際には「できるだけタイプ数を減らす」ことがミスを防ぐ重要な要素の一つだと私は考えています。タイプ数が多ければ多いほど編集操作に集中力が必要になります。具体的には、ミスタイプに気づいて左右キーで間違えた場所に戻るような場合に、左右キーを押しつづけてカーソルが望んだ場所まで移動したのを確認してから指を離す、といった操作は無駄な集中力を使っていると私は感じます。
そういった場合どうするのが良いかというと、Emacsライクなキーバインディングが便利です。多くのシェルやreadlineベースの対話型インターフェース(MySQLやPostgreSQLの対話型クライアントなど)ではEmacsライクなキーバインディングが標準で利用でき、タイプ数を減らす上で強力な武器になります。
以下に私がよく使うものを紹介します。私は普段bashを使っていますが、他のシェルでも殆ど同じだと思います。
- Ctrl + a 行頭へ移動
- Ctrl + e 行末へ移動
- Ctrl + f カーソルを1文字進める
- Ctrl + b カーソルを1文字戻す
- Alt + f カーソルを1単語進める
- Alt + b カーソルを1単語戻す
- Ctrl + d カーソル上の文字を1文字削除する(=Deleteキー)
- Alt + d カーソルの位置から1単語を削除してバッファにコピー
- Ctrl + k カーソルの位置から行末までを削除してバッファにコピー
- Ctrl + y (Alt + d で消した内容などを)ペースト
- Ctrl + / (間違えてAlt + d で消した内容などを)元に戻す
- Ctrl + h カーソルの直前の文字を1文字削除する(=BackSpaceキー)
- Ctrl + p コマンド履歴を1個戻る
- Ctrl + n コマンド履歴を1個進む
- Ctrl + r コマンド履歴からインクリメンタルサーチ
中でも、Ctrl + a、Alt + f、Alt + b、Alt + dはコマンドライン編集では威力を発揮します(普段のEmacsの操作でもすごい威力ですけどね)。シェルの操作は単語(コマンド名・引数)単位のことが多いので、単語の移動や削除が強力なのだと思います。Vi派の人でも、シェルの操作だけはEmacsライクなキーバインディングを使う人が実在します。普段同じキーを連打する癖がある人は、一度試してみてはいかがでしょうか。
例を示しますと、下記のようにタイプしたところで、最初の引数のfoobarが間違いでbazが正しいことに気づいたとします(実際にこんなコマンドを打つかどうかはさておき)。カーソルはバッファ末尾にあるとします。
$ find foobar -type f -exec mv {} {}.bak \;
この場合、私ならCtrl + a、Alt + f、Alt + f、Alt + b、Alt + d、bazと打ちます。自分でも無意識に無駄なタイプをしているようで、本当ならCtrl + a、Alt + f、Ctrl + f、Alt + d、bazが正解のような気もします。
ちなみに、各種シェルにはViモードもあるそうですが、残念ながら普段常用している人を私は知りません。便利なのかどうか私には判断できませんが、Vi派の人はまずViモードを試してみても良いとは思います。
関連した話題として、私が個人で書いているブログに「bashでtcsh風なM-p/M-nでのヒストリ検索を行う」というエントリがあります。これは、tcshのAlt+nとAlt+pの標準の動作が私にとって直感的だったので、これをbashでも使おうという話題です。ご参考まで。これも無いと死ぬくらい便利だと私は思います。

コメント / トラックバックはありません
コメントする