Как получить интеллектуальное автозаполнение C ++

32

Некоторые редакторы (например, Visual Studio на Windows) делают автозавершение C ++, которое понимает C ++. Например, учитывая:

#include <vector>

int main(void) {
  std::vector<int> v;
  v.i

В визуальной студии автозаполнение знает единственный метод, std::vector<int>который начинается с i insert.

Возможно ли получить такое автозаполнение в vim?

Крис Джефферсон
источник
3
Плагин YouCompleteMe может узнать условия для автозаполнения, и может понять C языков семьи.
alxndr
@alxndr Документация была довольно запутанной для меня - в случае установки с vundle. И как только я начал с этим, сервер YCM потерпел крах!
Абхинав Гауниал,
YCM работает для меня относительно хорошо, если только у меня нет шаблонных тяжелых файлов (boost.geo), где он добавляет в систему loooots laod. В то же время мои настройки беспорядок, трудно извлечь части YCM ...
Йоханнес
@yo 'Этот вопрос довольно специфичен для использования vim с C ++. Решения для этого, вероятно, не подойдут тем, кто использует Vim для написания Perl (и наоборот). Так что с ++ мне кажется нормальным; но, конечно, Ви и Вим Мета - подходящее место для обсуждения этого.
Дероберт
2
@AbhinavGauniyal Это похоже на проблемы, с которыми я сталкивался при использовании YCM. На какой ты системе? Для OSX смотрите здесь . Я не использую MacVim, но я установил CMake с Homebrew. Затем я cdперешел в каталог плагинов YCM ( ~/.vim/bundleдля меня) и побежал ./install --clang-completer.
bsmith89

Ответы:

28

Мне действительно нравится clang_complete для этого. Для этого требуется clang, и вы должны указать ему, где находится libclang в вашей системе. После этого все работает чудесно.

Люди могут предложить YouCompleteMe, но, честно говоря, этот плагин сильно раздут для того, что он говорит, и требует слишком много шагов для установки. У меня также был Segfault Vim несколько раз. Я не мог быть счастливее с clang_complete.

Вот что я получаю, когда набираю v.:лязг-полной

Акшай
источник
4
Согласовано. У меня было много проблем с YCM (включая упомянутые ошибки). И даже после нескольких часов настройки у меня никогда не было полной работы.
CharlesL
1
Я много раз терпел крах сервера YCM, ожидая clang_complete, вот соответствующая информация для других пользователей: github.com/Rip-Rip/clang_complete/blob/master/doc/…
Abhinav Gauniyal
1
У меня было наоборот. YCM работал нормально (даже если это была PITA для установки), но полный
ляп
Можете ли вы скрыть все это, чтобы увидеть код на несколько строк ниже?
Мэтт C
@ MatthewCliatt, что скрывать? Всплывающее меню? Там нет ничего особенного в коде. Это просто return 0под этим всплывающим меню.
Акшай
8

Плагин YouCompleteMe ( Link ) отлично работает для меня. Он использует libclang для генерации функции автозаполнения, обеспечивающей точное завершение.

Он имеет много настроек, особенно при работе с флагами компиляции. Вы можете редактировать «генератор флагов», редактируя скрипт Python для каждого проекта ( пример ). Но для меня главным преимуществом является то, что он поддерживает Clang Compilation Database ( Ссылка! ). Это означает, что вы можете нормально скомпилировать свой код и попросить clang указать все флаги, которые он использовал для компиляции, и использовать эти флаги с YouCompleteMe. Это очень удобно, если вы хотите, чтобы ваш инструмент автозаполнения знал о ваших определениях макросов или о расположении всех файлов заголовков в вашей системе без необходимости набирать его вручную.

Аллан Хасегава
источник
3

YouCompleteMe не так сложно установить, и он был достаточно стабильным для меня, я перешел с clang_complete на YouCompleteMe несколько лет назад. Я согласен с одной вещью: он действительно раздут с огромной историей коммитов, множеством внутренних зависимостей и поддержкой многих языков, которые могут вас не волновать, но все равно в конечном итоге будут клонированы связанные с ними подмодули. Это проблема с YouComplemeMe, все же ... она работает.

Я работал над форком со специальной целью, чтобы лучше поддерживать C ++, вы можете посмотреть этот gif:

https://s3.amazonaws.com/f.cl.ly/items/1e2F0A123h331c1G0L0R/SadBart.gif

Он использует новую информацию о параметрах, которую может предоставить Clang, вы можете узнать больше об этом из моей моей статьи: http://nosubstance.me/articles/2015-01-29-better-completion-for-cpp/ .

pepper_chico
источник
Сегодня я использую coc.nvim + ccls вместо этого.
pepper_chico