対応する括弧に移動についての要望No.00997
ドラゴン さん 98/05/13 11:42
 
対応する括弧に移動の機能ですが、途中に”#if", "#ifdef", "#ifndef"等があった場合、
正しい位置に移動することができませんが、これを正しく移動できる様にはして頂けないで
しょうか?  改修等でソースファイルの中身がかなりわかりづらくなっていて、対応する
括弧か見つけにくくなっているので、非常に困っている状況になっています。

”#if", "#ifdef", "#ifndef"の中は、無視する(コメント扱い)は絶対にほしいのですが、
できれば、”#if", "#ifdef", "#ifndef" の後のキーワード単位でいかしたり、いかさなかったり
できればベストですが、どうでしょうか?  かなり、難しいお願いだと思いますが、ご検討を
お願いします。

[ ]
RE:00997 対応する括弧に移動についての要No.00999
ドラゴン さん 98/05/13 13:58
 

>対応する括弧に移動の機能ですが、途中に”#if", "#ifdef", "#ifndef"等があった場合、

発言番号00997の付け足しですが、コメント文も無条件で無視してほしいです。

[ ]
RE:00997 対応する括弧に移動についての要No.01005
秀丸担当 さん 98/05/13 16:57
 
>対応する括弧に移動の機能ですが、途中に”#if", "#ifdef", "#ifndef"等があった
場合、
>正しい位置に移動することができませんが、これを正しく移動できる様にはして頂
けないで
>しょうか?  改修等でソースファイルの中身がかなりわかりづらくなっていて、対
応する
>括弧か見つけにくくなっているので、非常に困っている状況になっています。

うーん、これは、具体的にはどのような状況でしょうか。

#ifdef XXX
if(...) {
#else
if(...) {
#endif
}

っていうような状況でしょうか。
それはちょっと難しいかも...

[ ]
RE:01005 対応する括弧に移動についてのNo.01007
ドラゴン さん 98/05/13 17:24
 

>うーん、これは、具体的にはどのような状況でしょうか。
>
>#ifdef XXX
>if(...) {
>#else
>if(...) {
>#endif
>}
>
>っていうような状況でしょうか。
>それはちょっと難しいかも...

基本的には、上の例の様なことを指しています。  ようは、”{”と”}”の数が"#ifdef"等
を入れたことにより一致しない場合です。  難しいとは思いますが、これができると助かる人は
沢山いると思いますが。。。  


[ ]
RE:01005 対応する括弧に移動についてのNo.01008
ドラゴン さん 98/05/13 18:50
 

>うーん、これは、具体的にはどのような状況でしょうか。
 >
 >#ifdef XXX
 >if(...) {
 >#else
 >if(...) {
 >#endif
 >}
 >
 >っていうような状況でしょうか。
 >それはちょっと難しいかも...

 基本的には、上の例の様なことを指しています。 ようは、”{”と”}”の数が"#ifdef"等
 を入れたことにより一致しない場合です。

あとは、以下の様なケースも同様です。

/* if ( i == 0 ) {  */  <-- ここのコメントで”{”の数が多くなる
if ( i != 0 ) {
      ・
      ・
      ・
}

 難しいとは思いますが、これができると助かる人は沢山いると思いますが。。。

[ ]
RE:01008 対応する括弧に移動についてのNo.01013
番頭++ さん 98/05/14 17:50
 
> >それはちょっと難しいかも...

確かに難しい 。。。


C, C++ コンパイラの phase 1 の処理をマクロにするにはしんどいので、とりあ
えず、サンプルマクロを仮に書いてみましたが。これ以上はしんどいです。まっ
たくのフリーフォーマットのソースを処理するのはきついですよね。

番頭++ でした。

//  find_close_kakko9.mac - 1998/05/14
//  } の相手は探しずらいです。
//  文字、数値リテラル「エスケープ処理」の考慮はない。
//  この作者は C, C++ を知らない。コンパイラを持っていない。
//  このマクロはあくまでもサンプルである。エンハンスの予定も無い。

    escape;
    if( strstr("{",char(code)) == -1 ){
        #sw = 0;    searchdown "{";
        if( ! result ){
            gosearchstarted;
            #sw = 1;    searchup "{";
            if( ! result ){ message "{ - not found !";  endmacro;   }
        }
        #menu = 00;
        while( #menu != 01 ){
            menu "{ - this one ? - (&Y) Yes",   "(&D) Down",    "(&U) Up";
            #menu = result;
            if( #menu <= 00 ){
                escape; endmacro;
            } else if( #menu == 01 ){
            } else if( #menu == 02 ){
                #sw = 0;    finddown;
                if( ! result ){ message "{ - not found ! - down";   endmacro;   }
            } else if( #menu == 03 ){
                #sw = 1;    findup;
                if( ! result ){ message "{ - not found ! - up"; endmacro;   }
            }
        }
        escape;
    }
    #x_start = x;   #y_start = y;   #i_code = code;
    call pp_set1;
    #level = 00;
    $str_find =  "^#|//.*\\n|{|}|/\\*|\\*/";
    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 !";
                    call pp_reset1; endmacro;
                }
                escape;
            }
        } else if( code == '*' ){
            message "*/ - found !";
            call pp_reset1; endmacro;
        } else if( code == '#' ){
            call pp_c1;
        } else {
            right;
        }
        searchdown $str_find, regular;
    }
    if( ! #found ){
        searchup "}";
        message "} - not found !";
    }
    escape;
    call pp_reset1;
endmacro;

pp_c1:
    escape; right;  selectword;
    $wk1 = gettext(seltopx,seltopy,selendx,selendy);
    if( $wk1 == "ifdef" ){
        escape; golinetop;  beginsel;   golineend2;
        $wk2 = gettext(seltopx,seltopy,selendx,selendy);
        $wk2 = leftstr($wk2,60);
        menu $wk2,  "(&T) True",    "(&F) False";
        #menu2 = result;
        if( #menu2 <= 01 ){
            call pp_reset1; endmacro;
        } else if( #menu2 == 02 ){
            escape; golineend2;
        } else if( #menu2 == 03 ){
            searchdown "^(#endif|#else)", regular;
            if( ! result ){
                message "#endif, #else - not found !";
                call pp_reset1; endmacro;
            }
            escape; golineend2;
        } else {
        }
    } else if( $wk1 == "else" ){
        searchdown "^#endif", regular;
        if( ! result ){
            message "#endif - not found !";
            call pp_reset1; endmacro;
        }
        escape; golineend2;
    } else if( $wk1 == "endif" ){
        golineend2;
    } else {
        golineend2;
    }
    escape;
return;

pp_set1:
    $searchbuffer = searchbuffer;   #searchoption = searchoption;
    #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;

[ ]
RE:01013 対応する括弧に移動についてNo.01015
秀丸担当 さん 98/05/14 19:06
 
>C, C++ コンパイラの phase 1 の処理をマクロにするにはしんどいので、とりあ
>えず、サンプルマクロを仮に書いてみましたが。これ以上はしんどいです。まっ
>たくのフリーフォーマットのソースを処理するのはきついですよね。

とりあえずと言いつつここまで作ってしまうあなたはいったい...
なかなか、このマクロも使えるのではないでしょうか。

[ ]