結論から言えば、スクリプト呼出機能でなく、ブックマーク機能を使って解決する。
問題提起
秀丸ファイラのスクリプトは、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を呼び出すときに同じことをやっていた…。
所感
無駄に回り道した挙句、以前やっていたことだったときの徒労感と絶望感。