Плагины семантического автозаполнения семейства C для Vim (завершение C/C++) с использованием Clang (clang_complete, YouCompleteMe)
Я использую 64-битный Vim на Windows, эта версия от Alexander Shukaev:
+python27
+python33
+huge
Я пытаюсь использовать clang_complete, поэтому я взял libclang.dll
библиотека здесь, и я создал свой vimrc
правильно. libclang.dll
найден.
Однако, когда я открываю *.cpp
файл у меня теперь есть сообщение:
libclang
не может найти встроенный включает это приведет к медленному завершению кода
но у меня нет завершения вообще...
Я нашел этот пост с парнем, который создает версию Vim, которую я использую, но нет четкой инструкции о том, что делать. Кто-нибудь может здесь помочь?
ОБНОВИТЬ
Вот что я сделал:
- Взял Vim YouCompleteMe для Windows
- Взял LLVM для Windows
- Взял из него файл liclang.dll и воткнул его в каталог python YCM
- Взял .ycm_extra_conf.py и прикрепил его к моему файлу cpp
Это почти работает (у меня нет сообщений об ошибках), но я все равно получаю:
1 ответ
clang_complete
Спасибо за использование Vim для 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
для завершения.
Ты дополняешь меня
В эти дни я не использую clang_complete
больше. Там есть более мощный плагин семантического автодополнения для нашего Vim. Это YouCompleteMe. Я настоятельно рекомендую вам попробовать. Для семантического завершения языков семейства C (C/C++/Objective-C/Objective-C++) он использует libclang
также. Он опирается на надежную C++ серверную часть и поэтому невероятно быстр. Он имеет большую интеграцию с синтетическим (другой должен иметь плагин для Vim). У него есть возможность переходить к определениям и так далее.
Поскольку он написан на C++ и приклеен к Vim через Python, вам придется скомпилировать серверную часть C++. Чтобы облегчить боль, вы можете загрузить готовый и готовый к использованию плагин YCM из моего Vim YouCompleteMe для Windows. Я построил его как для архитектуры x86, так и для архитектуры x64. Нативный компонент называется ycm_core.pyd
, Как обычно, архитектура выбранной вами сборки Vim должна соответствовать сборке YCM (т.е. ycm_core.pyd
). YCM может работать ТОЛЬКО с Python 2 (не 3), поэтому просто убедитесь, что у вас есть Python 2 DLL (например, python27.dll
) и интерпретатор Python 2 (python.exe
) в PATH
переменная окружения.
Если вам нужен LLVM/Clang, вы также можете скачать его у меня: LLVM для Windows. Опять же, просто убедитесь, что у вас есть libclang.dll
в PATH
переменная окружения (рекомендуется) ИЛИ прямо рядом с 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',