Плагины семантического автозаполнения семейства 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, которую я использую, но нет четкой инструкции о том, что делать. Кто-нибудь может здесь помочь?

ОБНОВИТЬ

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

  1. Взял Vim YouCompleteMe для Windows
  2. Взял LLVM для Windows
  3. Взял из него файл liclang.dll и воткнул его в каталог python YCM
  4. Взял .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',
Другие вопросы по тегам