2016-09-12 5 views
0

私は現在、C++ベースのIDEをXCodeからVimに切り替える途中です。 私はVimプラグイン "YCM"について読んでおり、ソースディレクトリに.ycm_extra_conf.pyが存在することが必要です。私はYCM Generatorを使ってタグを生成する.ycm_extra_conf.pyとCtagsを生成しています。私の質問はタグを使用するものですか? YCMはCtags(コードに関するすべての定義と重要な情報を収集します)には何の利用もしていますか? YCMはCTagsによって生成されたタグを使っていますか? .ycm_extra_conf.pyを生成するにはタグが必要ですか?.ycm_extra_conf.pyとExuberant Ctagsとの関係

答えて

1

.ycm_extra_conf.pyが正しく設定されている場合は、cタグは必要ありません。

let g:ycm_collect_identifiers_from_tags_files = 1の場合、オプション--fields=+lでctagsを生成すると、YCMはctagsを認識し、すべてのタグを識別子として完成させますが、意味的完了としては正確ではありません。大きなctagsファイルは大量のメモリを使います。だから、ctagsはお勧めしません。

編集:セマンティックバックエンドとして

YCM利用打ち鳴らします。 .ycm_extra_conf.pyは必要なフラグを設定します。コンパイルデータベースを生成することもできますが、新しいファイルを追加するときは、コンパイルデータベースを再作成する必要があります。

通知.ycm_extra_conf.pyはPythonファイルですので、フラグを動的に生成することもできます。私の開発では、ほとんどのフラグは同じですが、インクルードフラグは変わります。私はグローバル.ycm_extra_conf.pyを使用して、すべてのプロジェクトに.hファイルを含めるためのフラグを生成します。この方法では通常、.ycm_extra_conf.pyを作成する必要はなく、すべての完了関数とgoto関数が機能します。

私のグローバル.ycm_extra_conf.pyをダウンロードし、いくつかの固定フラグを変更してプロジェクトルートに配置するか、グローバルに設定すると、完了する必要があります。

+0

私はタグ生成プロセスをスキップすることをお勧めしますか? .ycm_extra_conf.pyはどのような助けをしてくれますか? –

2

私は、YCMはタグデータベースを必要としないと言いたいと思います。あなたがclangパーサーに依存するようにコンパイルした場合は、非常にスマートな補完を得るでしょう。それがなければ、タグのおかげで何も得られない何かが得られます。

その他のプラグインのほとんどは、さまざまなことを達成するためにタグデータベースに依存しています。たとえば、tagbarは、システムのタグの構造化されたアウトラインを表示します。 lh-cppvim-refactor私は親、子、メンバー、ジャンプ/関数定義などを推測するために最後のタグベースを構築します。

タグを使ってスマートなものを達成することはできませんclangベースのプラグインで実現することができます。実際にはタグを生成するのがはるかに高速です(ただし、YCMはバックグラウンドで動作しますが、easytags(IIRC)、Gutentag、lh-tags v2(これは私が維持している)のようなプラグインを生成するタグもあります。残念ながら、彼らは情報を失うことがあります。特に私たちが非常にアクティブでないexhuberant ctagsを使用する場合は、C++コードを解析する代わりにuniversal ctagsを強くお勧めします。C++ 11の構文についても理解しています。

+0

答えてくれてありがとう、ありがとう。ycmがプロジェクトのctagsを生成せずに完全にうまくいくのであれば、.ycm_extra_conf.pyファイルを再生成するクラスを作成または削除するようなプロジェクトを変更するたびにそのことを意味するのだろうか? –

+0

YCMはクラスを気にしません。*翻訳単位*で動作します。各.ycm_extra_conf.pyファイルは一度読み込まれます。ですから、私が文書を読んでいるときに、それを編集する必要はありません(https://github.com/Valloric/YouCompleteMe#c-family-semantic-completion)。しかし、CMakeで生成されたjsonコンパイルデータベースを使用している場合、適切なオプションを指定して 'cmake'を実行して、新しいファイルを追加するたびにコンパイルデータベースを再生成する必要があります。 –