menucomplete.msのクラスメンバ補完を強化する
先ほどのctagsをWin32環境でビルドするで書いた「やりたかったこと」が一応できました。以下で順に解説したいと思います。
まずきっかけは、ctagsに「--extra=+q」というオプションがあることを発見したことでした。このオプションを付けてctags -eを実行すると、通常なら
class CApp : public CAppFrame {CApp4,52のように出力されるところが、
CFastPlaneFactory planeFactory_;planeFactory_12,202
class CApp : public CAppFrame {CApp4,52のように表示されるのです。
CFastPlaneFactory planeFactory_;CApp::planeFactory_12,202
何が違うの?と思われるかも知れないのですが、CAppクラスのメンバであるplaneFactoryのタグに、「CApp::」という修飾名が付いています。つまり、「--extra=+q」というオプションは、クラスメンバのタグの出力を、スコープ付きで行ってくれるというオプションなのです。
これはメンバ補完にとっては画期的なことで、あるクラスのメンバを探すには、「クラス名::」でgrepしてやればいいことになります。それで関数もメンバ変数もenumも全て取得できるのです。これを発見したときは、正直かなり興奮してしまいました。
ただ、実際に「--extra=+q」オプションを使ってみると、問題があることがわかりました。このオプションは、クラスのタグ出力をスコープ付きで行ってくれるのはよいのですが、スコープ付きでない出力も同時に行ってしまうのです。先ほどの例でいうと、
class CApp : public CAppFrame {CApp4,52のようになってしまいます。これではTAGSのサイズがほぼ2倍になってしまいますし、Peggyでタグジャンプするときに候補が二つ表示されてしまい、大変使いづらいです。
CFastPlaneFactory planeFactory_;planeFactory_12,202
CFastPlaneFactory planeFactory_;CApp::planeFactory_12,202
というわけで、Peggyで「--extra=+q」オプションをまともに使うには、スコープ付きタグを出力したときには通常のタグを出力しないという改造をctagsに施す必要がある、ということになります。このため、ctagsのビルド環境を整える必要があったわけです。
実際に行った改造はそれほど大きなものではなく、c.cというソースを以下のパッチの通りに変更すればOKです。なお、パッチはctags5.7J1に対してのものです。
1094a1095,1099目的の通り、「スコープ付きのタグを出力するときは通常のタグを出力しない」という改造です。
> static boolean isExtraTagEntryExist(vString *const scope)
> {
> return (Option.include.qualifiedTags && scope != NULL && vStringLength (scope) > 0);
> }
>
1098,1099c1103
< if (Option.include.qualifiedTags &&
< scope != NULL && vStringLength (scope) > 0)
---
> if (isExtraTagEntryExist(scope))
1157,1158c1161,1165
< makeTagEntry (&e);
< makeExtraTagEntry (type, &e, scope);
---
> if (isExtraTagEntryExist(scope)) {
> makeExtraTagEntry (type, &e, scope);
> } else {
> makeTagEntry (&e);
> }
この改造版ctagsをPeggyが使うようにして、menucomplete.msも改造したところ、正しくクラスのメンバ補完が行えるようになりました。今までとは比較にならない精度でメンバを拾うことができます。また副作用として、namespaceにも補完が効くようになりました。namespace内で定義しているクラス名等が表示されます。
ただ、今回の改造版ctagsとmenucomplete.msの公開に関しては今まで通りはいかなそうです。スクリプトであれば、アンカーシステムズさんのMocaScriptライブラリでチェックしていただけるのですが、改造したctagsのバイナリとなると、動かしても大丈夫かチェックする方法がありません。パッチだけを公開して、自分でコンパイルしてもらうのは敷居が高すぎますし…。
ひとまずは、思いがけない問題が隠れている可能性もありますので、自分で使ってチェックしようと思います。公開の仕方はその後に考えたいと思います。
| 固定リンク
「パソコン・インターネット」カテゴリの記事
- 初音ミクの曲(動画)個人的な十選(2009.02.15)
- 2008年ニコニコ動画個人的ベスト10(2008.12.06)
- menucomplete.msのクラスメンバ補完を強化する(2008.07.21)
- ctagsをWin32環境でビルドする(2008.07.21)
- EeePC901の初期設定(2008.07.21)


コメント
dodongaです。
私もPeggyでC/migemoをなんとか使えないか思案・悪戦苦闘中です。
gtags・globaもなのですけどね;;
exeですが、私はmingwで作ってます。
以上、駄文でした。
投稿: dodonga | 2008.10.02 04:57 午前
なるほど、mingwでもコンパイルできるんですね。パフォーマンスはどちらが良いのか、気になるところです。
c/migemoはブラウザ等ではすごく便利なのですが、僕はPeggyではasciiの検索がほとんどなので、なくてもいいかなと思ってます。
インクリメンタル検索でしたら、拙作のi-search.msをぜひ試してみてください(^^
投稿: ashel | 2008.10.04 01:05 午前
dodongaです。
「i-search.ms」も「menucomplete.ms」も私の日常使用スクリプトです。
とても便利に使わせております^^。ありがとうございます。
i-search.ms と被ってしまう目標ではありますが、私の今の主眼は
「如何にして外部ツ~ルと連携を取るか」
です。Peggyでpipeが使えない・dllを使えない現状をどうするか。
それと、migemoのPeggy版exeを作ったとして、どう配布するかasheさんと同じ悩みを持っています。
(原版はemacs・viを前提にしてますので)
/* mocaで全実装しちゃおかなあ;; */
うまく、実装できたらashel さんのi-search.ms に取り込んでもらえたら幸いです。
P.S.
C/migemoに関してですが、MigemizeExplorer と言うフリ~ソフトがかつてありました。
現在は公開停止になってしまって、今はgoogle先生で探して、再配布から拾わなくてはならないですが;
これ、使うと病みつきになれますお。設定は特にしないで「強制使用」をチェック選択で、
デフォルトでPeggyでも 使用出来ます。List/TreeViewでのHookで動作しますので、Peggyの
プロジェクトタブ・アウトラインタブで動作します。これをPeggy内でも実現できないかなあと;;
以上駄文でした。
投稿: dodonga | 2008.10.09 01:10 午前
dodongaさん、コメントありがとうございます。
スクリプトを使っている人からコメントをいただけると、すごく嬉しいです。
これからもいろいろと公開していこうと思います(^^
i-search.msのMigemoへの対応は、MocaスクリプトのsetHighlightメソッドが正規表現を受け付けられるので、マッチする文字列のリストさえあればいけそうですね。できましたらぜひご連絡ください。
投稿: ashel | 2008.10.12 01:17 午前