シェルの操作にAltキーを使おう

ご挨拶が遅くなってしまいましたが、はじめまして、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でも使おうという話題です。ご参考まで。これも無いと死ぬくらい便利だと私は思います。

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

コメントする