キーボードマクロ ー Emacsの基礎をしっかり学ぶ

マクロとは、複数の操作をまとめて後で呼び出せるようにする機能のことです。Emacsでも一連のキー入力を記録して、それを後で呼び出せるキーボードマクロという機能があります。

キーボードマクロを一度定義すれば、同じ処理を繰り返し実行できるようになります。

キーボードマクロを定義する

キーボードマクロを使うには、マクロを定義する必要があります。マクロ定義に使用するコマンドを次の表に示します。

コマンド説明コマンド名
F3 マクロの定義を開始する kmacro-start-macro-or-insert-counter
C-x ( マクロの定義を開始する(旧形式) kmacro-start-macro
F4 マクロ定義中なら定義を終了する。定義中でなければ最後のマクロを実行する kmacro-end-or-call-macro
C-x ) マクロ定義中なら定義を終了する。定義中でなければ最後のマクロを実行する(旧形式) kmacro-end-macro

キーボードマクロの定義を開始するにはF3をタイプします。定義を開始すると、それ以降のキー入力はマクロに記録されます。定義を終了するにはF4をタイプします。

定義の開始に旧形式のC-x (、終了するためにC-x )を使うこともできます。

実際にマクロを定義してみましょう。例えば、次のテキストの最後に「.txt」という拡張子を追加したいとします。

alpha
beta
gammma
delta

それにはalphaの行に移動して、次のようにタイプします。

F3 C-e .txt C-n F4

これで一連のマクロが定義されました。これを実行した後のテキストは次のようになるはずです。

alpha.txt
beta
gammma
delta

マクロの実行方法は後ほど説明します。

replace-stringのようにコマンドによっては、ミニバッファへの入力が必要なものがあります。マクロを定義するときには、通常通りミニバッファに入力します。そのマクロを実行すると、コマンドは同じ値が入力されたのと同様に実行されます。

ミニバッファからの入力を求めるコマンドでマクロを定義する例を紹介します。このマクロは現在の行をコピーしてhogeバッファにテキストを集めます。

F3 C-a SPC C-e M-w C-x b hoge RET C-y RET C-x b RET F4

マクロ定義中のタイプミスなどでマクロ定義をキャンセルしたい場合は、C-gをタイプします。

キーボードマクロを実行する

キーボードマクロを定義したら、マクロを実行できるようになります。マクロを実行するために使うコマンドを次の表に示します。

コマンド説明コマンド名
F4 最後に定義したマクロを実行する kmacro-end-or-call-macro
C-x e 最後に定義したマクロを実行する kmacro-end-and-call-macro
C-x C-k r リージョンの各行に対して最後のマクロを実行する。各行に対するマクロの実行は、ポイントを行の先頭へ移動してから実行される。 apply-macro-to-region-lines

F4はマクロ定義中でなければ、最後に定義したマクロを実行します。

C-x eも最後に定義したマクロを実行しますが、そのほかにF4と異なる機能があります。

まず、C-x eでマクロを実行した後、eをタイプするとマクロを繰り返します。繰り返したいだけeを連続してタイプすることができます。また、マクロ定義中にC-x eをタイプすると、マクロ定義を終了し、直ちにマクロを呼び出します。

F4やC-x eに数前置引数nをつけて実行すると、マクロをn回繰り返し実行します。数前置引数0を指定すると、エラーになるかC-gがタイプされるまで無限にマクロを繰り返します。

先程定義したマクロで試してみましょう。定義終了直後はポイントがbetaの行にあるはずです。

alpha.txt
beta
gammma
delta

その他の行にも「.txt」を追加したければF4を繰り返しタイプします。C-x eをタイプした後、eを繰り返しタイプしても同じです。

betaの行にポイントがあるとき、次のいずれかを実行しても同様のことができます。これらはマクロを3回繰り返します。

C-u 3 F4
C-u 3 C-x e

deltaがバッファの末尾なら、次のように実行しても目的を果たせるでしょう。

C-u 0 F4
C-u 0 C-x e

これは無限にマクロを繰り返します。しかし、バッファの末尾でエラーになるので、繰り返しはそこで終了します。

C-x C-k rは、リージョンの各行に対して最後に定義されたキーボードマクロを繰り返し実行します。リージョンの各行にマクロを実行するとき、まず行の先頭へポイントを移動してから実行されます。

例として先程の例て使ったテキストのalpha.txtの先頭に移動して、次のようにマクロを定義してみましょう。

F3 # SPC F4

そして2行と3行目をリージョンに選択してC-x C-k rを実行してみましょう。結果は次のようになるはずです。

# alpha.txt
# beta.txt
# gammma.txt
delta.txt

キーボードマクロにキー入力を追加する

定義したキーボードマクロに、キー入力を追加することもできます。そのようなときに利用するコマンドを次の表に示します。

コマンド説明コマンド名
C-u F3 最後のキーボードマクロを実行してから、そのマクロ定義にキー入力を追加するためマクロ定義を開始する。
C-u C-u F3 キーボードマクロを実行しないで、最後のマクロ定義にキー入力を追加するためマクロ定義を開始する。

C-u F3をタイプすると、最後のマクロを実行してから、マクロ定義が開始されます。追加したいキーを入力してマクロの定義を終了します。

C-u C-u F3は、最後のマクロを実行しないで、マクロ定義を開始します。同様に追加したいキーを入力してマクロの定義を終了します。

キーボードマクロの名前付けと保存

最後のキーボードマクロに名前を付けたり、キーシーケンスをバインドすることができます。名前を付けるとマクロ定義をファイルに保存することもできます。ファイルに保存すれば、他のEmacsセッションでも定義したマクロを読み込めます。

これらに使用するコマンドを次の表に示します。

コマンド説明コマンド名
C-x C-k n 最後に定義されたマクロに名前を付る kmacro-name-last-macro
C-x C-k b 最後に定義されたマクロにキーシーケンスをバインドする kmacro-bind-to-key
M-x insert-kbd-macro マクロの定義をLispコードとしてバッファーに挿入する -
M-x load-file Emacs Lispファイルをロードする -

最後のキーボードマクロに名前を付けるには C-x C-k nをタイプします。ミニバッファで名前を求められますので、名前を入力します。すでにある名前を付けようとするとエラーになります。

名前を付けると次のように名前でマクロを呼び出せます。

M-x name

また最後のキーボードマクロにキーシーケンスをバインドすることもできます。それにはC-x C-k bをタイプして、任意のキーシーケンスをタイプします。

すでにあるキーシーケンスにバインドしようとすると、バインディングを置き換えるか確認されます。

Emacsでは「C-x C-k 0 から C-x C-k 9」および「C-x C-k A から C-x C-k Z」が、マクロ定義にバインドするためキーシーケンスとして予約されています。バインディングの衝突を避けるためには、これらのキーシーケンスを使うといいでしょう。

これらのキーシーケンスにバインドする場合、すべてのキーシーケンスを入力する必要はなく、数字または文字だけで十分です。

C-x C-k b 4

マクロに名前を付けると、そのマクロ定義をファイルに保存することができます。そうすれば他のEmacsセッションで、そのマクロを使うことができるようになります。

最初に定義を保存したいファイルを訪問します。それから次のコマンドでバッファにマクロ定義を挿入します。

M-x insert-kbd-macro RET MACRONAME RET

それからファイルを保存します。

マクロ定義を読み込むには load-file を使います。

マクロ定義をinit.elに保存した場合は、Emacsを起動するたびにマクロは定義されます。

投稿日:

Copyright© アナグマのモノローグ , 2021 All Rights Reserved Powered by STINGER.