last updated:2023/12/27
「マクロの記録」を行うと自動的に追加される、「setcompatiblemode文」の説明です。
setcompatiblemode文 / setcompatiblemode関数 には、以下の機能があります。 (setcompatiblemode関数 は引数に設定値を指定し、戻り値は関数実行前の値を返す)
設定できるのは以下の内容で、各設定をORした値を引数に指定します。 (ORについては、「第III部〜秀丸マクロのいろはにほへと ビット演算を極める」を参照)
詳細はマクロヘルプを参照。
(1)~(5) は「動作設定」のため、設定が複数あります。
(6)~(15) は有効/無効を示すフラグになります。例えば「複数選択」を扱うマクロを作る場合は、(8)を有効にする必要があります。
各種設定はわかりにくい事がありますが、実際に動作させて確認してみましょう。
動作確認用マクロ1(折りたたみ/部分編集)
マクロを実行するとメニューが表示されるので、設定値による違いを確認してみましょう。
//新規ファイルを開く
newfile;
//設定
#max_cnt = 10;
#max_line = 10;
#line_start = 4;
#line_end = 8;
//テストデータ作成
#n = 0;
while(#max_line > #n){
#cnt = 0;
$add = "";
while(#max_cnt > #cnt){
$add = $add + str(#n);
#cnt = #cnt +1;
}
#n = #n + 1;
insert $add;
insertreturn;
}
//範囲選択
moveto2 0, #line_start;
beginsel;
moveto2 0, #line_end;
endsel;
//メニュー用配列
$check[0] = "&1)「折りたたみを解除」";
$check[1] = "&2)「折りたたみを無視してなるべく維持」折りたたみ箇所にカーソル移動";
$check[2] = "&3)「折りたたみを維持」折りたたみ箇所にカーソル移動";
$check[3] = "&4)「折りたたみを維持」折りたたみ内にマッチ";
$check[4] = "&5)「部分編集を解除」";
$check[5] = "&6)「部分編集を無視してなるべく維持」部分編集の外に移動";
$check[6] = "&7)「部分編集を無視してなるべく維持」部分編集の外にマッチする";
$check[7] = "&8)「部分編集を維持」部分編集の外に移動";
$check[8] = "&9)「部分編集を維持」部分編集の外にマッチ";
menuarray $check, 9;
#n = result;
if(5 > #n && #n > 0){
$call_name = "fold" + str(#n);
call $call_name;
}else if (10 > #n && #n > 4){
#n = #n - 4;
$call_name = "rangeedit" + str(#n);
call $call_name;
}
endmacro;
//「折りたたみを解除」は折りたたみ状態を全て解除します。
fold1:
//機能確認用 ここから
message "「OK」ボタンを押すと選択範囲を折りたたみます。";
//範囲選択部を折り畳み
fold 0x0001;
message "カーソルは" + str(lineno) + "行目にあります。\n" +
"「OK」ボタンを押すと折りたたみが解除。";
setcompatiblemode 0x00000001;
//機能確認用 ここまで
return;
//「折りたたみを無視してなるべく維持」は折りたたみ状態の箇所にカーソルが移動した場合のみ、
//折りたたみを解除します。
fold2:
//機能確認用 ここから
message "「OK」ボタンを押すと選択範囲を折りたたみます。";
//範囲選択部を折り畳み
fold 0x0001;
message "カーソルは" + str(lineno) + "行目にあります。\n" +
"「OK」ボタンを押すとカーソルが1行下に移動し、折りたたみが解除。";
setcompatiblemode 0x00000002;
down;
//機能確認用 ここまで
return;
//「折りたたみを維持」は折りたたみ状態の箇所にカーソルが移動した場合でも、
//折りたたみを維持します。
fold3:
//機能確認用 ここから
message "「OK」ボタンを押すと選択範囲を折りたたみます。";
//範囲選択部を折り畳み
fold 0x0001;
message "カーソルは" + str(lineno) + "行目にあります。\n" +
"「OK」ボタンを押すとカーソルが1行下に移動しますが、折りたたみが解除されない。";
setcompatiblemode 0x00000003;
down;
//機能確認用 ここまで
return;
//「折りたたみを維持」でも、折り畳み個所にマッチする場合は解除されます。
fold4:
//機能確認用 ここから
message "「OK」ボタンを押すと選択範囲を折りたたみます。";
//範囲選択部を折り畳み
fold 0x0001;
message "カーソルは" + str(lineno) + "行目にあります。\n" +
"「OK」ボタンを押すと「5555555555」を検索を実行します。\n" +
"「折りたたみを維持」でも、折り畳み個所にマッチする場合は解除される。";
//「折りたたみを維持」と「マクロ終了後に検索条件をマクロ実行前と同じに戻す」を設定。
setcompatiblemode 0x00020003;
searchdown2 "^5+$",regular;
if(result){
message "見つかりました。";
}else{
message "見つかりませんでした。";
}
//機能確認用 ここまで
return;
//「部分編集を解除」は部分編集状態を全て解除します。
rangeedit1:
//機能確認用 ここから
message "「OK」ボタンを押すと選択範囲を部分編集にします。";
//範囲選択部を部分編集
rangeeditin
message "カーソルは" + str(lineno) + "行目にあります。\n" +
"「OK」ボタンを押すと部分編集が解除されます。";
setcompatiblemode 0x00000004;
//機能確認用 ここまで
return;
//「部分編集を無視してなるべく維持」は部分編集の外にカーソルが移動した場合のみ、
//部分編集を解除します。
rangeedit2:
//機能確認用 ここから
message "「OK」ボタンを押すと選択範囲を部分編集にします。";
//範囲選択部を部分編集
rangeeditin
message "カーソルは" + str(lineno) + "行目にあります。\n" +
"「OK」ボタンを押すとカーソルが1行下に移動し、部分編集が解除。";
setcompatiblemode 0x00000008;
down;
#chk = result;
if(#chk == true){
message "カーソル移動成功";
}else{
message "カーソル移動失敗";
}
//機能確認用 ここまで
return;
//「部分編集を無視してなるべく維持」は部分編集の外にマッチする場合、
//部分編集を解除します。
rangeedit3:
//機能確認用 ここから
message "「OK」ボタンを押すと選択範囲を部分編集にします。";
//範囲選択部を部分編集
rangeeditin
message "カーソルは" + str(lineno) + "行目にあります。\n" +
"「OK」ボタンを押すと「9999999999」を検索を実行します。\n" +
"「部分編集を無視してなるべく維持」でも、部分編集の外にマッチする場合は解除される。";
//「部分編集を無視してなるべく維持」と「マクロ終了後に検索条件をマクロ実行前と同じに戻す」を設定。
setcompatiblemode 0x00020008;
searchdown2 "^9+$",regular;
if(result){
message "見つかりました。";
}else{
message "見つかりませんでした。";
}
//機能確認用 ここまで
return;
//「部分編集を維持」は基本的には部分編集の外にカーソルが移動しません。
rangeedit4:
//機能確認用 ここから
message "「OK」ボタンを押すと選択範囲を部分編集にします。";
//範囲選択部を部分編集
rangeeditin
message "カーソルは" + str(lineno) + "行目にあります。\n" +
"「OK」ボタンを押すとカーソルが1行下に移動するが、失敗する。";
setcompatiblemode 0x0000000C;
down;
#chk = result;
if(#chk == true){
message "カーソル移動成功";
}else{
message "カーソル移動失敗";
}
//機能確認用 ここまで
return;
//「部分編集を維持」だと、部分編集の外にマッチする場合でも部分編集は解除されないし、
//検索も失敗する。
rangeedit5:
//機能確認用 ここから
message "「OK」ボタンを押すと選択範囲を部分編集にします。";
//範囲選択部を部分編集
rangeeditin
message "カーソルは" + str(lineno) + "行目にあります。\n" +
"「OK」ボタンを押すと「9999999999」を検索を実行します。\n" +
"「部分編集を維持」だと、部分編集の外にある場合は検索に失敗する。";
//「折りたたみを維持」と「マクロ終了後に検索条件をマクロ実行前と同じに戻す」を設定。
setcompatiblemode 0x0002000C;
searchdown2 "^9+$",regular;
if(result){
message "見つかりました。";
}else{
message "見つかりませんでした。";
}
//機能確認用 ここまで
return;
設定値は以下になります。
0x00000000 マクロの標準動作(0x0002と同じ)
0x00000001 折りたたみを解除
0x00000002 折りたたみを無視してなるべく維持
0x00000003 折りたたみを維持
設定が有効なのは、up、down文でカーソル移動した場合です。検索や置換で折りたたんだ箇所にマッチする場合は、設定を無視し折りたたみが解除されます。
「動作確認用マクロ1」 を実行してみましょう。
設定値は以下になります。
0x00000000 マクロの標準動作(0x0008と同じ)
0x00000004 部分編集を解除
0x00000008 部分編集を無視してなるべく維持
0x0000000c 部分編集を維持
設定が有効なのは、up、down文で部分編集外に移動した場合です。
「部分編集を維持」の場合は、検索や置換で「部分編集」している範囲外にマッチする場合でも、「部分編集」は解除されません。
また、以下の命令は部分編集を維持していても、部分編集の外にジャンプします。
「動作確認用マクロ1」 を実行してみましょう。
設定値は以下になります。
0x00000000 マクロの標準動作(動作環境に従う)
0x00000010 開く方法を問い合わせする
0x00000020 上書き禁止で開く
0x00000030 同じファイルを2つ開くことを禁止する(ジャンプする)
0x00000040 ファイルを読み込みなおしする
0x00000050 強制的に開く(複数の秀丸で開くことを無視して普通に開く)
マクロ実行中は 「動作環境」-「ファイル」-「排他制御1」の「秀丸エディタで同じファイルを開く場合」を、指定された動作にします。
設定値は以下になります。
0x00000000 マクロの標準動作(動作環境に従う)
0x00000100 点滅表示
0x00000200 範囲選択
マクロ実行中は 「動作環境」-「検索」-「検索の動作」で設定された「検索での表示」を指定された動作にします。
マクロの場合は、「範囲選択」にしておいた方が便利です。
設定値は以下になります。
0x00000000 マクロの標準動作(動作環境に従う)
0x00001000 先頭のまま
0x00002000 最後に移動
マクロ実行中は 「動作環境」-「編集」-「コピー&貼り付け」の「貼り付け後のカーソル位置」を、指定された動作にします。
マクロ実行時、貼り付け時の動作を固定させたい場合に指定します。
設定値は以下になります。
0x00020000
マクロで検索条件を保存/復帰させる方法がありましたが、有効にすると自動で行います。 (複数回指定しても、いちばん最初の条件を復元する)
設定値は以下になります。
0x00080000
通常、マクロ実行時「自動起動マクロ」は無効です。
設定値は以下になります。
0x00100000
複数選択状態であっても、通常ではコピーや削除はカーソル位置しか対象になりません。複数選択を対象にするマクロでは、必ず設定してください。
設定値は以下になります。
0x00200000
無効時は、カラーマーカーが「やり直し」で復帰できません。
設定値は以下になります。
0x00400000
マクロ実行で、「前のカーソル位置」を変更したくない場合は有効にすること。
設定値は以下になります。
0x00800000
disabledraw中は、検索後のカーソル状態の情報は失われますが、有効にすると保持します。
設定値は以下になります。
0x01000000
外部DLLを使った場合の処理です。Windows8/10 の 高DPIに対応しているDLLを使う場合は有効にしてください。
設定値は以下になります。
0x02000000
通常マクロ実行時は、「カーソル行の下線」や「カーソル位置の縦線」は表示されません。
設定値は以下になります。
0x04000000
マクロの実行が終わるとメモリは破棄されます。
ループ内で、execmacro文を呼び出す場合は高速化される場合があります。
設定値は以下になります。
0x08000000
変数用メモリを共有しないことで高速になる場合があります。 setactivehidemaruなどは動作できないようになります。
設定値は以下になります。
0x10000000
このフラグを有効にしない場合は、範囲選択の状態により移動箇所は異なります。