English help on website



その他(Ver9.24対応版)
目次JavaScript対応− その他
数値の範囲
getVar/setVarによる数値型変数とのやりとりは、32bit版/64bit版、通常版/浮動小数点数版に関わらず、32bitの数値として扱われます。
32bitの数値の上限は 2147483647、下限は -2147483648です。
js{...}内では、どのエディションでも32bitを超える数値や浮動小数点数を扱うことができます。
js{
  //数値型変数に渡すときは、どのエディションでも32bitの数値で最大 2147483647 最小 -2147483648
  hidemaru.setVar("#intMax",2147483647);
  hidemaru.setVar("#intMin",-2147483648);

  //32bit版でも64bit版でも通常版でも浮動小数点数版でも超えたら0
  hidemaru.setVar("#intMaxOver",2147483647+1);
  hidemaru.setVar("#intMinOver",-2147483648-1);
  //文字列化でOK
  hidemaru.setVar("$intMaxOver2",(2147483647+1).toString() );
  hidemaru.setVar("$intMinOver2",(-2147483648-1).toString() );

  //js内では、32bit版でも64bit版でも、数値は32bit超え可能(ただし通常52bitで、64bit全部はBigInt)
  hidemaru.setVar("$strOver32", (0xfffffffff*2).toString(16) );

  //通常版でも浮動小数点数版でも "0.3333333333333333"
  hidemaru.setVar("$strFloat", 1/3 );

}

message ""
  + str(#intMax)+"\n"  //どのエディションでも2147483647
  + str(#intMin)+"\n"  //どのエディションでも-2147483648
  + str(#intMaxOver)+"\n"  //どのエディションでも0
  + str(#intMinOver)+"\n" //どのエディションでも0
  + $intMaxOver2+"\n"  //どのエディションでも2147483648
  + $intMinOver2+"\n" //どのエディションでも-2147483649
  + $strOver32+"\n"  //どのエディションでも1ffffffffe
  + $strFloat+"\n"  //どのエディションでも0.3333333333333333
  ;
範囲から外れる値を扱う必要がある場合は、文字列でやりとりすることで、エディションを問わない共通のマクロにすることができます。
次の例は、カーソル行の文字列をJavaScriptの式として評価して、結果を挿入します。
入力(gettext2)と出力(insert)は文字列で、演算(eval)はJavaScriptとなり、全てのエディションで共通で使えます。
js{
  golineend2();
  var s=gettext2(0,lineno(),linelen2(),lineno());
  insert("\n"+eval(s.match( /((0x[0-9a-fA-F]+)|[ \t\-\+\*\/\.\(\)0-9])+/ )[0]) );
}
endmacro;
/*
↓この行で実行
4000*1.1
3.14159265359*12756.274*1000*1000
0xFFFFFFFF
0x1FFFFFFFFFFFFF
*/
文字列
マクロファイルを実行するとき、js{...}の記述は、最初に秀丸マクロとしてのパースを通ります。
@""の文字列や、R""の文字列、"""〜"""の文字列は、js{...}内であれば書くことができてしまいます。
execjsの.jsファイルなど、普通のJavaScriptの文法としては通用しないので注意が必要です。

エラーの捕捉
スクリプトエンジンの違いや、その中でJavaScriptのevalや秀丸マクロのevalMacroが行われる関係で、エラーの出方が違う、あるいは捕捉が難しい場合があります。
文法エラーで可能な場合は、メッセージボックスが出ますが、書き方によっては出ないこともあります。
実行時エラーで可能な場合が、メッセージボックスが出ますが、実行する内容によって期待と違っていて出ないこともあります。
例えば、JavaScriptの文法上、関数名をただ書いた場合(copy();をcopy;と書いてしまう場合)、エラーにならず何も行われないことになります。

console.log()を、秀丸エディタ上で標準で実装(WebView2ではオーバーライド)しています。
適所でconsole.log("text");等を入れておくと、アウトプット枠に出力できます。
あらかじめ、debuginfo(2);をしておくと見ることができます。

逆にエラーが出すぎて困るという場合、seterrormodeの6の指定で抑制することができます。

非同期
hidemaruオブジェクトの幾つかのメソッド・プロパティは、非同期で使うことができます。
hidemaruGlobalオブジェクトは、全て非同期で使うことはできません。(例外あり、後述)
非同期で使うことができるものには、説明文の最初に[非同期]と書かれています。

JavaScriptで言う非同期とは、マルチスレッドによる同時実行のことではなく、シングルスレッド動作です。
ハングアップするような動作になると、本体もハングアップします。
非同期で呼ばれる関数は、可能な限り速やかに関数を抜ける必要があります。

秀丸マクロのJavaScript対応での非同期とは、マクロ実行中ではないときに呼ばれるJavaScriptの関数のことを意味します。
例えば、setTimeoutで呼び出される関数は、マクロが終了した後に呼び出されます。
この状態は、秀丸マクロを経由しないJavaScriptだけの実行です。秀丸マクロの変数/文やhidemaruGlobalを実行するための準備は無く、比較的高速です。

非同期のJavaScript関数内で、通常のマクロの操作をするためにはpostExecMacroFileまたはpostExecMacroMemoryを使います。
秀丸マクロの変数や文を実行するための準備が行われ、比較的低速です。

非同期のJavaScript関数内で、setVarやgetVarでマクロの変数のやりとりはできません。マクロと値のやりとりするには、setStaticVariable,getStaticVariableを使います。
または、JavaScriptのグローバル変数を使って、マクロ内のjs{}から再び同じ変数を使うことができます。
js{
  function funcAsync(){
    //実行の順番(2)
    //[非同期]ここはマクロ実行中ではない
    hidemaru.setStaticVariable("testStatic","あいう",0);
    hidemaru.postExecMacroFile("test2.mac");
  }
  
  //実行の順番(1)
  hidemaru.setTimeout(funcAsync,2000);
}
例 test2.mac
//実行の順番(3)
//ここはマクロ実行中
$test=getstaticvariable("testStatic",0);
message $test;
 
js{
  function funcAsync(){
    //実行の順番(2)
    //[非同期]ここはマクロ実行中ではない
    testText="test";
    hidemaru.postExecMacroMemory("js{ funcExecmac(); }");
  }

  function funcExecmac() {
    //実行の順番(3)
    //ここはマクロ実行中
    message(testText);
  }
  
  //実行の順番(1)
  hidemaru.setTimeout(funcAsync,2000);
}
hidemaruGlobalのうち、非同期の関数でも使えるものがあります。
colormarker(オブジェクト指定時) getcolormarker(オブジェクト指定時)
createobject loaddll
(以下V9.22β14以降)
x y column lineno str hex filename result getfilehist
config configcolor getconfig getconfigcolor
updatecount inputstates iskeydown getselectedrange setselectionrange
unichar code up down left right xpixel ypixel xpixel2 ypixel2 
browserpanecommand renderpanecommand setrenderpanetarget
(以下V9.22β15以降)
moveto moveto2 movetolineno
(以下V9.22β19以降)
setbrowserpanetarget
(以下V9.22正式以降)
tickcount
今後他の文も使えるように変化する可能性があります。
debuginfo(2);をしておくと、非同期実行時のエラー内容をアウトプット枠に表示できます。

新しく追加したものは、非同期の関数が呼ばれて実行されるタイミングで、hidemaruversionを書くことを推奨するメッセージが出ます。
(V9.22β14以降としているものは、一部前から使えていたものがあり、全てのケースで推奨するメッセージは出るわけではありません)
hidemaruversionと共に、動作可能なバージョンをマクロの先頭に書いておくと、バージョンを推奨するメッセージは出なくなります。