EmEditor FAN ! / EmEditorのマクロを様々なActiveScriptで書いてみる
2006/06/17
この記事はFioさんの記事を参考に書かれました。
MicrosoftがWindowsのスクリプティングのために用意している環境で、EmEditorのVBScript, JScriptマクロはこの機構を利用して実装されています。ActiveScriptとしてPerl, Ruby, Python, PHPが利用できるので、これらの言語をEmEditorのマクロに組み込んでみます。
Perlには様々なバイナリがありますが、ActivePerlをインストールします。ActiveStateからActivePerlをダウンロードしてください。名前の入力などを求められますが、スキップすることができます。最新版で特に問題ありません。インストーラの指示に従ってインストールしてください。
Rubyには様々なバイナリがありますが、ActiveScriptRubyをインストールします。最新版で特に問題ありません。インストーラの指示に従ってインストールしてください。
ActivePythonをインストールします。ActiveStateからActivePythonをダウンロードしてください。名前の入力などを求められますが、スキップすることができます。最新版で特に問題ありません。インストーラの指示に従ってインストールしてください。
ActiveScript化されたPHPについてはこちらに説明があります。PHPのダウンロードサイトからPHP5の最新版(リンク先は5.0.3)でWindows Binariesでインストーラ付きの物をダウンロードしてインストーラの指示に従ってインストールしてください。その後DLLをダウンロードして、PHPをインストールしたディレクトリにコピーし、コマンドラインで
regsvr32 c:\php5\php5activescript.dll
と入力し(c:\php5はPHPをインストールしたディレクトリ)DLLを登録してください。
以上すべてをインストールした場合、下のWindows Scriptが動作します。
<?xml version="1.0"?>
<job>
<script language="JScript">
<![CDATA[
WScript.Echo("Hello, JScript!");
]]>
</script>
<script language="VBScript">
<![CDATA[
WScript.Echo("Hello, VBScript!")
]]>
</script>
<script language="PerlScript">
<![CDATA[
&WScript->Echo("Hello, PerlScript !");
]]>
</script>
<script language="RubyScript">
<![CDATA[
WScript.Echo("Hello, RubyScript !");
]]>
</script>
<script language="Python">
<![CDATA[
WScript.Echo("Hello, Python !")
]]>
</script>
<script language="PHPScript">
<![CDATA[
$WScript->Echo("Hello, PHPScript !");
]]>
</script>
</job>
この内容のテキストファイルをtest.wsfという名前で保存し、ダブルクリックしてください。各言語の動作が確認できます。
V6.00 よりEmEditorに#language指示子を用いて、これらActiveScriptをマクロ直接実行する機能が付きました。詳しくは、EmEditor ヘルプ - EmEditor マクロ リファレンス - スクリプト指示子をご覧ください。すべてのグローバルオブジェクトは変数Windowに収められているようです。
以下の記事はV6.00未満のために書かれました。
以上の準備が出来たところで、以下のようなjseeマクロを作成し、保存して実行してみてください。
perlcode = "sub main\n {\n return \"Perl ! \";\n }";
rubycode = "def main; return \"Ruby ! \"; end";
pythoncode = "def main():\n\treturn \"Python ! \"";
phpcode = "function main () { return \"PHP ! \"; } ";
result = "";
perl = new ActiveXObject("ScriptControl");
perl.Language = "PerlScript";
perl.AddCode(perlcode);
result += perl.Run("main");
ruby = new ActiveXObject("ScriptControl");
ruby.Language = "RubyScript";
ruby.AddCode(rubycode);
result += ruby.Run("main");
python = new ActiveXObject("ScriptControl");
python.Language = "Python";
python.AddCode(pythoncode);
result += python.Run("main");
php = new ActiveXObject("ScriptControl");
php.Language = "PHPScript";
php.AddCode(phpcode);
result += php.Run("main");
this.alert(result);
変数perlcode, rubycode, pythoncode, phpcodeに格納された各言語のプログラムが動作しているのが確認できたと思います。
(上を書いた)後にExecuteStatementというメソッドがあることを知ったので、これを利用して宣言→呼び出し、ではなく直接実行してみます。
perlcode = "$window->alert('Perl ! ');";
rubycode = "Window.alert(\"Ruby !\");";//Rubyのグローバルオブジェクトは大文字で始まる
pythoncode = "window.alert('Python ! ');";
phpcode = "$window->alert('PHP ! ');";
perl = new ActiveXObject("ScriptControl");
perl.Language = "PerlScript";
perl.AddObject("window", this);
perl.ExecuteStatement(perlcode);
ruby = new ActiveXObject("ScriptControl");
ruby.Language = "RubyScript";
ruby.AddObject("window", this);
ruby.ExecuteStatement(rubycode);
python = new ActiveXObject("ScriptControl");
python.Language = "Python";
python.AddObject("window", this);
python.ExecuteStatement(pythoncode);
php = new ActiveXObject("ScriptControl");
php.Language = "PHPScript";
php.AddObject("window", this);
php.ExecuteStatement(phpcode);
変数perlcode, rubycode, pythoncode, phpcodeに格納された各言語のプログラムを直接動作させることができました。
TCLScriptというTCLのActiveScriptもあるのですが、EmEditorのマクロ内での呼び出しに失敗するので(原因不明)今回紹介しませんでした。
EmEditor FAN ! / EmEditorのマクロを様々なActiveScriptで書いてみる
おすすめのマクロ(Windows Scripting Host)の参考書籍です。