EmEditor FAN ! / EmEditorのマクロをWindows Script Component(.wsc)としてライブラリ化する
2005/04/01
いろいろなEmEditorマクロを書いていると、繰り返し同じようなプログラムを記述することもあり、ライブラリとしたい場合もあるかと思います。ここではWindows Script Componentという機構を用いて、マクロの一部を再利用可能なライブラリ(COMコンポーネント)とする方法を紹介します。
Windows Scripting Hostのスクリプトは外部のCOMコンポーネントを利用することが出来ますが、逆にスクリプト自身をCOMコンポーネントとすることが出来ます。このコンポーネントをWindows Script Componentといい拡張子はwscを用います。MSDNのドキュメントはこちらにあります。
ここでは、例として関数のある行にブックマークをつけるマクロで用いているSelectionStorage()が生成するオブジェクトをCOM化します。(実用性はさておきサンプルとして)
wscを作成するためのツールとしてマイクロソフトはWindows Script Component Wizardというものを配布しています。残念ながら、英語版しかありませんが、単語が理解できればそれほど難しくないかと思います。
インストールの後、まずスタートメニューの" Microsot Windows Script → Windows Script Component Wizard "から起動します。
クラス名、ファイル名、ProgID、バージョン、保存先フォルダを入力します。ファイル名、ProgIDは自動補完される名前のままで特に問題ないと思います。
どのActiveScriptで記述するかを指定します。私はJScript(=JavaScript)を選びましたが、VBScriptを使う方はVBScriptを選んでください。PerlScriptなど他のActiveScriptがインストールされている場合はそちらを指定して利用することも出来ます。その他の欄は空白で問題ありません。
EmEditorマクロのオブジェクトを渡すためにEditorWindowというWrite-Onlyのプロパティを用意します。他にプロパティが必要な場合は入力してください。ここの項目はのちほどwscファイルを直接編集し変更することも出来ます。
公開したいメソッドを記述します。ここの項目はのちほどwscファイルを直接編集し変更することも出来ます。
イベントは空のままで構いません。
確認の後、Finishボタンを押すとwscファイルが生成されます。
作成されたwscのメソッドを実装します。赤い部分が書き足した部分です。documentといったオブジェクトやeePosViewといった定数などにはすべて前にEditorWindow.をつける必要があります。
<?xml version="1.0"?> <component> <registration description="EmEditorSelectionStorage" progid="EmEditorSelectionStorage.WSC" version="1.00" classid="{6d1b0cac-11af-4ef7-a54e-54fb29df867d}" > </registration> <public> <property name="EditorWindow"> <put/> </property> <method name="Store"> </method> <method name="Restore"> </method> </public> <script language="JScript"> <![CDATA[ var description = new EmEditorSelectionStorage; function EmEditorSelectionStorage() { this.put_EditorWindow = put_EditorWindow; this.Store = Store; this.Restore = Restore; } var EditorWindow; var mode; var x0, y0, x1, y1; function put_EditorWindow(newValue) { EditorWindow = newValue; } function Store() { mode = EditorWindow.document.selection.Mode; x0 = EditorWindow.document.selection.GetActivePointX(EditorWindow.eePosView); y0 = EditorWindow.document.selection.GetActivePointY(EditorWindow.eePosView); x1 = EditorWindow.document.selection.GetAnchorPointX(EditorWindow.eePosView); y1 = EditorWindow.document.selection.GetAnchorPointY(EditorWindow.eePosView); } function Restore() { EditorWindow.document.selection.SetAnchorPoint(EditorWindow.eePosView, x1, y1); EditorWindow.document.selection.SetActivePoint(EditorWindow.eePosView, x0, y0, true); EditorWindow.document.selection.Mode = mode; } ]]> </script> </component>
wscファイルを右クリックして「登録」するか、コマンドラインでregsvr32を用いると登録できます。これでEmEditorSelectionStorage.WSCというProgIDでこのCOMコンポーネントを利用できるようになりました。
完成したwscを用いて関数のある行にブックマークをつけるマクロを書き直してみます。赤い部分がCOMコンポーネントを利用している部分です。EditorWindowにthisを渡すのを忘れないでください。それ以外は他のCOMコンポーネントを利用する場合と同じです。
function clearBookmarks() { document.selection.StartOfDocument(); while (document.selection.NextBookmark()) { document.selection.ClearBookmark(); } } function setBookmarks(strFind) { var nFlags = eeFindReplaceRegExp | eeFindNext | eeFindReplaceQuiet; document.selection.StartOfDocument(); while (document.selection.Find(strFind, nFlags)) { document.selection.SetBookmark(); } } var strFind = ""; if (document.ConfigName == "C++") { strFind = "^([A-Za-z_]\\w*[\\s*&]+)*([A-Za-z_]\\w*\\s*::\\s*)?(~?[A-Za-z_]\\w*|operator\\b\\s*[^\\s(]+)\\s*\\((\\{.*\\}|[^;])*$"; } if (strFind != "") { var oldSelection = new ActiveXObject("EmEditorSelectionStorage.WSC"); oldSelection.EditorWindow = this;//これを忘れずに! oldSelection.Store(); clearBookmarks(); setBookmarks(strFind); oldSelection.Restore(); }
EmEditor FAN ! / EmEditorのマクロをWindows Script Component(.wsc)としてライブラリ化する
おすすめのマクロ(Windows Scripting Host)の参考書籍です。