変数の展開No.03026
安久津 さん 02/03/02 21:16
 
cf hidesoft:2:11495 こんなマクロほしいでしょ?

>set     job_name=ABC123400
>$ABC_DIR/$pgm_name.csh $jnet_no_id $job_prog_name $LOG_direc$k_code$jnet_id.
>log
>一目見たら訳の分からない変数郡の値を
>全て実際の値に置換してくれれば、解析しやすいと。。。
private {
    クォートがあると面倒だな。
    set name=value
    set name='foo bar baz'
    set name="a b c"
    変数を展開したいファイルと定義しているファイルが違うと面倒だな。
}
てなわけで、ini ファイルを利用します。

// expandvar.mac
#CASE = 1; // 変数名の大文字小文字を区別する。
$INI = macrodir + "\\expandvar.ini"; // 変数定義を保存するファイル名。

    menu "<< expand var >>", "&U 変数の更新をする",
    "&E 変数の展開をする", "&Q 終了 (ESC)";
    ##i = result - 1;
    if( ##i <= 0 || ##i == 3 ) endmacro;
    ##cl = lineno; disabledraw;
    if( ##i == 1 ) call updatevar;
    else call expandvar;
    movetolineno 1, ##cl; beep;
endmacro;
updatevar:
//  $$sdef = "^(?i)[\\t ]*set[\\t ]+\\w+=.";
    $$sdef = "^[\\t ]*[Ss][Ee][Tt][\\t ]+[0-9A-Za-z_]+=.";
    $$sname = "[0-9A-Za-z_]+=";
    $$svalue = "=.+";

    gofiletop;
    searchdown $$sdef, regular;
//   searchdown2 $$sdef, regular;
    while( result ){
        searchdown $$sname, regular;
        $$tmp =gettext(seltopx,seltopy,selendx,selendy);
        $$name = "$" + leftstr($$tmp,strlen($$tmp)-1);
        searchdown $$svalue, regular;
        $$tmp =gettext(seltopx,seltopy,selendx,selendy);
        $$value = rightstr($$tmp,strlen($$tmp)-1);
        ##sec = strlen($$name) % 10;
        $$sec = str(##sec);
        if( #CASE ){
            call getcaseinfo $$name;
            writeinistr $INI, $$sec, $$return + $$name, $$value;
        }else{
            writeinistr $INI, $$sec, $$name, $$value;
        }
        searchdown $$sdef, regular;
    }
return;
// --
expandvar:
    if( !selecting ) selectall;
    ##top = seltopy; ##end = selendy;
    escape;
    moveto 0, ##end; ##end = lineno;
    moveto 0, ##top; ##top = lineno;
    if( ##top != 1 ){ movetolineno 1, lineno - 1; golineend2; }

    $$svar = "\\$[A-Za-z_][0-9A-Za-z_]*";
    searchdown $$svar, regular;
    while( result ){
        if( lineno >= ##end ) break;
        $$name = gettext(seltopx,seltopy,selendx,selendy);
        escape;

        ##sec = strlen($$name) % 10;
        $$sec = str(##sec);
        if( #CASE ){
            call getcaseinfo $$name;
            $$value = getinistr($INI,$$sec,$$return + $$name);
        }else{
            $$value = getinistr($INI,$$sec,$$name);
        }
        if($$value == "" ) $$value = "<UNDEF " + $$name + ">";
        replacedown $$name, $$value;
        left;
        searchdown $$svar, regular;
    }
return;
getcaseinfo:
    ##len = strlen($$1);
    ##i = 1;
    $$c = "";
    while( ##i < ##len ){
        ##ch = ascii(midstr($$1,##i,1));
        if( ##ch >= 'A' && ##ch <= 'Z' ) $$c = $$c + "1";
        else $$c = $$c + "0";
        ##i = ##i + 1;
    }
return $$c;
// end of expandvar.mac
// "%[A-Za-z_]+%" があったら、getenv("name") ってのもありかも。
●使い方。
(1)変数を定義しているファイルで、expandvar.mac を起動します。
    [U 変数の更新をする] をクリックします。
 
    NOTE:変数の定義( set var=foo )をしているファイルが複数あるのなら、
         これを繰り返して、expandvar.mac に変数を記憶させてください。

(2)変数を展開したい範囲を「行選択」して、expandvar.mac を起動します。
    [E 変数の展開をする] をクリックします。

プロジェクトごとに INI ファイルの名前を変えるのも良いかも。

では。
# static abbrev(短文登録)で使ったりして。
set myaddr=doremifaso <xxx@bar.baz.co.jp>
set cmain='int main( int argc, char **argv )'
$myaddr, $cmain

[ ]