はじめに
テキストエディターで何かを編集中,ちょっと何かを計算させたり,何らかのプログラムを実行させてその結果を使ったりしたいときがある。
いちいちコマンドラインに移ってやるのは面倒。
ここでは,Windows 用テキストエディターである EmEditor 上で選択状態にしたテキストを Ruby の式として評価した結果をうしろに挿入させる,ということを EmEditor のマクロで実現させてみる。
マクロのコード
EmEditor のマクロはいろんな言語で書けるが,ここでは JavaScript を使ってみよう。
以下のようなファイル(拡張子は .jsee
)をマクロ保存フォルダー(My Macros)に入れると,マクロのメニューから呼び出すことができる。
// 選択部分を Ruby の式として評価した結果を
// 選択部分のあとに「 #=> 」に続けて挿入する
var WshShell = new ActiveXObject("WScript.Shell");
var ExecCmd = WshShell.Exec('c:\\ruby24-x64\\bin\\ruby.exe -e "print(eval(STDIN.read))"');
ExecCmd.StdIn.Write(document.selection.Text);
ExecCmd.StdIn.Close();
while (ExecCmd.Status == 0) {
Sleep(10);
}
if (ExecCmd.ExitCode == 0) {
result = ExecCmd.StdOut.ReadAll();
} else {
result = "ERROR\n" + ExecCmd.StdErr.ReadAll();
}
document.selection.CharRight(false, 1);
document.selection.Text = " #=> " + result;
冒頭の WshShell.Exec
の引数に Ruby 実行ファイルへの絶対パスがあらわに書いてあるので,ご自分の環境に合わせて書き換えられたい。
このマクロは,ruby
コマンドに対して,実行すべき式(スクリプト)を標準入力で与えているところがポイント。
というのは,式を ruby コマンドの -e
オプションで直接与えようとすると,エスケープやらなんやら非常にややこしい話になってしまうから。
標準入力ならそういうことを考えなくて済む。
なので,ruby の -e
オプションには単に
print(eval(STDIN.read))
を与えている。
実行コマンドに標準入力を与えるのは ExecCmd.StdIn.Write
の役割だ。
同様に,実行結果も ruby
コマンドが標準出力に書き出したものを拾って,EmEditor の編集テキストに挿入している。
なお,実行が失敗した場合(ステータスが 0 でない場合)は標準エラー出力を拾って挿入する。
注意点
どうやら,この方法で EmEditor から ruby
コマンドへ渡されるテキストは Shift JIS であるらしい。
よって,実行させたいコードに非 ASCII の文字列が入っていたりすると,期待通りに動かないことがある。
いまのところ解決策は見つけられていない。
参考ページ
この記事は下記の記事に触発されて書きました。スクリプト自体もかなりストレートに パクり 参考にしました。記事の著者に感謝します。
EmEditorでPowerShellコマンドを実行し、入力補助機能として使用するためのマクロ - Qiita