＞秀丸マクロのいろはにほへと

# 第III部〜秀丸マクロのいろはにほへと
静的な変数について

## 静的な変数について

- はじめに
- 補足

### はじめに

通常の変数はマクロ実行時のみ参照できますが、「静的な変数」を使うとマクロ終了後も内容を保持できます。ただし保存できるのは文字列のみです。

- 静的な変数を設定する setstaticvariable 文
- 静的な変数を取得する getstaticvariable 関数

「静的な変数」のサイズ(設定による)や個数(32767個)は上限があります。「共有フラグ」の設定により、他の秀丸エディタから参照可能です。「共有フラグ」によっては、起動中の全ての秀丸エディタを終了しないとメモリが解放されないので、使用しなくなった「静的な変数」は必ず削除したり最低限の範囲で使用するようにしましょう。

#### setstaticvariable文

setstaticvariable 文 は指定した名前の「静的な変数」へ書き込みを行います。

    setstaticvariable 変数名,文字列値,共有フラグ

変数名(文字列)
  静的な変数の名前を指定します。大文字小文字は区別されません。
  変数名と文字列値に "" を指定すると、指定された共有フラグの静的な変数を全て削除します。

      //共有フラグ 0 に設定された静的な変数を全て削除する。
      setstaticvariable "", "", 0;

文字列値(文字列)
  変数に設定する内容
  "" を指定すると、指定された静的な変数を削除します。

      //共有フラグ 0 に設定された静的な変数 checkに値を保存する。
      setstaticvariable "check", "hidemaru", 0;

      //共有フラグ 0 に設定された静的な変数 checkを削除する。
      setstaticvariable "check", "", 0;

共有フラグ(数値)
  0
    マクロを実行している秀丸エディタのみで共有する(他の秀丸エディタ上で実行するマクロからは参照できない)。同じウィンドウであっても「ファイルを閉じる」「閉じて開く」をすると消去されます。
  1
    実行している全ての秀丸エディタから参照できます。
  2
    「0」と同じですが、「ファイルを閉じる」「閉じて開く」でも内容は保持されます。
  -1
    通常の変数と同じ(実行している秀丸エディタのみ/共有なし/マクロ実行時のみ)。

    // check.mac
    setstaticvariable "check", currentmacrobasename, 0;
    execmacro "check1.mac";
    endmacro;

呼び出された側で「静的な変数」"check"を参照する。

    // check1.mac
    $a = getstaticvariable("check", 0);
    message $a;
    endmacro;

#### getstaticvariable関数

getstaticvariable 関数は、指定した名前の「静的な変数」から読み出しを行います。

    $n = getstaticvariable(変数名,共有フラグ);

変数名(文字列)
  静的な変数の名前を指定します。大文字小文字は区別されません。
  変数名と文字列値に""を指定すると、記憶されている変数名を列挙して","でつなげた文字列を返します。

      //共有フラグ 0 に設定された静的変数を全て列挙する。
      message getstaticvariable("", 0);

共有フラグ(数値)
  0
    マクロを実行している秀丸エディタのみで共有する(他の秀丸エディタ上で実行するマクロからは参照できない)。同じウィンドウであっても「ファイルを閉じる」「閉じて開く」をすると消去されます。
  1
    実行している全ての秀丸エディタから参照できます。
  2
    「0」と同じですが、「ファイルを閉じる」「閉じて開く」でも内容は保持されます。
  -1
    通常の変数と同じ(実行している秀丸エディタのみ、共有なし、マクロ実行時のみ)。

### 補足

#### 名前が同じで、共有フラグが異なる場合

名前が同じでも共有フラグが異なる場合は、別の「静的な変数」と認識されます。

    setstaticvariable "check", "hidemaru editor", 0;
    setstaticvariable "check", "秀丸エディタ", 1;

    //名前は大文字小文字は区別されない
    $n1 = getstaticvariable("CHECK", 0);
    $n2 = getstaticvariable("CHECK", 1);

    message $n1 + "\n" + $n2;

    //後始末
    setstaticvariable "check", "", 0;
    setstaticvariable "check", "", 1;
    endmacro;

#### 共有フラグの「-1」について

「静的な変数」は外部DLLから取得・設定が可能です。共有フラグ「-1」だと、通常の文字変数と同じなので、外部DLLとのやり取りで使用するには都合がいいです。

#### JavaScriptを使った同等処理

「JavaScript対応」の「オブジェクトの有効範囲」でも説明しましたが、オブジェクト(変数、関数も含む)はウィンドウを閉じるまで保持されるので 共有フラグ = 0 と同じ状態です。

JavaScript側でグローバル変数として宣言しておけば、マクロ側から読み書き可能です。 (JavaScript側の実行環境や名前空間に注意が必要です)

JavaScript の場合、サイズや個数の制限はありません。数値をやり取りする場合は制限があります。「JavaScript対応」の「数値のやり取り」を参照。また、jsmode文でリセットされた場合は保持されません。

ページトップ 目次に戻る