[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

M. キーボードマクロ (2004/01/12)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=emacs21&node=Keyboard%20Macros"
"texi/emacs21/M.キーボードマクロ"へのコメント(無し)
検索全文Elisp

この章では,編集作業を記録し,何度も繰り返す方法について紹介します.

キーボードマクロ(keyboard macro) はある一連のキー入力を表すもので,ユーザ によって定義されます.たとえば,C-n C-dを40回も入力していることに気付いた としましょう.その時,C-n C-d を40回呼び出すようなキーボードマクロを定義す れば,作業効率を高めることができます.

キーボードマクロは、 ユーザーが一連のキー操作に基づいて定義したコマンドです。 たとえば、C-n C-dという打鍵を40回繰り返す必要があるとわかったら、 C-n C-dを実行するキーボードマクロを定義し、 それを40回繰り返す指定をして呼び出すと迅速に作業できます。

C-x (
キーボードマクロの定義を開始する (start-kbd-macro)。
C-x )
キーボードマクロの定義を終了する (end-kbd-macro)。
C-x e
もっとも最近のキーボードマクロを実行する (call-last-kbd-macro)。
C-u C-x (
もっとも最近のキーボードマクロを再実行したうえで、 その定義にキーを追加する。
C-x q
キーボードマクロの実行中にこの場所に到達したら、 実行の確認を求める (kbd-macro-query)。
M-x name-last-kbd-macro
もっとも最近に定義したキーボードマクロに(現在のEmacsセッションだけで有効な) コマンド名を与える。
M-x insert-kbd-macro
キーボードマクロの定義をLispコードとしてバッファに挿入する。
C-x C-k
まえに定義したキーボードマクロを編集する (edit-kbd-macro)。
M-x apply-macro-to-region-lines
リージョン内の各行に対して、最後に定義したキーボードマクロを実行する。

キーボードマクロは、それがLispではなくEmacsのコマンド言語で 記述されているという点で、通常のEmacsコマンドとは違っています。 このため、キーボードマクロは初心者でも簡単に作れ、 間に合わせとして定義するのにも向いています。 しかし、Emacsのコマンド言語は、 プログラム言語として知的で汎用的な動作を記述できるほど強力ではありません。 そういう場合には、Lispを使ってください。

キーボードマクロは、定義内容のコマンド列を実際に実行しながら定義できます。 いいかえれば、キーボードマクロを定義しているときに、 その定義の第1回目の実行が行われることになります。 ですから、コマンドがどのように動作するかを目で見ながら確認でき、 頭の中だけで動作を考えるよりも楽に定義できます。 コマンド列の最後まできてキーボードマクロを定義し終ると、 第1回目の実行も終ったことになります。 そのあとは、マクロを呼び出すことで何回でもそのコマンド列全体を実行できます。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

M.0.1 基本的な使い方

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=emacs21&node=Basic%20Kbd%20Macro"
"texi/emacs21/M.0.1基本的な使い方"へのコメント(無し)
検索全文Elisp

キーボードマクロの定義を開始するには、C-x (コマンド (start-kbd-macro)を打ってください。 それ以降打鍵するものは通常どおり実行されますが、 それと同時にキーボードマクロの定義として取り込まれます。 モード行にもそのことを表す`Def'という表示が現れます。 定義の終りまできたら、C-x )end-kbd-macro)を打ち込むと キーボードマクロの定義が完了します (C-x )はマクロの内容には含まれません!)。 たとえば、

 
C-x ( M-f foo C-x )

のように打鍵すると、 1単語分ポイントを前進させ文字列`foo'をバッファに挿入する、 キーボードマクロを定義できます。

定義し終えたキーボードマクロは、 コマンドC-x ecall-last-kbd-macro)で再実行できますし、 数引数として反復回数を指定することで多数回実行することもできます。 C-x )にも引数として反復回数を指定でき、 その場合は定義完了とともにただちに指定した回数だけ キーボードマクロを実行しますが、 定義しているとき(実行しているので)を1回目の実行として数えます。 ですから、C-u 4 C-x )と打つと、キーボードマクロをただちに3回実行します。 C-x eC-x )に反復回数0を指定すると、 キーボードマクロを無限回、つまり、エラーが発生するか、 C-g(MS-DOSではC-BREAK)が打鍵されるまで、 繰り返し実行します。

テキスト上の規則的にとびとびの位置に対して操作を行いたい場合には、 キーボードマクロを定義するときに、つぎに適用したい位置までポイントを 移動するコマンドを含めておきます。 たとえば、各行について変更を行いたければ、 ポイントを行頭に置いてからキーボードマクロを定義し始め、 最後にポイントをつぎの行の行頭に置いたところで定義を終えます。 キーボードマクロを繰り返し実行すると、 次々と連続する行に対して操作を実行できます。

キーボードマクロの定義を完了してしまったあとでも、 C-u C-x (を打ち込めば、その定義の末尾に内容を追加できます。 このコマンドは、C-x (に続いて現在のキーボードマクロの 定義内容全体を打鍵したのと同じ効果を持ちます。 その結果、定義されたとおりにマクロを再実行します。

キーボードマクロの中で、通常のキーと同様にファンクションキーを 使うこともできます。 マウスイベントを使うことさえできますが、その場合は注意してください。 キーボードマクロはマウスイベントを再現しますが、 マウス位置としては最初にキーボードマクロを定義したときの位置が そのまま使われます。 その結果は予想し難いものになります。 (現在のマウス位置を使っても、結果はさらに予想し難いものになる。)

キーボードマクロの中で必ずうまくいくとは限らないことの1つに、 C-M-cexit-recursive-edit)コマンドがあります。 このコマンドがマクロの中で開始させた再帰編集を終らせる場合には、 期待どおりに動くでしょう。 しかし、このコマンドがキーボードマクロを起動するまえに入っていた再帰編集を 終らせるとすると、 その終了処理の過程でキーボードマクロの実行も終らせてしまいます。

定義済みのキーボードマクロを編集するには、 C-x C-kedit-kbd-macro)と打ちます。 このコマンドに続けてマクロを起動する打鍵、つまり、 C-x eM-x nameなどのキー列を入れます。 すると、キー列に対応するキーボードマクロの内容が整形されて 特別な編集用メジャーモードのバッファに入ります。 そのバッファ中でC-h mと打つと編集方法が表示されます。 編集し終えたらC-c C-cと打ちます。

コマンドM-x apply-macro-to-region-linesは最後に定義された キーボードマクロを現在のリージョンの各行に対して実行します。 つまり、各行について、行頭にポイントを置いてからキーボードマクロを実行します。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

M.0.2 キーボードマクロの命名と保存

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=emacs21&node=Save%20Kbd%20Macro"
"texi/emacs21/M.0.2キーボードマクロの命名と保存"へのコメント(無し)
検索全文Elisp

新たにつぎのキーボードマクロを定義したあとでも 現在のキーボードマクロを使いたいなら、 M-x name-last-kbd-macroでキーボードマクロに名前を 付けておく必要があります。 このコマンドは、ミニバッファで名前を読み取り、 その名前でキーボードマクロを実行できるように定義します。 マクロ名はLispシンボルであり、このように定義されているので、 M-xで呼び出したりglobal-set-key (see 節 AE.3.1 キーマップ)でキーに対応付けたりできる有効なコマンド名になります。 その名前にキーボードマクロ以外のものがすでに定義されていると、 エラーメッセージが表示され何の変更も起こりません。

キーボードマクロにコマンド名を付けると、その定義をファイルに保存できます。 そうすると、別の編集セッションで使えるようになります。 まず、定義を保存したいファイルを訪問してから、 つぎのコマンドを使ってください。

 
M-x insert-kbd-macro RET macroname RET

このコマンドは、実行するとそのキーボードマクロと 同じ動作を行うLispコードをバッファに挿入します。 (insert-kbd-macroがLispコードの生成を代行するので、 Lispコードを理解する必要はない。) そうしたら、このファイルを保存します。 load-file(see 節 W.7 Emacs用のLispコードのライブラリ (2004/08/16))でファイルをロードできます。 保存するファイルとして`~/.emacs'(see 節 AE.6 初期化ファイル`~/.emacs')を使えば、 Emacsを起動するとつねにそのマクロが定義されます。

insert-kbd-macroに数引数を指定すると、 さらに(もしあれば)キーボードマクロに割り当てたキーを 記録するLispコードが追加されるので、 ファイルをロードしたときに同じキーがマクロに割り当てられます。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

M.0.3 変化のあるマクロの実行

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=emacs21&node=Kbd%20Macro%20Query"
"texi/emacs21/M.0.3変化のあるマクロの実行"へのコメント(無し)
検索全文Elisp

C-x qkbd-macro-query)を使うと、 query-replaceと同様に変更するかどうか尋ねてくる キーボードマクロを作れます。 キーボードマクロを定義しているときに、問い合わせが起きてほしい箇所で C-x qを打ちます。 マクロの定義中はC-x qは何の動作もしませんが、 あとでマクロを実行させたときにはC-x qの箇所で処理を 続けるかどうか尋ねてくるようになります。

C-x qの問い合わせに対する有効な応答は、SPC(またはy)、 DEL(またはn)、RET(またはq)、C-lC-rです。 これらの意味はquery-replaceと同じですが、 query-replaceのすべての応答が意味を持つとは限りません。

SPCは続行、DELはこの回の反復の残りを飛ばしてただちにつぎの 反復に進むという意味になります。 RETではこの回の反復の残りも以後の反復もすべて取り消します。 C-lは画面を再描画し、再度どうするかを問い合わせてきます。

C-rで再帰編集レベルに入るので、そこでキーボードマクロにはない 編集を行えます。 C-M-cで再帰編集から抜けると、再度どうするかを聞いてきます。 ここでSPCを打つと、キーボードマクロの残りの部分が実行されます。 キーボードマクロの残りの部分が望みどおりの動作をする状態に ポイントやテキストを保っておくのは、ユーザーの責任です。

C-u C-x q、つまり、数引数を指定したC-x qは、 まったく違った動作をします。 キーボードマクロの定義中でも実行中でも、 キーボードから入力を受け付ける再帰編集に入ります。 定義中の場合、再帰編集の中で行った操作はマクロの一部にはなりません。 実行中の場合、再帰編集の中で各反復ごとに個別の編集を行う機会が得られます。 See 節 AD.24 再帰編集レベル (2005/05/07)


[ << ] [ >> ]           [表紙] [目次] [索引] [検索] [上端 / 下端] [?]