マクロヘルプ、runex文についてNo.09476
でるもんたいいじま さん 17/06/20 19:03
 
いつもお世話になっております。でるもんた・いいじまです。

ヘルプ関係の細かい話は hidesoft.2 や hidesoft.4 に出すと初心者さんに
邪魔かな、と思って、とりあえず今回から turukame.3 のほうに出してみる
ことにします。

☆ ☆ ☆

さて、マクロヘルプを読みつついろいろ試して気付いたのですが、runex
コマンド関係のヘルプの記述について、いくつか要望というか提案です。

【1】runexの仕様を拡張すると喜ぶ人がいるかも

run/runsync/runsync2のヘルプ
(hidemac_html.chm::/html/100_ProgramStatement_run_runsync_runsync2.html)に

  > run文に「%f」「%d」「%b」という文字を書いておくと、この文字は、
  > それぞれ現在のファイル名やフォルダ名に置換されます。
  > runsync文とrunsync2文は置き換わりません。

とあるのですが、まず確認として、runex文でもこの置換は行っていますよね。

とりあえず私の場合はきちんと回避策があるので今のままで困らないのですが、
もしかしたら、runexにもうひとつ32bit整数型のパラメータ(=フラグを最大
32個まで入れられる)を追加して、「最下位ビットが1なら'%'の置換しない」と
すると、もしかしたら喜ぶかたもいらっしゃるかもしれません。

【2】runexのヘルプに記載したほうがいいのでは?

上記の置換がrunexでも行われるということは、runexのほうのヘルプページ
(hidemac_html.chm::/html/100_ProgramStatement_runex.html)
には記載されていません。

この仕様については、「runと同様に置換されます」という一言だけでいいので
記載しておいたほうがいいと思います。

【3】run/runexでの「%」の置換はもっと高速な実装がいくつもあるのでは?

run/runsync/runsync2のヘルプページでは、「%」の置換作業のために文字列
をC言語風に先頭から1バイトずつ検索していますが、もっと効率的な実装が
いくつもあるように思います。末尾にいくつか示しますので、よろしければ
コードの差し替えを検討してみていただけないでしょうか?
個人的には、最低でも実装例1は入れてほしい、それに加えて実装例2があれば
ベストかな、と思っています。

ちなみにこのコードは、プログラマとして駆け出しのレベルの人へのメッ
セージとして、「run/runexを複数回実行する場合は '%' にまつわる処理を
サブルーチン化すべきである」という主張を含んでいます。

【4】runexのコメントの英語いじりました

ヘルプのrunexのページの「例」ですが、このコメントの英文では個人的に
分かりづらいと感じましたので、勝手に文面の改訂版を書いてみました。
これも末尾に示しますので、よろしければお使いください。

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

☆ ☆ ☆

//----------------------- run/runexの'%'にまつわる実装例 ----------------------

// 呼び出す側
$shell = getenv("COMSPEC");
$command = $shell + " /c echo %PATH% >con";
call ReplacePercents $command;
$tmp = $$return;
message "%を置換して[" + $tmp + "]になりました。";
run $tmp;
endmacro;

// ------------- 3つの実装例に共通の呼び出し規約 -------------
// [in]  $$1: '%'→'%%' の処理をしたい、元の文字列
// [out] $$return: '%%' に置き換えた後の文字列
// -----------------------------------------------------------

// 実装例1:DLLを使わない実装
ReplacePercents:
    $$done = "";
    $$yet = $$1;

    while (true)
    {
        ##pos = strstr($$yet, "%");
        if ( ##pos<0 )
        {
            $$done = $$done + $$yet;
            return $$done;
        }

        $$done = $$done + leftstr($$yet, ##pos) + "%%";
        $$yet = midstr($$yet, ##pos+1);
    }


// 実装例2:DLLを使う例(他の場所でhmjre.dllが使われていない前提)
ReplacePercents:
    ##hmjre = loaddll("hmjre.dll");
    $$a = dllfuncstr(##hmjre, "ReplaceRegular", "%", $$1, 0, "%%", 2);
    freedll ##hmjre;
    return $$a;

// 実装例3:単発のマクロ用、DLL関係の処理で徹底的に手抜きをする例
ReplacePercents:
    loaddll "hmjre.dll";
    return dllfuncstr("ReplaceRegular", "%", $$1, 0, "%%", 2);

☆ ☆ ☆

//-----------------------------------------------------------------------------
// runex のヘルプの「例」に書かれている英文を修正。
// リダイレクト記号を使って「<file」「>>output pane」のように書いたので、
// 字数に余裕が生まれて、説明のために十分な数の英単語を使えるようになりました。
//-----------------------------------------------------------------------------

runex "filename.exe",
    , 1     //sync   0:async, 1:sync
    , 0, "" //stdin  0:none, 1:auto, 2:<file, 3:(reserved),
            //       4:current content, 5:selection
    , 1, "" //stdout 0:none, 1:auto, 2:>file 3:>>file, 4:new window,
            //       5:insert, 6:replace, 7:>output pane, 8:>>output pane
    , 0, "" //stderr 0:none, 1:auto or >>stdout, 2-8:same as stdout's param
    , 0, "" //folder 0:none, 1:current, 2:specify 3:(reserved), 4:exe's
    , 1     //show   0:auto, 1:show, 2:hide, 3-13:ShellExecute()'s SW_*
    , 1     //draw   0:draw, 1:no draw when stdout redirected
    , 0     //encode 0:ansi, 2:utf-16, 6:utf-8
;

[ ]
RE:09476 マクロヘルプ、runex文についてNo.09477
秀丸担当 さん 17/06/21 08:53
 

ご指摘ご提案ありがとうございます。
確かにrunex文にも%のことを書くべきだと思います。
%を変換するかどうかも指定できたほうがいいので、検討します。
サンプルマクロやコメントは参考にさせていただきます。

[ ]