Як отримати інтелектуальне автоматичне завершення C ++


32

Деякі редактори (наприклад, візуальна студія у 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), де він додає в систему луоути з ладу. Мій налаштування тим часом безлад, важко витягти YCM частини ...
johannes

@yo 'Це питання досить специфічне для використання vim з C ++. Рішення для нього, ймовірно, не стосуватимуться тих, хто використовує Vim для написання Perl (і навпаки). Тож c ++ мені здається прекрасним; але, звичайно, Vi та Vim Meta - це правильне місце для обговорення цього питання.
derobert

2
@AbhinavGauniyal Це схоже на проблеми, які я бачив раніше із використанням YCM. На якій системі ви працюєте? Про OSX дивіться тут . Я не використовую MacVim, але я встановив CMake з Homebrew. Потім я cdзвернувся до каталогу плагінів YCM ( ~/.vim/bundleдля мене) і побіг ./install --clang-completer.
bsmith89

Відповіді:


28

Мені дуже подобається clang_complete для цього. Для цього потрібен кланг, і вам потрібно повідомити, де у вашій системі знаходиться libclang. Після цього це чудово працює.

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

Це те, що я отримую, коли набираю v.:кланг-повний


4
Домовились. У мене було багато проблем з YCM (включаючи згадані segfault). І навіть після години конфігурації я ніколи не працював повністю.
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 ( Link! ). Це означає, що ви можете скласти свій код нормально і попросити Кланг виплюнути всі прапори, які використовуються для компіляції, і використовувати ці прапори з YouCompleteMe. Дуже зручно, якщо ви хочете, щоб ваш інструмент автодоповнення знав про ваші макроозначення або про розташування всіх файлів заголовків у вашій системі без будь-яких зусиль, щоб ввести його вручну.


3

YouCompleteMe не так важко встановити, і він був досить стабільним для мене, я перейшов з clang_complete в YouCompleteMe років тому. Я погоджуюся з тим, що він справді роздутий величезною історією комітетів, багатьма внутрішніми залежностями та підтримкою багатьох мов, до яких ви, можливо, не піклуєтеся, але все-таки в кінцевому підсумку буде клонувати пов'язані з ним підмодулі. Ось, це проблема з YouComplemeMe, все ж .... це робить свою роботу.

Я працював над вилкою зі спеціальною метою, щоб краще підтримувати C ++, ви можете перевірити цей gif, показуючи його:

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

Він використовує нову інформацію про параметри, яку може надати Кланг, ви можете дізнатися більше про це з цієї моєї статті: http://nosubstan.me/articles/2015-01-29-better-completion-for-cpp/ .


Сьогодні я замість цього використовую coc.nvim + ccls.
pepper_chico
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.