last updated:2024/07/31
レンダリング枠は、秀丸マクロと相互のやりとりができるブラウザ枠みたいなものです。マクロ(renderpanecommand文/関数)からしか呼び出せません。ローカルのhtml及びlocalhost(自PC内のサーバー)に接続可能です。相互でやりとりができるので html/css/JavaScript でマクロ用GUI も作れます。
詳細は秀丸エディタ Ver9.22の新機能 レンダリング枠と秀丸エディタ マクロ言語ヘルプ - レンダリング枠を参照してください。
レンダリング枠は、エディタ画面の上下左右に配置する事とエディタ画面上にオーバレイ表示できます。レンダリング枠は識別用の名前を付ける必要がありますが複数表示可能です。
レンダリング枠内のJavaScriptからは、「js{ }」内で使用できる秀丸エディタ独自のオブジェクトは使用できません。 (秀丸マクロ実行外なので使用できない)
秀丸エディタマクロ → レンダリング枠 方向のやり取りは 「ブックマークレット」のように JavaScript を使います。処理が複雑になる場合は、あらかじめ処理用の関数を作成しておき、それを呼び出す方がいいでしょう。
レンダリング枠 → 秀丸エディタマクロ 方向のやり取りは「window.chrome.webview.postMessage」を使います。
postMessage のパラメータにはオブジェクトを指定し、funcid は関数ID、message 引数として任意の文字列を指定します。
html側の例:window.chrome.webview.postMessage({funcid:関数ID, message:"引数"});
"関数ID"は以下のどちらかで取得します。
レンダリング枠側に "関数ID" を引き渡すのは、ブックマークレットを使います。
"引数"は文字列で1つしか指定できません。複数の引数を指定する場合は、呼び出し先で分割可能な文字列に合成して指定します。
秀丸マクロが window.chrome.webview.postMessage で呼び出されたかどうかは event キーワードで判断します。指定された引数を取得するには geteventparam 関数を使います。
if(event == 0){
//通常処理
}else if(event == 10){
//window.chrome.webview.postMessage で呼び出された場合
//message で指定した引数を取得
$arg = geteventparam(0);
}
endmacro;
html/css/JavaScript でマクロ用GUI を作るには以下の手順になります。
3項で「表示完了まで待機」しているのは、レンダリング枠上でhtmlのロードが完全に終了していないと、ブックマークレットでhtml上の各要素にアクセスるのが失敗する場合もあるからです。 (htmlの各要素が完全に読み込み完了してからアクセスした方が安全だから)
window.chrome.webview.postMessage で呼び出されたマクロ・関数と引数を元に秀丸エディタ側で処理を行う。
レンダリング枠にあるレンダリング枠のサンプルマクロを参照。
各コマンドの詳細に関しては、以下のヘルプを参照してください。
JavaScriptでjson形式やオブジェクトを使って指定する場合は、renderpanecommand文/関数 だけでほぼ全て操作が可能です。
秀丸マクロから操作する場合は、renderpanecommand と setrenderpanetarget文を併用した方がマクロを書きやすい場合もあります。
秀丸マクロからjson文字列と変数を組み合わせる場合は文字列変数の合成する方法もありますが、 strreplace関数、sprintf関数を使う方法もあります。
sprintfを使う方法
//sprintfを使う方法(json文字列内に"%"があると書式指定子と認識されてしまう場合があるので注意する)
$dailog_base = """
{
"target":"rendering#1",
"show":1,
"uri":"file:///c:/folder/rendering.html",
"place":"%s"
}
""";
//枠の位置を切り替えるために変数にしておく
$place = "leftside";
//sprintfを使ってjson文字列を完成させる
$json_str = sprintf($dailog_base, $place);
//コマンドを実行
renderpanecommand $json_str;
strreplaceを使う方法
//strreplaceを使う方法
$dailog_base = """
{
"target":"rendering#1",
"show":1,
"uri":"file:///c:/folder/rendering.html",
"place":"%place%"
}
""";
//枠の位置を切り替えるために変数にしておく
$place = "leftside";
//strreplaceを使ってjson文字列を完成させる
$json_str = strreplace($dailog_base, "%place%", $place);
//コマンドを実行
renderpanecommand $json_str;