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 等に貼り付けておく。