2010年12月24日金曜日

C-u M-x shell とその省力化

Emacs の中で shell というコマンドをよく利用する。仕事で使うOSはWindowsだけど、安易にマウスに手を伸ばさないで、目を閉じて、GNUのコマンド群やPerlのワンライナーを頭の中で組み合わせて、打鍵して、実行する。

その shellを使うにあたり、ただ単にM-x shellと実行すると、*shell*バッファが1個だけしか使えないのだが、並行作業が多いので複数のバッファを使いたくなる(顧客ごと、プロジェクトごとのバッファ)。

複数の *shell* を開くには、いわゆる「前置引数(prefix argument)」を使って shellコマンドを実行する。具体的には次のようにキーを打つ。

C-u M-x shell[Enter][Enter]

この結果、*shell*, *shell*<2>, *shell*<3>,...という具合に番号付きのバッファが順次生成されてゆく。

仕事上の要求はこれで満足されるが、それにしてもC-u M-x shell[Enter][Enter]と毎回打っていると面倒になってくる。なので、この操作をもっと省略するにはどうすればいいかを考える。

最初、 (shell) をラップする関数を定義して、それにキーを割り当てるという方法を思い付いたが、どうも前置引数関連の関数/変数の仕様がよく理解できず挫折( (universal-argument), current-prefix-arg など )。

仕方が無いので、以下のようにキーボードマクロで実現することにした。

1. C-u M-x shellをマクロとして記録

次のようにキーを打つ。

C-x ( C-u M-x shell[Enter][Enter] C-x )
2. キーボーマクロに名前を付ける

名前はとりあえずたった一文字の「s」にすることにして、次の式を評価。

(name-last-kbd-macro 's)

この時点で、M-x s[Enter] を実行するとシェルが複数起動するようになるはず。

3. キーボードマクロの永続化
(insert-kbd-macro 's)

*scratch*バッファで上の式を評価すると、下のような出力が得られるはず。

(fset 's
   [?\C-u ?\M-x ?s ?h ?e ?l ?l return return])

これがキーボードマクロの定義。今後も使用するため、 .emacs, init.el 等に貼り付けておく。

0 件のコメント:

コメントを投稿