Ответ 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',