(発言者削除)No.01913
wizard さん 01/03/28 15:08
 


[ ]
RE:01913 もう少し簡単なサンプルを ...No.01917
TAKA さん 01/03/28 22:25
 
TAKA です。

>ユーザーで入力した値を保存して、次回からその値をデフォルト表示
>させるようにしてもらえないでしょうか。

以下のマクロで動作確認してみて下さい。
前回値は、秀丸をインストールしたフォルダ内の「rep.ini」という
ファイルに保存されます。

// 置換マクロ(ここから)
    if( !selecting )
    { // 範囲選択されていない
        goto LEND;
    }

    // 置換元文字列前回値取得
    $RepBeforeDef = getinistr( hidemarudir + "\\rep.ini", "Rep", "BeforeDef" );

    // 置換元文字列入力
L1000:
    $RepBefore = input( "置換元文字列入力(ESC=終了)", $RepBeforeDef );
    if( !result )
    { // ESC
        goto LEND;
    }
    if( $RepBefore == "" )
    { //---- 文字列入力なし ----//
        goto L1000;
    }
    $RepBeforeDef = $RepBefore;

    // 置換後文字列前回値取得
    $RepAfterDef = getinistr( hidemarudir + "\\rep.ini", "Rep", "AfterDef" );

    // 置換後文字列入力
L2000:
    $RepAfter = input( "置換後文字列入力(ESC=置換元変更)", $RepAfterDef );
    if( !result )
    { // ESC
        goto L1000;
    }
    if( $RepAfter == "" )
    { //---- 文字列入力なし ----//
        goto L2000;
    }
    $RepAfterDef = $RepAfter;

    // 範囲選択の取り込み
    #FH = hidemaruhandle( 0 );
    copy2;

    // テンポラリへ複写
    openfile "/h";
    disabledraw;
    #TmpFH = hidemaruhandle( 0 );
    paste;

    // 編集
    replaceallfast "^\\n", "\\t", regular;              // 改行のみの例外処理
    replaceallfast "\\n\\f[^0-9']", "\\t\\1", regular;  // 1行にする
    gofiletop;
    #Cnt = linecount2;
    #I = 0;
    while( #I < #Cnt )
    {
        movetolineno 1, #I + 1;
        if( char( code ) == "'" )
        { // コメント行
            goto L3000;
        }
        #XS = x;
        #YS = y;
        golineend2;
        $Str = gettext( #XS, #YS, x, y );
        while( 1 )
        {
            #Pos = strstr( $Str, $RepBefore );
            if( #Pos == -1 )
            { // 置換元なし
                break;
            }
            $Wk = leftstr( $Str, #Pos );
            $Wk = $Wk + $RepAfter;
            $Wk = $Wk + rightstr( $Str, strlen( $Str ) - #Pos - strlen( $Rep
Before ) );
            $Str = $Wk;
        }
        moveto #XS, #YS;
        beginsel;
        golineend2;
        insert $Str;
L3000:
        #I = #I + 1;
    }
    replaceallfast "\\t", "\\n", regular;               // 元に戻す

    // 編集結果を元のファイルに戻す
    selectall;
    copy;
    enabledraw;
    setactivehidemaru #FH;
    closehidemaruforced #TmpFH;
    paste;

    // 保存
    writeinistr hidemarudir + "\\rep.ini", "Rep", "BeforeDef", $RepBeforeDef;
    writeinistr hidemarudir + "\\rep.ini", "Rep", "AfterDef", $RepAfterDef;

LEND:
    endmacro;
// 置換マクロ(ここまで)


以下のようなテストデータを置換すると、

// 置換前(ここから)
'1T.E.S.T.1
T.E.S.T.2
1T.E.S.T.1
T.E.S.T.2
// 置換前(ここまで)


以下のようになります。

// 置換後(ここから)
'1T.E.S.T.1
T.E.S.T.2
1T_E_S_T_1
T_E_S_T_2
// 置換後(ここまで)


マクロを動かして、意図した通りになっていないようでしたら、
置換前のデータと、置換後にどのようになって欲しいかを教えて
下さい。
多分、今回のマクロで問題ないとは思いますが。

[ ]
RE:01917 もう少し簡単なサンプルを ...No.01918
TAKA さん 01/03/29 01:50
 
TAKA です。

>            $Wk = $Wk + rightstr( $Str, strlen( $Str ) - #Pos - strlen( $Rep
>Before ) );

この部分は、長すぎて自動で改行されてしまいましたが、実際には
1行で書いて下さいね。そうでないとマクロ実行時にエラーがでて
しまいます。

それと1つめのマクロに「showwindow 1;」という行がありますが、
不要ですので削除してください。
テスト用のものですので、不要です。
あっても動きますが、ワーク用の秀丸が見えてしまい、少しかっこ
悪いです。

[ ]
RE:01918 もう少し簡単なサンプルを ...No.01936
wizard さん 01/04/02 13:56
 
返事が遅れてすいませんでした。二つのマクロはうごきました。
ありがとうございました。

[ ]