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のバイナリとなると、動かしても大丈夫かチェックする方法がありません。パッチだけを公開して、自分でコンパイルしてもらうのは敷居が高すぎますし…。
ひとまずは、思いがけない問題が隠れている可能性もありますので、自分で使ってチェックしようと思います。公開の仕方はその後に考えたいと思います。
| 固定リンク | コメント (4) | トラックバック (0)


最近のコメント