last updated:2023/12/27

Hidemaru Q and A

第III部〜秀丸マクロのいろはにほへと
 setcompatiblemode文 について


setcompatiblemode文 について

はじめに

「マクロの記録」を行うと自動的に追加される、「setcompatiblemode文」の説明です。

setcompatiblemode文 / setcompatiblemode関数 には、以下の機能があります。 (setcompatiblemode関数 は引数に設定値を指定し、戻り値は関数実行前の値を返す)

  • マクロの互換性から無効化されている機能を有効にする。
  • 各種動作設定を一時的に変更する。

設定できるのは以下の内容で、各設定をORした値を引数に指定します。 (ORについては、「第III部〜秀丸マクロのいろはにほへと ビット演算を極める」を参照)

  1. 折りたたみがあるときの動作
  2. 部分編集されているときの動作
  3. 秀丸エディタでファイルを開くときの排他制御の動作
  4. 「検索での表示」の動作
  5. 「貼り付け後のカーソル位置」の動作
  6. マクロ終了後に検索条件をマクロ実行前と同じに戻す(Ver.8.20以降)
  7. マクロ終了後にカーソル移動後と編集後の自動起動マクロを動かせるようにする(Ver.8.30以降)
  8. 各種の文を複数選択に対応した動作にする(Ver.8.40以降)
  9. 削除した範囲にあるカラーマーカーをやり直し可能にする(Ver.8.56以降)
  10. 「前のカーソル位置」の記憶を変更しないようにする(Ver.8.58以降)
  11. disabledrawで検索後のカーソル状態の維持する(Ver.8.66以降)
  12. dllfunc等の関数内で、画面ごとのDPIを有効にする(Ver.8.73以降)
  13. カーソル行の下線やカーソル位置の縦線の描画を有効にする(Ver.8.90以降)
  14. execmacroのコンパイル内容をメモリ上にキャッシュして再利用する(Ver.8.92以降)
  15. 別の秀丸エディタにマクロの実行を切り替えできないモードにする(Ver.8.92以降)
  16. 範囲選択された状態でのleft;やright;を常に範囲選択の先頭/末尾に移動する(Ver.9.00以降)

詳細はマクロヘルプを参照。

(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文で部分編集外に移動した場合です。
「部分編集を維持」の場合は、検索や置換で「部分編集」している範囲外にマッチする場合でも、「部分編集」は解除されません。

また、以下の命令は部分編集を維持していても、部分編集の外にジャンプします。

  • nextmark/prevmark(マーク行の上検索/下検索)
  • goupdateup/goupdatedown(上/下の編集マーク)
  • nextcolormarker/prevcolormarker(上/下のカラーマーカー)

「動作確認用マクロ1」 を実行してみましょう。

  • 「部分編集を解除」は部分編集状態を全て解除します。
  • 「部分編集を無視してなるべく維持」は部分編集の外にカーソルが移動した場合のみ、部分編集を解除します。
  • 「部分編集を無視してなるべく維持」は部分編集の外にマッチする場合、部分編集を解除します。
  • 「部分編集を維持」は基本的には部分編集の外にカーソルが移動しません。
  • 「部分編集を維持」だと、部分編集の外にマッチする場合でも部分編集は解除されないし、検索も失敗する。

秀丸エディタでファイルを開くときの排他制御の動作

設定値は以下になります。

0x00000000 マクロの標準動作(動作環境に従う) 
0x00000010 開く方法を問い合わせする 
0x00000020 上書き禁止で開く 
0x00000030 同じファイルを2つ開くことを禁止する(ジャンプする) 
0x00000040 ファイルを読み込みなおしする 
0x00000050 強制的に開く(複数の秀丸で開くことを無視して普通に開く) 

マクロ実行中は 「動作環境」-「ファイル」-「排他制御1」の「秀丸エディタで同じファイルを開く場合」を、指定された動作にします。

「検索での表示」の動作

設定値は以下になります。

0x00000000 マクロの標準動作(動作環境に従う)
0x00000100 点滅表示
0x00000200 範囲選択

マクロ実行中は 「動作環境」-「検索」-「検索の動作」で設定された「検索での表示」を指定された動作にします。

マクロの場合は、「範囲選択」にしておいた方が便利です。

「貼り付け後のカーソル位置」の動作

設定値は以下になります。

0x00000000 マクロの標準動作(動作環境に従う)
0x00001000 先頭のまま 
0x00002000 最後に移動 

マクロ実行中は 「動作環境」-「編集」-「コピー&貼り付け」の「貼り付け後のカーソル位置」を、指定された動作にします。

マクロ実行時、貼り付け時の動作を固定させたい場合に指定します。

マクロ終了後に検索条件をマクロ実行前と同じに戻す

設定値は以下になります。

0x00020000

マクロで検索条件を保存/復帰させる方法がありましたが、有効にすると自動で行います。 (複数回指定しても、いちばん最初の条件を復元する)

マクロ終了後に「カーソル移動後タイマー」と「編集後タイマー」の自動起動マクロを動かす

設定値は以下になります。

0x00080000

通常、マクロ実行時「自動起動マクロ」は無効です。

各種の文を複数選択に対応した動作にする

設定値は以下になります。

0x00100000

複数選択状態であっても、通常ではコピーや削除はカーソル位置しか対象になりません。複数選択を対象にするマクロでは、必ず設定してください。

削除した範囲にあるカラーマーカーをやり直し可能にする

設定値は以下になります。

0x00200000

無効時は、カラーマーカーが「やり直し」で復帰できません。

「前のカーソル位置」の記憶を変更しない

設定値は以下になります。

0x00400000

マクロ実行で、「前のカーソル位置」を変更したくない場合は有効にすること。

disabledrawで検索後のカーソル状態を正しく保持する

設定値は以下になります。

0x00800000

disabledraw中は、検索後のカーソル状態の情報は失われますが、有効にすると保持します。

dllfunc等の関数内で、画面ごとのDPIを有効にする

設定値は以下になります。

0x01000000

外部DLLを使った場合の処理です。Windows8/10 の 高DPIに対応しているDLLを使う場合は有効にしてください。

カーソル行の下線やカーソル位置の縦線の描画を有効にする

設定値は以下になります。

0x02000000

通常マクロ実行時は、「カーソル行の下線」や「カーソル位置の縦線」は表示されません。

execmacroのコンパイル内容をメモリ上にキャッシュして再利用する

設定値は以下になります。

0x04000000

マクロの実行が終わるとメモリは破棄されます。

ループ内で、execmacro文を呼び出す場合は高速化される場合があります。

別の秀丸エディタにマクロの実行を切り替えできないモードにする

設定値は以下になります。

0x08000000

変数用メモリを共有しないことで高速になる場合があります。 setactivehidemaruなどは動作できないようになります。

範囲選択された状態でのleft;やright;を常に範囲選択の先頭/末尾に移動する

設定値は以下になります。

0x10000000

このフラグを有効にしない場合は、範囲選択の状態により移動箇所は異なります。


ページトップ 目次に戻る