C++でのダイレクトタグジャンプについてNo.09391
Suezo さん 17/03/27 17:55
 
いつも便利に使用させてもらっています。

C++での開発を行っているのですが、Class違いの同一関数名が複数ありダイレクトタ
グジャンプをすると、
一覧表からの選択となります。

Class名も考慮して、自動でジャンプすることはできないでしょうか?

現状、下記のような構成になっています。

・ファイルA
void __fastcall TClassA::ABC(TObject *Sender)
{}

・ファイルB
void __fastcall TClassB::ABC(TObject *Sender)
{}

   ・・・・

・呼出元(ファイルC)
void __fastcall TClassC::CCC(TObject *Sender)
{
    ClassB->ABC(Sender);
}

呼出元のABCにカーソルがある状態でダイレクトタグジャンプをすると
一覧表からTClassA::ABC()とTClassB::ABC()の選択になります。
実際には同一関数名が20個ぐらいあったりします。

これを 関数名の前に「->」があったら、その前の単語(クラス名)で再検索して1つ
にしぼるような処理はできないでしょうか?
(「->」だけでなく「.」の場合もありますが)

ちなみに、構造体や共用対のメンバ、グローバル変数等にジャンプしたいの、「Exub
erant Ctags」 で
 tagsファイルを作成しています。

ここ10年ぐらい、これができればどんなに楽になることかとずっと思っていました。

以上、よろしくお願いします。

[ ]
RE:09391 C++でのダイレクトタグジャンプNo.09393
秀丸担当 さん 17/03/28 10:53
 

ダイレクトタグジャンプは、現在は同名のものがある場合、同一ファイルにヒッ
トするものがあれば事前にそれを選択した状態になっています。
例えば、ファイルBでABCでダイレクトタグジャンプをすると、ダイアログの選択
項目は、同名のものが出ますが、選択はあらかじめファイルBのABCが選択された
状態になります。

ファイルCからの場合、ClassBがTClassBクラスであるということがコンパイルす
るレベルまでしないと判断できないので難しいです。これをやるには外部のプロ
グラムとしてclangを入れたりして静的コード解析をしないとできないと思いま
す。一時期単語補完で調べようとしたことがありましたが、やっていないです。
あるいは、ctagsまたはその派生の形式としてそれを判断できる情報がもしある
ようでしたら、方法は考えられると思いますが、もしご存知でしたら教えていた
だけると参考になります。

[ ]
RE:09393 C++でのダイレクトタグジャンプNo.09395
Suezo さん 17/03/28 11:52
 
>ファイルCからの場合、ClassBがTClassBクラスであるということがコンパイルす
>るレベルまでしないと判断できないので難しいです。これをやるには外部のプロ
>グラムとしてclangを入れたりして静的コード解析をしないとできないと思いま
>す。一時期単語補完で調べようとしたことがありましたが、やっていないです。

内部処理がどうなっているかわからないので勘違いしていたらすみません。
私の理解としてダイレクトタグジャンプは、検索対象の単語を「tags」ファイル内で
Grepして、
1つだけヒットしたら、その行にジャンプし、複数ヒットしたら一覧表に表示する処
理だと思っています。

これを前提として、

@検索対象の単語で「tags」ファイル内をGrepする。

A-1 @で1つだけヒットした場合
 ・その行にジャンプ。(今まで通り)

A-2 @で複数ヒットした場合、
 ・検索対象の単語の前に「->」があったら、「->」の前の単語を検索対象として
 一覧表内のデータで再Grepする。
 ・検索対象の単語の前に「->」なければ、そのまま一覧表表示(今まで通り)

B-1 A-2で1つだけヒットした場合、その行にジャンプ
B-2 A-2で複数ヒットした場合、一覧表表示
B-3 A-2で1つもヒットしなかった場合、@でのGrep結果を一覧表表示

後、設定で
 ・上記をする/しない(今まで通り)
 ・検索対象の前の記号の指定
  (「->」「.」又は両方。他にもに任意で指定できたら)

いろいろ穴はあるかもしれませんが、私がやりたいことは上記です。
厳密にやろうとすると、いろいろたいへんだと思いますが、上記は
既存の処理の組み合わせなのでなんとかなるとうれしいです。

以上、検討よろしくお願いします。

[ ]
RE:09395 C++でのダイレクトタグジャンプNo.09396
秀丸担当 さん 17/03/28 17:37
 

厳密でなくても簡易にということであれば何らかの方法はあるかもしれないです。

ただご提案の方法の場合は、変数名がたまたま一致している場合はいいですが、
そうでない場合はあまり効果がなかったり、間違ったものに絞り込む可能性があ
りそうです。
例えば以下の例で、「p」や「a」に絞り込んでも効果は無いか、逆に期待するも
のが消えてしまう可能性があるのではないかと思います。
TClassB* p = new TClassB();
TClassB a;
p->ABC(Sender);
a.ABC(Sender);

[ ]
RE:09396 C++でのダイレクトタグジャンプNo.09397
Suezo さん 17/03/28 23:38
 
>ただご提案の方法の場合は、変数名がたまたま一致している場合はいいですが、
>そうでない場合はあまり効果がなかったり、間違ったものに絞り込む可能性があ
>りそうです。
>例えば以下の例で、「p」や「a」に絞り込んでも効果は無いか、逆に期待するも
>のが消えてしまう可能性があるのではないかと思います。
>TClassB* p = new TClassB();
>TClassB a;
>p->ABC(Sender);
>a.ABC(Sender);

そうですね。効果がない方は承知していて、現状と同じになるだけなので問題ないか
なと思っていましたが、
変数名が短かくてヒットしてしまうと消えたり、間違った場所にジャンプする場合も
ありますね。
自分は上記の例のような使い方をほとんどしてなかったので気づきませんでした。
ほとんどの場合、直接  ClassB->ABC() のように記述してましたので。
で、他の人はわかりませんが、自分的には間違ってジャンプしてもかまわないかなと
も思っています。
一覧表で20個ぐらい表示されると、手動で選択した際に間違うこともしばしばあるの
で。
9割一発で飛んでくれれば全然O.Kです。

この機能は最初から完璧にはできないと思いますし、今までないものですから、とり
あえずテスト的に作っていい案が浮かんだら徐々に制度を上げるような改良を行って
くれればいいなと思います。
誤動作を減らす手段として、設定で、Class名の検索は何文字以上と指定できるよう
にすると2文字以上にした場合は、上記の「a」や「p」は検索しなくなりますね。
誤動作はするものとして始めて、減らす方向でいくのはどうでしょうか。

以上、よろしくお願いします。

[ ]
RE:09397 C++でのダイレクトタグジャンプNo.09398
秀丸担当 さん 17/03/29 15:18
 

効果がないとしても、従来と同じになるだけというものであれば、無いよりかは
あったらいいものと思います。
具体的な方法は、ヒットしたもの以外を消してしまうのは良くないと思いますが、
そういうことができたらいいということでご意見参考にさせていただきます。

[ ]
RE:09398 C++でのダイレクトタグジャンプNo.09399
Suezo さん 17/03/30 09:23
 
よろしくお願いします。
気長に待ってます。

[ ]