対応する括弧に移動について ! ++No.01028
番頭++ さん 98/05/15 21:03
 
これで、完結にします。あとは使用する C, C++ と、コーヂングの癖に依存します。

番頭++ でした。

//  KZ_BKK9.mac - 1998/05/15 - ナインです !
//  さりげなく { (open block) の相棒 } (close block) を見つけるマクロです。
//  「秀丸エディタ」マクロの { } にも有効です。
//  文字、数値リテラルに関した「エスケープ処理」の考慮は完全ではありません。
//  開始位置の { を、delete; undo; します。これは golastupdated; への配慮です。
//  } が見つかった後に、「最後に編集した個所に移動」ができます。余計なお世話 ...
//  行先頭の #if, #elif, #ifdef, #ifndef, #else, #endif の考慮があります。
//  #if, #elif, #ifdef, #ifndef - true, false 判定は手動です。ダサイ ...
//  #if, #elif, #ifdef, #ifndef - (T) True は次の論理行の処理とします。
//  negative question ? は、混乱を招く事があります。趣味の問題です。
//  /* ... */ の nesting は許さないものとします。許す C, C++ もあるのですが ...
//  } の相棒 { は捜しづらいです。コードする意欲と言うか、能力も無いです。
//  この作者は C, C++ を詳しくは知らないのです。
//  C 書けますが、読めません。読み書きの差は、泥雲の差です。そうなんです ...
//  素人は書けます、プロは読めます ...
//  サトリはそのソースを必要としません ... 相手の動きを読みます ...
//  我が家にはその C, C++ 関連書籍が全くありません。
//  現在は C, C++ コンパイラを持っていません。一ヶ月のビール代より安いのに ...
//  このマクロはあくまでもサンプルであります。今後のエンハンスの予定はありません。

    $searchbuffer = searchbuffer;   #searchoption = searchoption;
    escape; //  安全パイ !
    if( x != 0 ){   left;   #i = code;  right;  }   //  左右の配慮 !
    if( code == '{' ){
    } else if( #i == '{' ){
        left;
    } else {
        call pp_find_openkk1;
    }
    #x_start = x;   #y_start = y;   #i_code = code;
    delete; undo;   //  golastupdated;  //  余計なお世話 !

//R disabledraw;    disableinvert;
    call pp_set1;
    #level = 00;    //  nesting
    #false = 00;    //  ^# true, false blocking
    call pp_cc_or_mac;  //  #type - 0: C, 1: macro
    if( ! #type ){
        $str_find =  "^(#|//)|{|}|/\\*|\\*/|\".[^\\t]*\"|'.[^\\t]*'";
    } else {
        $str_find =  "//.*\\n|{|}|\".[^\\t]*\"|'.[^\\t]*'";
    }
    searchdown $str_find, regular;
    while( result ){
        if( code == '{' ){
            #level = #level + 1;    //  push
        } else if( code == '}' ){
            if( #level == 00 ){ #found = 01;    break;  }   //  メッケ !
            #level = #level - 1;    //  pop
        } else if( code == '/' ){
            escape; right;
            if( code == '/' ){
                golineend2;
            } else if( code == '*' ){
                searchdown "\\*/|/\\*", regular;
                if( ! result ){
                    message "*/ - not found !";
                    call pp_reset1; endmacro;
                }
                if( code == '/' ){
                    message "/* - found !"; //  /* ... */ nesting !
                    call pp_reset1; endmacro;
                }
                escape;
            }
        } else if( code == '*' ){
            message "*/ - found !";
            call pp_reset1; endmacro;
        } else if( code == '#' ){
            call pp_cc_prepro1;
        } else {
            right;  //R left;   //  {   need "beer"}    そんな気が ???
        }
        searchdown $str_find, regular;
    }
    if( ! #found ){
        searchup "}";   //  個人的な趣味 !
        if( ! result ){ moveto #x_start, #y_start;  }
        message "} - not found !";
    }
    escape; call pp_reset1;
endmacro;

//  C, C++ - ^#
pp_cc_prepro1:
    escape; right;  selectword;
    $wk1 = gettext(seltopx,seltopy,selendx,selendy);    escape;
    if( $wk1 == "elif" && ( ! #false ) ){
        searchdown "^#endif", regular;
        if( ! result ){
            message "#endif - not found !";
            call pp_reset1; endmacro;
        }
        escape; golineend2;
    } else if( strstr("/if/elif/ifdef/ifndef/","/"+$wk1+"/") != -1 ){
        golinetop;  beginsel;   golineend2;
        $wk2 = gettext(seltopx,seltopy,selendx,selendy);    escape;
        $wk2 = leftstr($wk2,72);    //  限度かな !
        #menu2 = 00;
        while( #menu2 <= 01 ){
            menu $wk2,  "(&T) True",    "(&F) False";
            #menu2 = result;
            if( #menu2 == 00 ){
                call pp_reset1; endmacro;
            }
        }
        if( #menu2 == 02 ){
            golineend2; #false = 00;
        } else {    //  03
            searchdown "^#(endif|else|elif)", regular;
            if( ! result ){
                message "#endif - not found !";
                call pp_reset1; endmacro;
            }
            escape; right;  selectword;
            $wk2 = gettext(seltopx,seltopy,selendx,selendy);    escape;
            if( $wk2 == "elif" ){
                golinetop2; left;   #false = 01;
            } else {
                golineend2; #false = 00;
            }
        }
    } else if( $wk1 == "else" ){
        searchdown "^#endif", regular;
        if( ! result ){
            message "#endif - not found !";
            call pp_reset1; endmacro;
        }
        escape; golineend2; #false = 00;
    } else if( $wk1 == "endif" ){
        golineend2; #false = 00;
    } else {
        golineend2;
    }
    escape; //  ボケ防止 !
return;

pp_find_openkk1:
    #sw = 0;    searchdown "{";
    if( ! result ){
        gosearchstarted;    //  記憶 !
        #sw = 1;    searchup "{";
        if( ! result ){ message "{ - not found !";  endmacro;   }
    }
    escape;
    #menu1 = 00;
    while( #menu1 != 01 ){
        menu "{ - this kakko ? - (&Y) Yes", "(&U) Up",  "(&D) Down";
        #menu1 = result;
        if( #menu1 <= 00 ){
            endmacro;
        } else if( #menu1 == 01 ){
        } else if( #menu1 == 02 ){
            #sw = 1;    findup;
            if( ! result ){ message "{ - not found ! - up"; endmacro;   }
        } else if( #menu1 == 03 ){
            #sw = 0;    finddown;
            if( ! result ){ message "{ - not found ! - down";   endmacro;   }
        }
    }
    escape; //  ボケ防止 !
return;

//  C, C++ or macro, text - #type - 0: C, 1: macro
pp_cc_or_mac:
    #type = 00 < ( strstr(basename+"\\",".mac\\") + strstr(basename+"\\",".txt\\") );
    if( basename == "" || strstr(basename,".") == -1 ){ #type = 0;  }   //  作者の都合 !
return;

pp_set1:
    #selectfound = getininum("hidemaru.ini","Env","SelectFound");
    if( ! #selectfound ){
        writeininum "hidemaru.ini", "Env","SelectFound", 1;
        envchanged;
    }
return;

pp_reset1:
//  setsearch $searchbuffer, #searchoption;
    setsearch "{|}", 0x10;  //  ,regular;   //  個人的な趣味 !
    if( ! #selectfound ){
        writeininum "hidemaru.ini", "Env", "SelectFound", 0;
        envchanged;
    }
return;

endmacroall;
// end of macro.

[ ]
RE:01028 対応する括弧に移動について ! +No.01029
番頭++ さん 98/05/15 21:10
 
理想の、コーディングを 。。。

//menu 文はカーソルにまとわり付きます。
if( selecting ){
right;
} else {
gofileend;
}
searchup "{|}", regular, inselect;
while( result && code != eof ){
menu "(&N) Next - " + char(code), "(&E) End";
if( result != 01 ){escape;endmacro;}
gokakko;
if( ! result ){message "gokakko failed ! - up";endmacro;}
gokakko;findup;
}
escape;
endmacro;

[ ]