Dynamic Macro
Up$Date: 2002/06/08 09:40:53 $ $Revision: 1.2 $

エディタで同じ操作を何度も繰り返すのに疲れたことはありませんか? GNU Emacs で動作する Dynamic Macro (dmacro.el) を使うと、 同じ操作を二度実行した後で 繰り返しキー を押すだけで、 その操作を何度も再実行させることができます。

お試しページ で体験できます。

使いかた 活用例 ダウンロード 設定 歴史 論文(HTML) 論文(英語/PDF) メーリングリスト English page

使いかた

例えばユーザが
abcabc
と入力した後 を押すと、 Dynamic Macroは “abc” の入力操作の 繰返しを検出してそれを再実行します。 その結果テキストは
abcabcabc
となります。また、
abcdefab
と入力した後 を押すと、 Dynamic Macroはこれを “abcdef”の 入力の繰返しと判断し、 繰返しの残りの部分を予測実行して “cdef” を入力し、 テキストは
abcdefabcdef
となります。

ここでもう一度 を押すと、 “abcdef” の入力が繰り返されて、 テキストは

abcdefabcdefabcdef
となります。

カーソル移動などを含むあらゆるキー操作の繰返しが により再実行されるため、例えば

line1
line2
line3
line4
というテキストを
% line1
% line2
line3
line4
のように編集した後 を押すと、テキストは
% line1
% line2
% line3
line4
のようになり、その後押すたびに次の行頭に “% ”が 追加されていきます。

このような機能は、繰返しパタンの認識により キーボードマクロを自動的に定義していると考えることもできます。 キーボードマクロの場合は 操作を開始する以前にそのことをユーザが認識してマクロを登録する必要がありますが、 Dynamic Macro では 実際に繰返し操作をしてしまった後でそのことに気がついた場合でも を押すだけでその操作を再実行させることができます。 また、キーボードマクロを定義する場合は マクロの開始と終了を間違えずに指定する必要がありますが、 Dynamic Macroでは を押すだけでよいので簡単です。

活用例

文字列置換

テキスト中の全ての「abc」を「def]に修正する場合を考えてみます。 「abc」を検索するキー操作は “Ctrl-S a b c ESC” で、これは “DEL DEL DEL d e f” で「def」に修正することができます。 引き続き次の「abc」を検索する “Ctrl-S a b c ESC” を入力した後で を押すと “DEL DEL DEL d e f” が予測実行され、新たに 検索された「abc」が「def」に修正されます。ここでまた を押すと次の「abc」が「def」に修正されます。 このように を押していくことにより順々に文字列を置換していくことができます。

罫線によるお絵書き

繰返しを含む絵を簡単に書くことができます。例えば、
 ─┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐
  └┘└┘└┘└┘└┘└┘└┘└┘└┘└┘└┘└┘└┘
のような絵を書きたい場合は、keisen.el などを使って
 ─┐┌┐
  └┘
と書いた後で「繰返し」キーを押すと、
 ─┐┌┐
  └┘└┘
となり、もう一度 を押すと
 ─┐┌┐┌┐
  └┘└┘└┘
となります。同様に
 ┌─┐┌─┐┌─┐┌─┐┌─┐┌─┐┌─┐┌─┐
 └─┘└─┘└─┘└─┘└─┘└─┘└─┘└─┘
のような絵も
 ┌─┐  ─
 └─┘
だけ入力した後 を連続して押すだけで描くことができます。

繰返し予測の方法

入力の繰返しの予測手法はいろいろ考えられますが、dmacro.elでは 以下のような優先度をもたせています。
  1. 同じ入力パタンが予測の直前に2度繰返されている場合はそれを 優先する。繰返しパタンが複数ある場合は長いものを優先する。

    例えば、「かわいいかわいい」という入力では「かわいい」と いうパタンが繰り返されたという解釈と、「い」というパタンが 繰り返されたという解釈の両方が可能ですが、この場合 「かわいい」を優先します。

  2. 1.の場合にあてはまらず、直前の入力列[s]がそれ以前の入力列の 一部になっている場合(直前の入力が[s] [t] [s]のような形に なっている場合)は、まず[t]を予測し、その次から[s] [t]を予測 する。このとき[s]の長いものを優先し、その中では[t]が短いもの を優先する。

    例えば「abracadabra」という入力では、[s]=「abra」が最長なので [s] [t]=「cadabra」の予測が優先されます。

設定方法

.emacsなどに以下の行を入れて下さい。
(defconst *dmacro-key* "\C-t" "繰返し指定キー")
(global-set-key *dmacro-key* 'dmacro-exec)
(autoload 'dmacro-exec "dmacro" nil t)
*dmacro-key*の設定については 以下のような注意が必要です。

歴史

Dynamic Macroは増井により1993年に開発されたシステムです。

今回(2002/6)新しくWebで公開した版は、 小畑英司氏と峰伸行氏によりXEmacs でも動作するように改造していただいたもので、 Super, Hyper, Alt キーにも対応しています。 GNU Emacs 18, 19, 20, 21, XEmacs 21 で動作することが確認できています。 これをVersion 2.0とし、これ以前の版は1.0とします。

メーリングリスト

QuickMLを利用して Dynamic Macroメーリングリストを運用しています。 参加ご希望の方は
To: dmacro@quickml.com
Cc: masui@pitecan.com
From: (自分のアドレス)

MLに参加します
というメールを送って下さい。 本文は空でなければ何でもかまいません。


増井俊之 @ Pitecan.com
masui@ptiecan.com
$Date: 2002/06/08 09:40:53 $ $Revision: 1.2 $