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)の参考書籍です。