ctags使用詳細

2490 ワード

http://www.cppblog.com/peakflys/archive/2012/12/17/196373.html
ctagsはvimプログラミングとブラウズコードを使っています.CTRL+とCTRL+tでキーワードを往復してジャンプすることができます. ショートカットキーは、同じ名前のジャンプリストではなく、直接に検索した最初のレコードにジャンプします.この場合は、g+"を使用します. ) . 先生は自分の仕事リストのtagsになります.最も簡単で乱暴な使い方:
$cd yourwork $ctags -R *
このようにtagsファイルが作成されます.しかし、この問題はメンバー変数が含まれていません.自動的にオブジェクトのメンバーが完成した時にはヒントがありません.解決策:
$ctags -R --fields=+iaS --extra=+q *
–fields=[+]flags–fieldsはtagsの利用可能な拡張領域を指定して、tagsエントリに含める.i:継承情報Inhertance information a:クラスメンバーのアクセス制御情報Access(or export)of class memberss:従来の署名情報、例えばプロトタイプまたはパラメータテーブルflagsは、何らかの拡張情報をtagsエントリに含めるかどうかを指定します.q:クラスメンバー情報(c+++、java、Eifel)を含んでいます.しかし、C言語の構成であっても、この2つのパラメータ設定が必要です.
これで構造やクラスのメンバーが自動的に完成します.
しかし、システムの関数については、まだジャンプしていません.socketの定義のように、inetaddruinのような構造は自動変数で完成されていません.一番簡単な方法:
$ctags --fields=+iaS --extra=+q -R -f ~/.vim/systags /usr/include /usr/local/include
そして.vimrcにセットします.
set tags+=~/.vim/systags
これは基本的にシステム関数の定義にジャンプできますが、一つの問題はシステム関数によってはsystagsには加入していません.たとえば/usr/incluce/sockett.hのsocketシリーズ関数、memsetなどの多くのキー関数がここに来ていません.
extern int listen (int __fd, int __n) __THROW;
これは、__THROWのマクロ定義により、ctagsは、このシリーズ関数が関数であるとは考えられなくなりました.同じように、memcpyシリーズ関数:例えば/usr/include/string.hのようです.
extern int strcmp (__const char *__s1, __const char *__s2)      __THROW __attribute_pure__ __nonnull ((1, 2));
また、atributeuple、nonullなどの属性は無視しなければなりません.鑰if 0の定義が必要であれば、–if 0=yesは刋if 0という定義を無視してもいいです.
$ctags -I __THROW -I __attribute_pure__ -I __nonnull -I __attribute__ --file-scope=yes --langmap=c:+.h --languages=c,c++ --links=yes --c-kinds=+p --c++-kinds=+p --fields=+iaS --extra=+q -R -f ~/.vim/systags /usr/include /usr/local/include
このように.vim/sysstagsの中は全部ですが、内容が多すぎます.関数定義のジャンプには数十の候補があります.この時は簡単にして、-Rを削除して、自分でディレクトリを指定します.
$ctags -I __THROW -I __attribute_pure__ -I __nonnull -I __attribute__ --file-scope=yes --langmap=c:+.h --languages=c,c++ --links=yes --c-kinds=+p --c++-kinds=+p --fields=+iaS --extra=+q  -f ~/.vim/systags /usr/include/* /usr/include/sys/* /usr/include/bits/*  /usr/include/netinet/* /usr/include/arpa/* /usr/include/mysql/*
いくつかの自分のプログラミングに必要なパスも含まれています.*号を付けることに注意してください.このように生成されたシステムはtagsが少なくなります.あまり関係のない定義はありません.viの中で位置合わせショートカットを使う時、先に現在のディレクトリの中でtagsファイルを探して、見つけられないなら、父のディレクトリの中で探して、順を追って類推します.そうすると、大きなプロジェクトを編集する時、一番上の階にtagsファイルを作るだけで、その後は任意に工程のサブディレクトリに切り替えることができます.)