|
うーむ、初めて「秀丸メール」の秀丸マクロを見てみたけれども、
結構グチャグチャになってる印象ですねぇ。
「秀丸メールの秀丸マクロ」は、「秀丸エディタの秀丸マクロ」も踏まえたうえで、
その差分をみていく必要みたいなのがあるけれども、
秀丸メール側だけ使えないメソッド(なぜ使えないのか妥当性一切なし)や
秀丸メール側だけ使えないプロパティ(多分秀丸エディタからの移植忘れが多数ある
んだろうなぁ。。。)
とりあえず、以下の3つのファイルを1つのフォルダにいれておけば、
★--- hmail.mac として保存 ---- 秀丸メールから実行可能
(秀丸エディタからも実行可能なようにしてある)
☆☆☆ 「C:\usr\hidemaru\hidemaru.exe」の部分は、自分の秀丸のパスに書
き換えること。
jsmode "WebView2";
execjs currentmacrodirectory + @"\common.mac";
js {
/// <reference path="../types/hm_jsmode.d.ts" />
// このマクロ実行しているのは秀丸なの?
let isHidemaruApp = isHidemaru();
function isHidemaru() {
let hidemaruExePath = hidemarudir() + @"\hidemaru.exe";
return existfile(hidemaruExePath);
}
function getHidemaruPath() {
let hidemaruExePath = String.raw`C:\usr\hidemaru\hidemaru.exe`;
return hidemaruExePath;
}
function getTargetText() {
return "おーーーぼぼぼぼぼ";
}
function getHmTargetMacroPath() {
return String.raw`C:\macro\hedit.mac`;
}
function prevFunction() {
try {
deleteTempFile();
let loadText = getTargetText();
if (typeof (loadText) == "undefined") { throw "ファイルが無し"; }
let hidemaruPath = getHidemaruPath(); // 秀丸エディタの絶対パス
if (!existfile(hidemaruPath)) {
throw "秀丸未発見";
}
if (!existfile(getHmTargetMacroPath())) { throw "マクロファイル
が見つかりません"; }
let directoryPath = hidemaruPath.substring(0, hidemaruPath.lastI
ndexOf("\\"));
let processParam = {
msg: loadText,
num: 3,
returnFile: getReturnFile()
};
let saveFile = getArgFile();
let paramJSON = JSON.stringify(processParam);
saveTextFile(saveFile, paramJSON);
let hidemaruArgs = `"${hidemaruPath}" /x"${getHmTargetMacroPath
()}"`;
message(hidemaruArgs);
console.log(hidemaruPath);
console.log(directoryPath);
// これを呼び出してるのが秀丸なら...
if (isHidemaruApp) {
let processInfo = hidemaru.runProcess(hidemaruArgs, ".", "gu
i", "utf8");
processInfo.onClose(closeAsync); // 多少時間が長くても、呼び
出し側アプリ(秀丸メール?)が固まらないように
// 非同期(マクロ実行中外でJSエンジンだけで動いてる)なので、
マクロ実行中に戻す
function closeAsync() {
hidemaru.postExecMacroMemory("js {postFunction();}");
}
} else {
runex(hidemaruArgs
, 1 //sync 0:async, 1:sync
, 0, "" //stdin 0:none, 1:auto, 2:<file, 3:(reserved),
// 4:current content, 5:selection
, 0, "" //stdout 0:none, 1:auto, 2:>file 3:>>file, 4:new
window,
// 5:insert, 6:replace, 7:>output pane, 8:>>output
pane
, 0, "" //stderr 0:none, 1:auto or >>stdout, 2-8:same as
stdout's param
, 0, "" //folder 0:none, 1:current, 2:specify 3:(reserve
d), 4:exe's
, 1 //show 0:auto, 1:show, 2:hide, 3-13:ShellExecu
te()'s SW_*
, 1 //draw 0:draw, 1:no draw when stdout redirected
, 2 //encode 0:ansi, 2:utf-16, 6:utf-8
, 0 //extended flags
);
postFunction();
}
} catch (err) {
message(err);
}
}
prevFunction();
function postFunction() {
try {
let returnFile = getReturnFile();
let loadText = loadTextFile(returnFile);
message("JSONだよ");
message(loadText);
let returnObj = JSON.parse(loadText);
message(returnObj.msg); // 最初の10文字
message(returnObj.test); // リターンオブジェクトのプロパティ
} catch (err) {
message(err);
} finally {
deleteTempFile();
}
}
function saveTextFile(fname, text) {
try {
if (isHidemaruApp) {
hidemaru.saveTextFile(fname, text, "utf16");
} else {
let dll = loaddll(hidemarudir() + "\\tkinfo.dll");
let n = dll.dllfunc.SaveStringToFile(fname, text, 0, 1);
if (n == 0) {
throw "保存に失敗しました。";
}
}
} catch (err) {
message(err);
}
}
function loadTextFile(fname) {
try {
if (isHidemaruApp) {
hidemaru.loadTextFile(fname, "utf16");;
} else {
let dll = loaddll(hidemarudir() + "\\tkinfo.dll");
let text = dll.dllFuncStr.LoadStringFromFile(fname);
return text;
}
} catch (err) {
message(err);
}
}
function deleteTempFile() {
try {
let fso = createobject("Scripting.FileSystemObject");
let argFile = getArgFile();
if (fso.FileExists(argFile)) {
fso.DeleteFile(argFile);
}
let returnFile = getReturnFile();
if (fso.FileExists(returnFile)) {
fso.DeleteFile(returnFile);
}
} catch(err) {
}
}
}
★--- hedit.mac として保存 ----
(秀丸エディタ側で実行されるマクロ)
// 何か処理
message("秀丸開始だよ");
jsmode "WebView2";
execjs currentmacrodirectory + @"\common.mac";
js {
try {
let argJSONFile = hidemaru.loadTextFile(getArgFile(), "utf16");
if (typeof(argJSONFile) == "undefined") { throw "argJSONファイルが無し"; }
let paramObj = JSON.parse(argJSONFile);
debuginfo(2);
message(paramObj.msg);
let lentgh = paramObj.msg.length;
let text = `秀丸エディタ上で渡されたメッセージは${lentgh}文字です`;
let returnOBJ = {
msg : text,
test: 300,
};
let returnJSON = JSON.stringify(returnOBJ);
hidemaru.saveTextFile(getReturnFile(), returnJSON, "utf16");
} catch(err) {
message(err);
}
}
message("秀丸終了直前");
exit; // exitすることで 呼び出し元の ProcessInfoのcloseメソッドが発動する。
★--- common.mac として保存 ----
function getTempFolder() {
let tempFolder = getenv("TEMP");
if (!tempFolder) { tempFolder = currentmacrodirectory(); };
return tempFolder;
}
function getArgFile() {
return `${getTempFolder()}\\hm_args.json`;
}
function getReturnFile() {
return `${getTempFolder()}\\hm_return.json`;
}
■「巣の秀丸マクロ」だと結構大変だろうなぁ、といった印象
少なくともJSON.stringify や JSON.parse 周辺だけは、
JavaScript使わないと、結構めんどくさいでしょうなぁ
(JSONか何かにしておかないと、渡す情報や返す情報のパラメータ情報が増えるほど
惨くなる)
ProcessInfoとhidemaru.runProcessを使ってやりとりする手もなくはないけれども、
秀丸メール側は実装が中途半端なんじゃないかなぁ。
少なくとも秀丸エディタと同じだけのものは実装されていないっぽいし。
|
|