複数のC ++ソースファイルプロジェクトの関数宣言または定義にジャンプできますか?


15

複数のC ++ソースファイルプロジェクトの関数宣言または定義にジャンプできますか?

ヘッダーファイルがあるとしましょうfoo.hpp

int bar();

およびソースファイルfoo.cpp

#include "foo.hpp"
int bar() { return 42; }

メインファイルmain.cpp

#include "foo.hpp"
int main() { bar(); return 0; }

vimは、関数bar()から関数の定義と宣言の両方を見つけることができmainますか?

回答:


14

あふれんばかりのctagsは、これを達成する最も簡単な方法です。GNU / Linux(UbuntuやDebianなど)では、次のことができるはずです。

sudo apt-get install exuberant-ctags

(OSXの場合は「$ brew install ctags」で十分です。Windowsの場合は、http://ctags.sourceforge.net/にアクセスして、スタンドアロンの実行可能ファイルをダウンロードできます)

次に、プロジェクトのルートフォルダーに移動して実行します

ctags -R --exclude=.git .

これはプロジェクト全体をスキャンし、vimが自動的に使用してキーを押すと機能にジャンプする機能を提供する./tagsファイルを作成します。すなわち:

Ctrl + ]

実装を確認したい関数の上にカーソルを置いてください。他にもctagsを使用してコード内をナビゲートできるようにする組み合わせや多くのコマンドモード関数があります(たとえば、古いタグスタックエントリにジャンプするにはCtrl+ t)。:help 29.1概要を参照してください。

コードの重要な変更ごとにctagsを再実行し、プロジェクトのインデックスを再作成する必要があることに注意してください。それを手動で行うか、ホットキーまたは書き込み時にvimにそれを行うように教えることができます。

ヒント: ctagsを広範囲に使用する場合、vim-taglist(http://vim-taglist.sourceforge.net)プラグインも一見の価値があります。そのクラス/ファイルのすべての関数のリストを含むIDEスタイルのアウトラインが表示されます。


知っておくべき2つのこと:ユニバーサルctagsは、多くの点で熱狂的なctagsに取って代わりました。また、gitにタグを同期させる方法
D.ベンノブル

4

これまでのところ、関数の宣言または定義のいずれかを見つける問題の2つの解決策に名前を付けることができます。タグベースの別のよく知られたソリューションがあることは知っていますが、私はそれを使用しないので、他の人があなたにそれを与えるようにします。

より多くのトレンディ1は、最初:YouCompleteMeはあり:GoToDefinition:GoToDeclarationコマンドのペアを。

私が使用するもの(10年の長い習慣を変えるのは難しいです)。私のlh-tagsプラグインには、ctagsデータベースを生成し、増分的に更新する方法があります。またCTRL+W Meta+Down、カーソルの下にあるもの(/選択されているもの)に一致するすべての宣言と定義を表示する方法()を提供します。このソリューションはctagsに依存しているため、カーソルの下にある識別子のどのオーバーロードが実際に関連しているかを知ることはできません。他のctagsベースのソリューションは、このトピックについて悪い(/良い)べきです。ただし、ここではYCMの方がはるかに優れているはずです。

Discl .:より人間工学的な代替手段としてlh-tagsを実装しました:tselect

(実際に私は、第三の溶液を覚えている:私はのフォーク始まった打ち鳴らす-インデクサーおよび関連vimのプラグイン、それをカプセル化しているだろう。しかし周りYCMで、私はこのソリューションを忘れるように思います。)

編集:2019年現在、最も効率的なソリューションはLSPサーバーに依存していますCOC + cclsを使用して、インデックスを作成し、ジャンプし、さらに多くのことを行います。あまり時間をかけないプロジェクトやclangとcclsの最新バージョンをインストールできないプロジェクトのCOCを構成するのが面倒な場合、タグベースのソリューションに戻ります。


1
入力をありがとう、各ソリューションをテストします。YouCompleteMeをテストしましたが、GoToDeclaration複数のソースファイルでのみ動作します。以下に関するドキュメントからの引用GoToDefinitionですFor C-family languages this only works ... when the definition of the symbol is in the current translation unit.。また、コマンドは:YcmCompleter GoTo*です。
長谷川アラン

私はこの行を逃しました。これは、clang_indexerがまだ有用であることを意味します。他のソリューションは、インストールするのが少し難しいかもしれません。必要に応じて私にメールを送ることをheしないでください。
リュックエルミット

3

いくつかの選択肢があります。最初のものはctagsです。より高度なインデクサーが必要な場合cscopeは、より良い代替手段です。たとえば、特定の関数のすべての呼び出し元をリストできます。これらのツールは、コードを実際に正しく理解せずにコードにインデックスを付けます(特定のシンボルの意味を知るための簡単な文法定義があります)。また、その文法を拡張することは比較的簡単です。taglistプラグインは、これらを持っている必要があり、それはタグリストでshow結果にインデクサ文法を拡張することが可能です。

インデクサー以上のものが必要な場合は、構文チェックのようなYouCompleteMe方法がおそらく道です。の上に構築されているため、llvm適切なパーサーがあります。これにより、コードの構文とセマンティクスを確認できます

次に、ドメイン固有の言語または埋め込みコードを含むコードを使用する場合、多くの場合、ファイルを介して単にグレッピングします。代替手段はAck、このタスクを支援しようとするperlスクリプトです。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.