• ベストアンサー

サブルーチンを探すには?

4万行ほどあるcgiを解読中ですが、サブルーチンだけで数+個あるので、サブルーチンを定義してあるところを探すのが大変です。 &ikeike を選択すると sub ikeikeに手軽にジャンプするにはどういうeditorでどうしたらいいのでしょうか? 秀丸エディタやPerlEditorでは&ルーチンの一覧がでますが、たくさんあるのでその中から見つけるのが大変なのですが..

質問者が選んだベストアンサー

  • ベストアンサー
noname#144013
noname#144013
回答No.1

こんにちは。 > &ikeike を選択すると sub ikeikeに手軽にジャンプするにはどういうeditorでどうしたらいいのでしょうか? 勘違いでしたら、すみません。 エディタ上の、同一ソース上でサブルーチン本体の定義部分にジャンプしたいということでしょうか? その場合、秀丸エディタの場合ですが、正規表現で検索されては如何でしょうか? ※もし、正規表現の構文等が解らない場合は秀丸エディタのヘルプをご覧下さい。 (もう既に試されている場合は、御免なさい)   <検索パターンの例>     例1: ^[ \t]*sub[ \t]+ikeike[ \t]*({|$)       この例ですと、行頭から "sub ikeike" と記述された個所にヒットします。        ・行頭及び単語の間に、スペースorタブが複数あってもヒットします。        ・また、ルーチン名の後に '{' があるかまたは、行末だった場合にヒットします。     例2: sub ikeike       "sub" と "ルーチン名" の間がスペース1個と決まっているような場合は、正規表現パターンでなくても       単純に、このようなパターンでも良いと思います。 また、複数のルーチンを検索する際に、検索パターンを毎回入力するのが面倒な場合は、秀丸エディタのマクロ機能 を利用して、検索を半自動化する方法もあります。 マクロ利用の際のおおよその手順は、 1)サブルーチン呼び出し個所のルーチン名部分を、カーソルで選択状態(反転表示)にする。 2)作成した検索マクロを実行する。   マクロの処理としては、     ・選択部分の文字列(ルーチン名)を取り出して、正規表現の検索パターンに加工する、         ↓     ・作成した検索パターンで、正規表現による検索を実行する。         ↓     ・検索結果によりメッセージ等を表示する。         ↓     ・マクロ終了   のような流れになるかと思います。 以上が、質問者さんの目的とする内容と違っていた場合は、申し訳ありません。(その際はスルーして下さい) 【補足:秀丸のサンプルマクロ】 参考までに、上記の処理を行う秀丸エディタ用のサンプルマクロを作ってみましたので宜しければ試してみて下さい。 ■使用方法 注)下記記述において、使用されている秀丸エディタの設定(カスタマイズ)等により、メニュー項目及び操作等が   異なる場合がありますので、その際はご使用の環境に合わせて適せん置き換えて下さい。 1)下記のサンプルマクロを、拡張子 .mac として適当な名前を付けて、秀丸エディタがあるフォルダに保存して下さい。 2)秀丸エディタを起動して、メニュー「マクロ」 → 「マクロ登録」   で開いた「マクロ登録」ダイアログで、上記1)で保存したマクロファイルを登録して下さい。   その際、タイトルを適当な名前で登録して下さい。(例: "Perl サブルーチン検索")   ※登録が完了したら、メニュー「マクロ」下に、登録したマクロのタイトルが表示されると思います。 3)続いて秀丸エディタで、Perlのソースを開きます。 4)ソース内のサブルーチンを呼んでいる個所で、ルーチン名をマウスでダブルクリックすると、ルーチン名が   選択状態(反転表示)になると思います。 5)上記4)の状態で、メニュー「マクロ」→「(登録したマクロのタイトル)」 をクリックするとマクロが実行されます。   ◎ルーチン定義が見つかれば、その個所にカーソルが移動し、    "サブルーチン定義が見つかりました。" のメッセージボックスが表示されます。   ◎ルーチン定義が見つからなければ、    "サブルーチン定義はありませんでした。" のメッセージボックスが表示されます。 ■サンプルマクロ 注1)下記ソースには、字下げのために全角スペースを入れています。   ファイルに保存する際は、お手数ですが全角スペースを削除するか、半角スペースorタブに置換してから   保存して下さい。 注2)下記マクロは、最近の秀丸エディタのバージョン(Version 7.00以降)であれば多分動作すると思います。    もし、上手く動作しなかった場合は申し訳ありません。    また、マクロの修正及び機能の追加等を行いたい場合は、ご自身で適当にいじってみていろいろ試して    みて下さい。 //----------------------------------------------------- // 秀丸エディタ用 「Perl サブルーチン定義検索」マクロ Ver 1.0.0 //----------------------------------------------------- FsPerl_main: //変数の初期化 $rtname = ""; $schptn = ""; $mes = ""; //現テキスト&秀丸の設定状態を保存 #save_x = x; #save_y = y;    //カーソル位置のX,Y座標 #save_selecting = selecting;  //選択状態 #save_rectselecting = rectselecting;  //BOX選択状態 #save_seltopx = seltopx; #save_seltopy = seltopy;  //選択範囲の開始X,Y座標 #save_selendx = selendx; #save_selendy = selendy;  //選択範囲の終了X,Y座標 #save_srchopt = searchoption;  //検索フラグの値 $save_srchbuf = searchbuffer;  //検索バッファの内容 //選択文字列があるかチェック if (selecting==0 && rectselecting==0) {   $mes = "サブルーチン名を選択して下さい。";   message $mes;   endmacro; } //選択文字列が複数行でないかチェック if (seltopy != selendy) {   $mes = "単一行内のサブルーチン名を選択して下さい。";   message $mes;   endmacro; } //選択文字列(ルーチン名)を取得 $rtname = gettext( seltopx, seltopy, selendx, selendy, 1 ); //検索パターンを作成(正規表現 "sub xxxxx") $schptn = "^[ \\t]*sub[ \\t]+" + $rtname + "[ \\t]*({|$)"; //選択状態の解除 escape; escapeinselect; //検索実行 searchdown2 $schptn, regular, nocasesense, hilight, loop; if (result) {   //見つかった場合   //検索バッファを再保存   $save_srchbuf = searchbuffer;   //検索結果のメッセージ表示   $mes = "サブルーチン定義が見つかりました。";   beep; message $mes; } else {   //見つからなかった場合   //マクロ実行前のカーソル位置&選択状態を復元   if (#save_rectselecting) {  //マクロ開始前がBOX選択状態だった時     //選択状態の復元     moveto #save_seltopx, #save_seltopy;     beginrect;     moveto #save_selendx, #save_selendy;     //範囲選択モードを解除(範囲選択はそのまま)     endsel;   }   else if (#save_selecting) {  //マクロ開始前が選択状態だった時     //選択状態の復元     moveto #save_seltopx, #save_seltopy;     beginsel;     moveto #save_selendx, #save_selendy;     //範囲選択モードを解除(範囲選択はそのまま)     endsel;   }   //検索結果のメッセージ表示   $mes = "サブルーチン定義はありませんでした。";   beep; message $mes; } //秀丸の検索設定状態を復元 setsearch $save_srchbuf, #save_srchopt;  //検索バッファの内容、検索フラグの値 //マクロ終了 endmacro;

USB99
質問者

お礼

わざわざマクロまで書いていただいてありがとうございました。残念ねがら私の環境では動きませんでしたが、エッセンスだけとりだして copy; setmark; escape; beginclipboardread; $a=getclipboard; $b="sub "+$a; gofiletop; searchdown $b; でSubが定義してある場所へすぐ移動でき、また、マークしたSubを呼んでいるところにもすぐ戻れるようになりました。本当にありがとうございました。

すると、全ての回答が全文表示されます。

関連するQ&A