増井先生のDynamic MacroをAutoHotKeyで実装してみた

DynamicMacroAHK

Dynamic Macroとは

慶應義塾大学教授の増井俊之氏が考案し、Emacsのマクロで実装されていたDynamic Macroというツールがあります。詳細は下記リンク先を参照いただければどんなものかお分かりいただけると思いますが、簡単に言うとエディタで同じ操作の繰り返しに気づいた時点で、呼び出しキー(標準はCtrl+T)を押すと、その時点までのキー操作の履歴から繰り返しを見つけてキーボードマクロとして実行してくれるものです。

ある程度本格的なエディタであれば、「キーボードマクロ」の記録と再生機能がついていると思いますが、これだと記録するときに、どの操作を起点にしてどの操作を終点にすると再生したときに自分の死体操作がうまく連続して繰り返されるかを考える必要があります。
Dynamic Macroは常にキーボードの入力を監視していて、繰り返しに気がついた時点で呼び出せば、直近のキーボード履歴から繰り返し操作を自動的に抽出してキーボードマクロとして実行してくれるので非常に便利です。また、Dynamic Macroには単に繰り返しを抽出するだけでなく、直近のキー操作が繰り返しになっていなくても、繰り返しになるような次のキー操作を予測した上で繰り返しのキーボードマクロを実行できます。

例えば、以下の状態でCtrl+Tを押すと、

testtestCtrl+T

以下のようになり、以後Ctrl+Tを連続で押すことにより「test」が繰り返し入力されます。

testtesttest

これが単純な「繰り返し」の自動抽出です。

一方「予測」機能は以下のような動きをします。以下のの状態でCtrl+Tを押すと、

testteCtrl+T

まず以下のように補完され、以後Ctrl+Tを連続で押すことにより「test」が繰り返し入力されます。

testtest

この予測機能により、何かのキーボード操作をしているときに、なんとなく繰り返しに気がついた時点で、Ctrl+Tを押すと良い感じに補完して繰り返しのキーボードマクロを実行できるようになります。つまり始点と終点を考えなくても良いということで、これがDynamic Macroの肝だと思っています。

AutoHotKeyによるDynamic Macro実装

DynamicMacroAHKについて

Dynamic Macroは元々Emacsのマクロで書かれているので、基本的にEmacs以外のエディタでは利用できませんでした。最近は他環境の移植版として、Firefox版、Atom版があるようです。

私は最近Dynamic Macro(DM)の存在を知り、自分の環境でも使ってみたくなりました。
しかしWindowsユーザーの私は、ブラウザはChromium EdgeまたはIE(会社では未だにIEが標準)を使っていますし、エディタはVS CodeをはじめVim、サクラエディタ、秀丸エディタ、Meryなど用途に応じて色々と使い分けていますが、残念ながらDMの移植版があるAtomは使っていません。また、最近仕事で一番テキストを入力しているソフトは自作メモアプリのVaNTだったりします。

Windows上で動作する、Dynamic Macro実装がないか調べてみたのですが、簡単に使えるものが見つからなかったので自分で作ることにしました。
VS Code用の拡張として作るか、VaNTに組み込んでしまうか、など実装方法を考えた結果、どんなソフトでも利用できるようにAutoHotKeyで実装することにしました。これであればWindows上で動作する全てのソフトでDynamic Macroが使えるはずです。

今回ある程度動作するものができたので「DynamicMacroAHK」としてGithubで公開しました。同じくWindows上でDynamic Macroを使いたい方々と一緒に良いものに仕上げていきたいと思います。

上記で公開しましたので、ご興味があるかたはお使いいただき、改良していただいた場合はPull Requestいただけると大変嬉しいです。

DynamicMacroAHK の機能と使い方

必要なもの

※ AutoHotKeyのKeyHistoryを利用しているため、現状スクリプトをコンパイルした状態で使うことはできません。

AutoHotKeyをインストールしてない、触ったことがないという方は以下の記事をご覧ください。

起動と基本的な使い方

  • DynamicMacro.ahkをダブルクリックして実行します。
  • 下記設定のInvokeHotKeyで割り当てたホットキー(デフォルトはCtrl+T)を入力すると、その時点までのキー操作から繰り返しを見つけてそれをマクロ実行します。
  • 繰り返しが見つからない場合は、キー操作を予測した上で繰り返しになるものを探します。
  • まずキー操作から\mathbf{X}\mathbf{Y}\mathbf{X}を探し、\mathbf{Y}を予測して補完します。(上記の「testte」の例だと、X=te、Y=st)
  • 以降続けてホットキーが入力されると\mathbf{X}\mathbf{Y}をマクロ実行します。
  • 最初から予測で補完・繰り返ししたい場合は、PredictHotKeyに割り当てたホットキー(デフォルトはCtrl+Y)を入力すると、その時点までーキー操作から予測モードで補完・繰り返し入力を行います。
  • 下記設定のResetHotKeyで割り当てたホットキー(デフォルトはESC)を入力すると、これまでのキー入力履歴をクリアし、保持している繰り返しキー入力も削除します。

少し複雑な使い方

  • 一度実行した繰り返し入力を後でまた使いたくなった場合、PrevRepeatHotKeyコマンド(デフォルトはCtrl+F9)を実行すると、直前に実行した繰り返し入力を実行します。例えば以下のような場合の使用を想定しています。
testtestCtrl+T
testtesttest
testtesttest123Ctrl+F9test

通常であれば、上記の「123」を入力した時点でCtrl+Tを押しても「test」は入力されなくなりますが、PrevPepeatHotKeyコマンドを呼び出すことで、直近の繰り返しキーを入力します。

  • 予測入力を期待したが、繰り返し入力されてしまった場合、元の状態までCtrl+XなどでUndoしてからPrevPredictHotKeyコマンド(デフォルトはCtrl+F10)を実行するとその時点での予測モードでの補完・繰り返し入力を行います。例えば以下のような場合の使用を想定しています。
TAB TAB abc 
TAB TAB Ctrl+T
TAB TAB abc 
TAB TAB TAB

上記の場合、直近にTABを2回入力しているため、これを繰り返しと判断してTABが入力されましたが、そうではなくabc を期待していたかもしれません。その場合は以下のように修正できます。
まず、Ctrl+XBSなどで元の状態に戻して、Ctrl+F10を入力します。

TAB TAB abc 
TAB TAB Ctrl+F10
TAB TAB abc 
TAB TAB abc 

これで無事予測モードで期待した繰り返しが入力できました。Undoしてから再度実行する場合、元の状態に戻すためのキー入力も直近のキー操作と見なされてしまうため、単純に元に戻してやり直してもうまくいかないため、Ctrl+Tを押下した時点でのキー入力履歴を保持しており、その保持したキー入力履歴を元に予測を行うのがこのコマンドです。

設定

ホットキーの指定

DynamicMacro.ahkと同じフォルダに置いたDynamicMacro.iniの以下の部分でホットキーを設定してください。

InvokeHotKey=^t
PredictHotKey=^y
ResetHotKey=~esc
PrevRepeatHotKey=^F9
PrevPredictHotKey=^F10

ホットキーの指定方法が分からない場合は下記リンク先をご覧ください。

それぞれのコマンドの意味は下記の通りです。

#コマンドデフォルトHK機能概要
1InvokeHotKey^t繰り返しまたは予測を自動判定して実行
2PredictHotKey^y予測モードを指定して実行
3ResetHotKey~escキー履歴をクリア
4PrevRepeatHotKey^F9前回の繰り返しキー操作を再実行
5PrevPredictHotKey^F10前回#1を実行した時点での予測モード再実行

ログ機能

効果測定などを行うために、利用状況のログ出力機能を付けています。
ログを出力するには、DynamicMacro.iniの以下の部分を設定してください。

EnableLog=0
LogPath=DMlog.txt

EnableLogを1にすると、LogPathのファイルにログを出力します。ログファイルは絶対パスか相対パスで指定してください。相対パスの場合はDynamicMacro.ahkが存在するディレクトリを起点にします。

ログはCSV形式で、それぞれのカラムの意味は以下です。

カラム意味
第1カラム時刻2021/07/17 01:01:01
第2カラム実行タイプReset or Repeat or Predict
第3カラム挿入したキー(Predictの場合はXYXのY)のタイプ数3
第4カラムPredictの場合のXYXのXのキータイプ数2

DynamicMacroAHK の 動作例

以下はWindows標準のメモ帳で動作している例です。

Windows上のあらゆるソフトで使えますが、Excelとは特に相性が良いようです。
フラグの立っている県名を太字にする例ですが、最初の2つだけ手動で実施すれば、あとは自動で繰り返されます。

OSレベルで使える例として、ファイル名の先頭に日付を入れる様子です。こちらも手動でリネームしているのは最初の2つだけです。

注意・制限事項

本実装は、オリジナルのEmacs Lispや既存のFirefox版、Atom版などは参考にせず、Dynamic Macroの動作している様子と増井先生の論文「操作の繰り返しを利用した予測インタフェースの統合 (pitecan.com)」を元に、勝手に実装していますので、オリジナルと挙動が異なる可能性があります。

また、上記論文でも述べられていますが、入力予測で「最悪O(n^2)(nは履歴文字列長)時間が必要」であるため、保持するキー履歴が長いと待ち時間が長くなります。ただし、一度予測が完了したらそれを繰り返しシーケンスとして保持しますので連続して実行する場合は高速に動作します。(XYXを発見した場合、XYを繰り返しとして保持)

AutoHotKeyではキー履歴を#KeyHistoryディレクティブで設定可能です。デフォルトは200にしているのでどうしてもパフォーマンスが悪い場合はこの値を小さくしてみてください。
ちなみにKeyHistoryはキーボードのDown、Upでそれぞれ1つずつ使いますので、200であればだいたい100タイプ分保持していることになります。
100タイプを正確に2回入力できる人はまずいないと思いますので、かなり余裕を見た値になっているとは思いますが、私の環境ではそれほどストレスは感じていません。

コメント

タイトルとURLをコピーしました