EmEditorのマクロをWindows Script Component(.wsc)としてライブラリ化する

EmEditor FAN ! / EmEditorのマクロをWindows Script Component(.wsc)としてライブラリ化する

2005/04/01

EmEditorマクロのライブラリ化

いろいろなEmEditorマクロを書いていると、繰り返し同じようなプログラムを記述することもあり、ライブラリとしたい場合もあるかと思います。ここではWindows Script Componentという機構を用いて、マクロの一部を再利用可能なライブラリ(COMコンポーネント)とする方法を紹介します。

Windows Script Componentとは?

Windows Scripting Hostのスクリプトは外部のCOMコンポーネントを利用することが出来ますが、逆にスクリプト自身をCOMコンポーネントとすることが出来ます。このコンポーネントをWindows Script Componentといい拡張子はwscを用います。MSDNのドキュメントはこちらにあります。

マクロのライブラリ(COMコンポーネント)化

ここでは、例として関数のある行にブックマークをつけるマクロで用いているSelectionStorage()が生成するオブジェクトをCOM化します。(実用性はさておきサンプルとして)

Windows Script Component Wizardを用いてライブラリの雛形を作成する

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をCOMコンポーネントとして登録する

wscファイルを右クリックして「登録」するか、コマンドラインでregsvr32を用いると登録できます。これでEmEditorSelectionStorage.WSCというProgIDでこのCOMコンポーネントを利用できるようになりました。

ライブラリ(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)の参考書籍です。

inserted by FC2 system