web-dev-qa-db-ja.com

Clang(clang_complete、YouCompleteMe)を使用したVim(C / C ++補完)用のCファミリーセマンティックオートコンプリートプラグイン

私はWindowsで64ビットVimを使用しています このバージョン by Haroogan

+python27
+python33
+huge

clang_complete を使おうとしているので、libclang.dllライブラリ here を取得し、vimrcを正しく設定しました。 libclang.dllが見つかりました。

ただし、*.cppファイルを開くと、次のメッセージが表示されます。

libclang組み込みインクルードが見つからないため、完了コードが遅くなります

しかし、私はまったく完了していません...

私が使用しているVimのバージョンを作成した人と一緒に この投稿 を見つけましたが、何をすべきかについて明確な指示がありません。誰かがここで助けることができますか?

更新

これが私がしたことです:

  1. 取った Vim YouCompleteMe for Windows
  2. 取った LLVM for Windows
  3. それからliclang.dllを取得し、YCM pythonディレクトリに貼り付けました
  4. 。ycm_extra_conf.py を取り、cppファイルでスタックしました

それはほとんど機能します(エラーメッセージはありません)が、それでも次のようになります。 no auto

17
statquant

clang_complete


Vim for Windowsをご利用いただきありがとうございます。お楽しみください。

問題を解決するには、.clang_completeファイルを利用する必要があります。詳細については、:h clang_completeをご覧ください。簡単に言うと、このファイルを任意のプロジェクトのルートディレクトリに配置できます(つまり、プロジェクトごとにこのファイルは異なる可能性があります。プロジェクトごとにツールチェーン構成が異なるため、これは完全に理にかなっています)。 MinGW-w64ツールチェーンのサンプルは次のとおりです。

-ID:/Toolchains/x64/MinGW-w64/4.8.1/lib/gcc/x86_64-w64-mingw32/4.8.1/include/c++
-ID:/Toolchains/x64/MinGW-w64/4.8.1/lib/gcc/x86_64-w64-mingw32/4.8.1/include/c++/x86_64-w64-mingw32
-ID:/Toolchains/x64/MinGW-w64/4.8.1/lib/gcc/x86_64-w64-mingw32/4.8.1/include/c++/backward
-ID:/Toolchains/x64/MinGW-w64/4.8.1/lib/gcc/x86_64-w64-mingw32/4.8.1/include
-ID:/Toolchains/x64/MinGW-w64/4.8.1/lib/gcc/x86_64-w64-mingw32/4.8.1/include-fixed
-ID:/Toolchains/x64/MinGW-w64/4.8.1/x86_64-w64-mingw32/include

-ID:/Libraries/x64/MinGW-w64/4.8.1/Boost/1.54.0/include

-ID:/Libraries/x64/MinGW-w64/4.8.1/Qt/4.8.5/include

-ID:/Libraries/x64/MinGW-w64/4.8.1/Eigen/3.1.3/include

"-ID:/Libraries/x64/MinGW-w64/4.8.1/Example with Spaces/0.0.1/include"

-std=c++11

-DUNICODE

Vimを使用してプロジェクト内のファイルを編集している場合、clang_completeは、最初に読み取る.clang_completeファイルに遭遇するまで、編集したファイルのすべての親ディレクトリを逆方向にトラバースします。次に、これらすべてのフラグ/スイッチ/定義を読み取り、libclangの呼び出し中にそれらを使用して完了します。

YouCompleteMe


最近はclang_completeを使いません。 Vim用のより強力なセマンティックオートコンプリートプラグインがあります。それはYouCompleteMeです。ぜひお試しください。 Cファミリ言語(C/C++/Objective-C/Objective-C++)のセマンティック補完には、libclangも使用します。堅牢なC++バックエンドに依存しているため、非常に高速です。 syntasticとの優れた統合があります(別のプラグインにはVimが必要です)。定義などにジャンプする機能があります。

C++で記述され、Python経由でVimに接着されているため、C++バックエンドをコンパイルする必要があります。苦痛を和らげるために、ビルド済みですぐに使用できるYCMプラグインをmyVim YouCompleteMe for Windowsからダウンロードできます。 x86とx64の両方のアーキテクチャ用に構築しました。ネイティブコンポーネントはycm_core.pydと呼ばれます。いつものように、選択したVimビルドのアーキテクチャはYCMビルドと一致する必要があります(つまり、ycm_core.pyd)。 YCMはPython 2(3ではない)で[〜#〜]のみ[〜#〜])動作します。 Python 2 DLL(eg python27.dll)およびPython 2インタープリター(python.exePATH環境変数。

LLVM/Clangが必要な場合は、私からダウンロードすることもできます:LLVM for Windows。繰り返しますが、PATH環境変数にlibclang.dllがあることを確認してください(推奨)[〜#〜]または[〜#〜]ycm_core.pydのすぐ隣。ここでも、x86アーキテクチャとx64アーキテクチャの両方がサポートされており、アーキテクチャはVimとYCMの両方に一致する必要があります。

完成について:

彼は魔法のようにSTLがどこにあるかを見つける必要がありますか?

もちろん違います!これは、Clangフロントエンドに基づくオートコンプリートシステムです。コードのコンパイルに現在使用しているツールチェーンをどのように知る必要がありますか? Visual C++、Borland C++、GCC、MinGW、MinGW-w64、LLVM/Clangなど、何でも使用できます。それぞれに独自の標準ライブラリとランタイムが用意されています。したがって、いずれの場合も、現在のツールチェーンが標準インクルードを見つけるために使用するすべてのパスを指定する必要があります。

たとえば、GCC、MinGW、MinGW-w64の場合、POSIXシェルで次を実行できます。

g++ -E -x c++ - -v < /dev/null

またはWindowsコマンドプロンプトの場合:

g++ -E -x c++ - -v < nul

そして、次の抜粋を探してください。

#include <...> search starts here:
 d:\toolchains\x64\mingw-w64\4.8.1\posix\seh\bin\../lib/gcc/x86_64-w64-mingw32/4.8.1/include/c++
 d:\toolchains\x64\mingw-w64\4.8.1\posix\seh\bin\../lib/gcc/x86_64-w64-mingw32/4.8.1/include/c++/x86_64-w64-mingw32
 d:\toolchains\x64\mingw-w64\4.8.1\posix\seh\bin\../lib/gcc/x86_64-w64-mingw32/4.8.1/include/c++/backward
 d:\toolchains\x64\mingw-w64\4.8.1\posix\seh\bin\../lib/gcc/x86_64-w64-mingw32/4.8.1/include
 d:\toolchains\x64\mingw-w64\4.8.1\posix\seh\bin\../lib/gcc/x86_64-w64-mingw32/4.8.1/include-fixed
 d:\toolchains\x64\mingw-w64\4.8.1\posix\seh\bin\../lib/gcc/x86_64-w64-mingw32/4.8.1/../../../../x86_64-w64-mingw32/include
End of search list.

これは、標準へのすべてのパスに、コードのコンパイル中にGCC、MinGW、MinGW-w64が暗黙的に使用するが含まれていることを示しています。

LLVM/Clangの場合、同じことができます。

clang++ -E -x c++ - -v < /dev/null

または:

clang++ -E -x c++ - -v < nul

パスがわかったら、それらを.ycm_extra_conf.pyに追加できます。たとえば、私の場合:

'-I',
'D:/Toolchains/x64/MinGW-w64/4.8.1/POSIX/SEH/lib/gcc/x86_64-w64-mingw32/4.8.1/include/c++',
'-I',
'D:/Toolchains/x64/MinGW-w64/4.8.1/POSIX/SEH/lib/gcc/x86_64-w64-mingw32/4.8.1/include/c++/x86_64-w64-mingw32',
'-I',
'D:/Toolchains/x64/MinGW-w64/4.8.1/POSIX/SEH/lib/gcc/x86_64-w64-mingw32/4.8.1/include/c++/backward',
'-I',
'D:/Toolchains/x64/MinGW-w64/4.8.1/POSIX/SEH/lib/gcc/x86_64-w64-mingw32/4.8.1/include',
'-I',
'D:/Toolchains/x64/MinGW-w64/4.8.1/POSIX/SEH/lib/gcc/x86_64-w64-mingw32/4.8.1/include-fixed',
'-I',
'D:/Toolchains/x64/MinGW-w64/4.8.1/POSIX/SEH/x86_64-w64-mingw32/include',
26