C-family Semantic Autocompletion Plugins для Vim (завершение C/С++) с использованием Clang (clang_complete, YouCompleteMe)

Я использую 64-битный Vim на окнах, эту версию Haroogan:

+python27
+python33
+huge

Я пытаюсь использовать clang_complete, поэтому я взял библиотеку libclang.dll здесь, и я правильно настроил свой vimrc. libclang.dll.

Однако, когда я открываю файл *.cpp, у меня теперь есть сообщение:

libclang не может найти встроенное приложение, это приведет к медленному код завершения

но у меня нет полного завершения...

Я нашел этот пост с парнем, который строит версию Vim, которую я использую, но нет четкой инструкции о том, что делать, Может ли кто-нибудь помочь здесь?

UPDATE

Вот что я сделал:

Он почти работает (у меня нет сообщения об ошибке), но я все равно получаю: no auto

Ответы

Ответ 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 для завершения.

YouCompleteMe


В наши дни я больше не использую clang_complete. Для Vim существует более мощный семантический автозаполняющий плагин. Это YouCompleteMe. Я настоятельно рекомендую вам попробовать. Для семантического завершения языков C-семейства (C/С++/ Objective-C/Objective-С++) он также использует libclang. Он опирается на надежный конец С++ и, следовательно, невероятно быстро. Он имеет большую интеграцию с syntastic (у другого должен быть плагин для Vim). Он имеет возможность переходить к определениям и т.д.

Поскольку он написан на С++ и приклеен к Vim через Python, вам придется скомпилировать конец С++. Чтобы облегчить боль, вы можете загрузить готовый и готовый к использованию плагин YCM из моего Vim YouCompleteMe для Windows. Я построил его для архитектуры x86 и x64. Нативный компонент называется ycm_core.pyd. Как обычно, архитектура сборки Vim, которую вы выбрали, должна соответствовать структуре YCM (т.е. ycm_core.pyd). YCM может работать ТОЛЬКО с Python 2 (не 3), поэтому просто убедитесь, что у вас есть Python 2 DLL (например, python27.dll) и Pipon 2 Interpreter (python.exe) в среде PATH переменная.

Если вам нужен LLVM/Clang, вы можете скачать его и у меня: LLVM для Windows. Опять же, просто убедитесь, что у вас есть libclang.dll в переменной среды PATH (рекомендуется) ИЛИ рядом с ycm_core.pyd. И снова поддерживаются архитектуры x86 и x64, и еще раз архитектура должна соответствовать как Vim, так и YCM.

Относительно завершения:

Должен ли он волшебным образом найти, где находится STL?

Конечно, нет! Это всего лишь система автозаполнения, основанная на интерфейсе Clang. Как предполагается, чтобы узнать, какую инструментальную цепочку вы используете для компиляции кода? Вы можете использовать что угодно: Visual С++, Borland С++, GCC, MinGW, MinGW-w64, LLVM/Clang и т.д. У каждого из них есть своя стандартная библиотека и время исполнения. Таким образом, в каждом случае вам нужно будет указать все пути, которые использует ваша текущая toolchain для поиска стандарта.

Например, в случае 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',