マクロ間で共有できる変数No.05505
おしょう@山寺 さん 07/04/26 18:46
 
ある変数を何らかの形で保存しておき、それを複数のマクロ間で共有する簡単で安全
な方法はないでしょうか。

レジストリに保存しようかとも考えたのですが、やはり怖いので。

なお、変数値は必ずしも秀丸エディタ終了後まで保存される必要はありません。(保
存できた方が楽かなという気はしますが、今は必要としません。ちなみに、現在は複
数のマクロのソースを開いておき、その都度各所を書き換えて対応しています。いさ
さかかっこうも効率もよくないので。)

[ ]
RE:05505 マクロ間で共有できる変数No.05507
Buckeye さん 07/04/27 05:58
 
おしょう@山寺さん、

私はiniファイルを作って、変数の共有とか処理の連携とかをやっています。

iniファイルを読み書きする関数がマクロに用意されているので簡単ですよ。

Best regards,
Buckeye

[ ]
RE:05507 マクロ間で共有できる変数No.05508
n13 さん 07/04/27 23:23
 
サイトー企画さま

n13 です。

おしょう@山寺さんの話題に便乗して、
execmacro の拡張をお願いしたいと思います。

私のマクロディレクトリには数十個のマクロファイルがあるのですが、
まったく同じ内容のサブルーチンが、
いくつものマクロファイルに記述されています。
下記は、その一例です。

//
// ファイル存在判定
//  @return true 引数のパスはファイル(ディレクトリではない)
//          flae 引数のパスはファイルではない
//
myExistFile:
    $$path = $$1;   // パス

    // 入力チェック
    if($$path == "") {
        return false;
    }
    // ファイルorディレクトリが存在する?
    if(! existfile($$path)) {
        return false;
    }
    // 存在するものはディレクトリ?
    if(strstr($$path, "*") >= 0) {
        return false;
    }
    if(existfile($$path + "\\*.*")) {
        return false;
    }

    // ファイルが存在する
    return true;

もし、これらのサブルーチンにバグがあった場合、
いくつものマクロファイルを修正する必要が生じ、
保守性が非常に悪いです。

ところが、execmacro が引数を取れるのであれば、
汎用的なサブルーチンを1つのマクロファイルだけに記述し、
他のマクロファイルは、それを呼び出すだけとなり、
バグがあっても修正するファイルは1ファイルで済みます。

なお、現在、マクロファイル間のデータの引渡しには、
以下のような方法が考えられています。

   ・ini ファイルを使う
   ・レジストリを使う
   ・dll を使う
   ・クリップボードを使う
   ・カーソル位置に書き読みする

しかし、たった20数ステップの処理に対して
これらの方法は大げさ過ぎるため、
いくつものファイルに同じサブルーチンを記述しています。

ということで、以下のような execmacro の拡張を希望します。


書式: execmacro <マクロファイルのパス> [,引数1 [,引数2 ... [,引数9]]]

※起動されるマクロでは、$1, $2, ... $9 および #1, #2, ... #9 に、
  引数1 〜 引数9 が格納されている。


欲をいうと、渡された引数の数が #0 に格納されていたりすると、
入力チェックがしやすくなってうれしいです。

長文となり申し訳ありませんがご検討の程、よろしくお願いいたします。

[ ]
RE:05507 マクロ間で共有できる変数No.05509
おしょう@山寺 さん 07/04/27 23:38
 
Buckeye さん、

あ、そういう方法があったとは思いつきませんでした。(私は ini ファイルは秀丸
の「初期」設定のためのものと思いこんでいて、調べてみようともしていませんでし
た。マクロのヘルプにはちゃんと
>マクロで使う各種パラメタを保存しておくと便利です。
と書いてありました。恥ずかしい。

ということで、一件落着です。

留守にしていてレスが遅れましたが、お礼まで。

[ ]
RE:05508 マクロ間で共有できる変数No.05510
おしょう@山寺 さん 07/04/27 23:38
 
私も、n13 さんに1票です。

(これまではパラメータさえ保存できずにいたので手を出していませんでしたが、解
決できたので欲が出てきました。)

[ ]
RE:05508 マクロ間で共有できる変数No.05511
Buckeye さん 07/04/28 05:42
 
n13さん、

私も、秀丸マクロを山のように作っていた時期に、別ファイルのルーチンを引数
付きで呼んで、戻り値が得られたら便利だなと思っていました。同じように、汎
用ルーチンがあっちにもこっちにもコピーされていて、保守性がわるくて往生し
ていたものですから。

    個人的には、そのころ、秀丸マクロで実現していたさまざまな機能をexeで
    作るようになり、使っているマクロの数が数分の一に減ったので、今はそれ
    ほど深刻ではありませんが、これが便利であることはとてもよくわかります。

>ということで、以下のような execmacro の拡張を希望します。
>
>
>書式: execmacro <マクロファイルのパス> [,引数1 [,引数2 ... [,引数9]]]
>
>※起動されるマクロでは、$1, $2, ... $9 および #1, #2, ... #9 に、
>  引数1 〜 引数9 が格納されている。
>
>
>欲をいうと、渡された引数の数が #0 に格納されていたりすると、
>入力チェックがしやすくなってうれしいです。

戻り値も欲しいですね。今の、同一マクロファイル内での取り扱いと同じでいい
ですから。っていうか、これがないと、価値、半減しませんか?

また、(実装や処理が大変なら)グローバル変数は使えない、でいいと思います
(マクロファイル内でしかグローバルにならない)。汎用ルーチンなら、基本的
に全部、ローカル変数で処理したほうが安全ですから。

Best regards,
Buckeye

[ ]
RE:05511 マクロ間で共有できる変数No.05512
n13 さん 07/04/28 16:14
 
n13 です。

Buckeye さんのおっしゃるとおり、戻り値が取れないと意味がありません。
execmacro に加えて endmacro の拡張もお願いします。

あと、引数や戻り値の受け取りに使う変数は、サブルーチンの場合と同じがいいです。
要望を以下にまとめます。

------
【要望1 execmacro の拡張】

書式: execmacro <マクロファイルのパス> [,引数1 [,引数2 ... [,引数9]]]

・起動されるマクロでは、$$1, $$2, ... $$9 または ##1, ##2, ... ##9 に、
  引数1 〜 引数9 が格納されている。
・起動されたマクロの戻り値は $$return または ##return に格納される。
・起動元マクロのグローバル変数と、起動されたマクロのグローバル変数は別の領域
  例) 起動元で $foo に "bar" を代入して execmacro
       ⇒ 起動されたマクロにて、起動直後は $foo の中身は空文字

------
【要望2 endmacro の拡張】

書式: endmacro [戻り値]

・現在のマクロが他のマクロから起動されたものである場合、
  起動元マクロの $$return または ##return に 戻り値 が格納される。

------


[ ]
RE:05512 マクロ間で共有できる変数No.05513
n13 さん 07/04/28 16:16
 
>n13 です。

先ほどの続きですが、余談として、3点。

・execmacro で渡された引数の数が ##0 に格納されていると、
  入力チェックがやりやすい。(← 個人的な意見です)

・秀丸起動オプションの「/x」でも引数を渡せるようにすることを考えると、
  引数はすべて文字列で渡された方が、互換可能なマクロを作りやすいかもしれませ
ん。

  例) 起動元マクロでの起動処理: execmacro "hello.mac", 3110, "サイトー";
       「/x」オプションでの起動: hidemaru.exe /x"hello.mac" 3110 "サイトー"
       hello.mac の起動時の状態: $$1 = "3110"
                                  $$2 = "サイトー"
                                  ##1 = 0
                                  ##2 = 0

    ※「/x」オプションでの例を現在の秀丸で実行すると
      「3110」と「サイトー」という2つのファイルを開いて、
      「3110」ウィンドウ上で「hello.mac」を起動します。

・マクロ単位でグローバル変数を記憶してくれるような機能(例参照)があると、
  オブジェクト指向的なマクロ開発ができるのでさらに良いです。

  例) マクロA: $hoge = "foo";
                  message $hoge;
                  execmaro "マクロB";
                  message $hoge;
                  execmaro "マクロB";
                  message $hoge;
                  endmacro;

       マクロB: message $hoge;
                  if($hoge == "") {
                      $hoge = "bar";
                  }
                  endmacro;

       上記のマクロAを実行すると、
       「foo」→「」→「foo」→「bar」→「foo」と表示されて欲しい。

以上、よろしくお願いします。

[ ]