やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

秀丸ファイラのスクリプト呼出では起動引数を渡せない

結論から言えば、スクリプト呼出機能でなく、ブックマーク機能を使って解決する。

問題提起

秀丸ファイラのスクリプトでは起動引数を渡せない。と思う。

秀丸ファイラのスクリプトは、js:<スクリプトのファイルパス>のようにして実行する。しかし、起動引数が渡せないという致命的な問題がある。

残念なケース

たとえば前回の例でいうと、表示したいメッセージを変えたいとき、起動引数で渡したい。でも渡せない。すると、メッセージのパターンだけソースコードが増えてしまう。そんな再利用性ゼロのコードなんて書きたくないのに。できるだけ重複部分を減らす工夫をするしかない。

cscript.exeで引数を渡す

前回の例であるメッセージ表示を使う。メッセージ部分を引数にする。

ShowMessage.js

WScript.Echo(WScript.Arguments(0));

cmd.exeを起動し、以下のように実行する。

cscript.exe ShowMessage.js "Hello Parameter !!"
Hello Parameter !!

これを秀丸ファイラでもやりたいのだができない。js:<スクリプトのファイルパス>の形式でしかスクリプトを呼び出せないから。本当はjs:<スクリプトのファイルパス> [引数]としたい。

WScript.Shell.RunでCScript.exeを呼び出す

var command = "cscript.exe ShowMessage.js \"これは引数で渡したメッセージです。\"";
var shell = new ActiveXObject( "WScript.Shell" );
shell.Run(command, 1, true);
shell = null;

秀丸ファイラで、このスクリプトjs:<このファイルパス>として呼び出す。しかし、メッセージの種類だけソースコードファイルを作成することになってしまう。再利用性ゼロのコードができあがり。

さらなる問題

外部からソースコードをインポートできない。JScript, VBScriptの仕様である。WSFを用いれば可能だが、先述のとおり秀丸ファイラではjs,vbs呼出のみである。

main.jsからrun.jsで定義した関数を参照できない。

main.js

Run("cscript.exe ShowMessage.js \"これは引数で渡したメッセージです。\"");

run.js

function Run(command)
{
    var shell = new ActiveXObject( "WScript.Shell" );
    shell.Run(command, 1, true);
    shell = null;
}

以上により、js: vbs:からのスクリプト実行では再利用性のあるコードが非常に書きづらい。事実上、書けないといっていいほど。

かなり悩んだが、結局、この方法ではまともな解決方法を見つけられなかった。

解決

私は一体何を悩んでいたのか。秀丸にはブックマーク機能がある。

メニュー→ツールツールの整理で、以下のパスを持ったツールを作成する。細かい手順は前回参照。

C:\WINDOWS\system32\cscript.exe "C:\ShowMessage.js" "引数で渡したメッセージ。"

あとはこれを実行すればいいだけ。これにて解決。

これはコンソールから叩くのと同じである。考えてみれば、ショートカットファイル(ソフトリンク)でも同じようなことができるので、できて当たり前だった。真っ先に思いつかないほうがおかしい。

JScript, VBScriptからの解放

コマンド入力できれば、もはやJScript, VBScriptを使う必要さえない。bat, sh(bash), powershell, python, ruby, 何でも好きなものを使えばいい。一体誰がJScript, VBScriptなど使うのか。

秀丸ファイラで選択したファイルやディレクトリを取得する

秀丸ファイラを使っているなら、GUIで選択したファイルや、現在ディレクトリのパスを取得できなければ意味がない。

マクロ 意味
%1 選択ファイル(複数可)をフルパスで、ダブルクォーテーションでくくる。
%f 選択ファイル1つだけをフルパスで、ダブルクォーテーションでくくらない。
%b 選択ファイル名のみ
%d フォルダ
%V フォルダ
%% %そのもの

秀丸ファイラのヘルプの「ブックマーク」項を参照。

先程ブックマーク機能に設定したコマンドに%Vを使えば、現在のディレクトリパスを取得できる。

C:\WINDOWS\system32\cscript.exe "C:\ShowMessage.js" "%V"

すっかり忘れていたが、秀丸ファイラからConEmuを呼び出すときに同じことをやっていた…。

所感

無駄に回り道した挙句、以前やっていたことだったときの徒労感と絶望感。