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


43

Emacs не може конкурувати з іншим IDE, якщо він не має функції автоматичного завершення. Автозаповнення просто робить мене більш ефективним програмістом. Я знаю розширення автоматичного завершення режиму , але воно не працює з C ++.

автозаповнення

Як я можу досягти розумного та ефективного автодоповнення для C ++?


Це питання спочатку задала Малабарба щодо пропозиції 51: Як отримати інтелектуальне автоматичне завершення роботи на C ++?


1
Було б непогано трохи розширити це питання. Він має велику потенційну цінність, але зараз питання лише у назві.
Малабарба

У цей час, здається, іронія режиму - це шлях.
Севки

Відповіді:


45

Відмова: Я автор режиму іронії

компанія-іронія скріншот

Якщо ви просто хочете розумного автоматичного завершення, я можу порекомендувати режим іронії з фірмовою іронією .

  • режим іронії легко встановити завдяки MELPA
  • завершення є дуже точним і продуктивність цілком пристойними завдяки libclang
  • з іронією компанії у вас є асинхронний доповнення завершення, яке не заважатиме вам, якщо завершення займе певний час
  • компанія-іронія підтримує перевантажені функції, і якщо у вас встановлений Yasnippet, аргументи функції вставляються як заповнювачі для заповнення
  • якщо ваш проект використовує Doxygen, коротка документація кандидата на завершення відображається в мінібуфері (див. скріншот)
  • установка сервера в режимі іронії в Unix-подібній системі (Linux, OS X) повинна бути простою. З іншого боку, Windows потребує певного налаштування, але це зафіксовано у вікі

Інший інструмент, який ще не цитується, є emacs-ycmd .


2
Дуже дякую! Бажаю, я дізнався про це швидшеirony-mode
Лука

@GuillaumePapin Дякую за написання іронії! Чи трапляються у вас якісь орієнтири часу? Я помітив, що дзвінки clang_codeCompleteAtз проаналізованим TU (але незбережені зміни) займають 3-5 секунд. Чи irony-modeшвидше це?
Прадхан

1
Іронія використовує libclang / clang_codeCompleteAt, тож вам не піде кращих часів. 3-5 секунд може бути занадто багато, залежно від контексту (наприклад, завершення в глобальних масштабах займає набагато більше часу, ніж інші області). Ви можете поглянути на деякі таймінги, які я зробив нещодавно: github.com/Sarcasm/irony-mode/isissue/131#issuecomment-60008803
Гійом Папін

Пов’язано, для майбутніх читачів: github.com/Sarcasm/irony-mode/isissue/140
Шон Олред

Як порівнюються ролі режиму іронії та emacs-ycmd? Чи є вони альтернативами один одному? Чи було б колись сенсом використовувати обидва?
Праксеоліт

23

Перевірте мій путівник . У ньому перелічено кілька методів автоматичного заповнення в C / C ++.

Ці варіанти:

  • Використання іронії . Настійно рекомендується, оскільки він використовує Clang і простий у налаштуванні порівняно з іншими рішеннями.

  • Використання вбудованого аналізатора від Emacs. Це найкраще автоматичне завершення, яке ви можете отримати, з Eser-синтаксичного аналізатора, Semantic, але це буде повільно на великих проектах, таких як ядро ​​Linux.

  • Використання company-modeпакету з company-clang. Забезпечує штраф заповнення коду для системних шляхів, оскільки він може автоматично отримувати шляхи від Clang, але повинен виконати певну конфігурацію для локального проекту

  • Використання company-modeс company-gtags. Для завершення використовується база даних тегів, створена з GNU Global. Ви можете використовувати цей код для надання локального коду для вашого проекту. Це не зовсім розумно, оскільки він перекидає все всередині створеної бази даних вам.

  • rtagsйде далі, надаючи сервер для живого аналізу. Але налаштування порівняно з чистим рішенням Elisp складно.


Я не погодився б, що налаштування rtags складніше, ніж чисте рішення emacs lisp. Чисте рішення Emacs lisp зазвичай не враховує файли cmake / build та навряд чи може знайти будь-який заголовок. Rtags досить легко встановити порівняно. Він просто ще трохи молодий, як проект, з не дуже хорошим тестовим покриттям.
baol

Приємне доповнення до путівника Тудо
Віктор

9

Я мав великий успіх у компанії RTags + Company .

RTags потребує окремого rdmзапущеного демона, який використовує кланг для завершення коду, навігації кодом та рефакторингу. rdmтакож функціонує як база даних символів, що означає, що автодоповнення відбувається набагато швидше, ніж будь-яке рішення, яке безпосередньо викликає clang_codeCompleteAt.

Rdm потрібна інформація про прапори компіляції для ваших проектів , які можуть бути клопоти, але якщо ви будете слідувати порадам з RTags сторінки і символічні посилання gcc-rtags-wrapper.shна gcc, g++, ccі c++RDM автоматично оновлюється з новими прапорами компіляції на перекомпіляції.


Я просто перейшов з режиму іронії на rtags. Іронічний режим постійно вибивається і припиняє роботу приблизно через 15 хвилин. На сьогоднішній день Rtags виглядає досить непогано і має більш чисту інтеграцію з yasnippet.
ненчев

6

Рішення 1: компанія-режим + клакс

Єдине питання - вам потрібно сказати в режимі компанії, де шукати файли заголовків c / c ++ вашого проекту.

Якщо ви використовуєте cmake, ви можете дозволити https://github.com/redguardtoo/cpputils-cmake зробити налаштування для вас (Підказка: я автор cpputils-cmake).

АБО

Рішення 2: компанія-режим + gnu global

Більше нічого говорити, вам потрібно створити теги за допомогою інструмента глобального клі, gnu, як згадували інші.


1

Я використовував cmake-ide для налаштування rtags, flycheck, irony та company-clang.

Тепер ви можете одночасно налаштувати вашу систему побудови та улюблені плагіни emacs для статичного аналізу!

EDIT: Зауважте, що компанія clang забезпечує автодоповнення, що було функцією, яку ви шукали. cmake-ide також може налаштувати флеш-чек і rtags, що додає ще кілька функцій, схожих на IDE.


1
Поясніть, будь ласка, як це відповідає на питання, як отримати автодоповнення C ++.
Дрю

@Drew company-clang пропонує комплектування
AnimatedRNG

Будь ласка, вкажіть це у своїй відповіді. Дякую.
Дрю

0

Mx семантичний режим

www.gnu.org/software/emacs/manual/html_node/semantic/Using-Semantic.html#Using-Semantic

&&

Теги таблиці

знайти. -ім'я "*. [chCH]" -принт | етаги -

www.gnu.org/software/emacs/manual/html_node/emacs/Tags.html

etags , ctags - генеруйте файл тегів для Emacs, vi

manpages.debian.org/cgi-bin/man.cgi?query=etags&apropos=0&sektion=0&manpath=Debian+8+jessie&format=html&locale=en

Точка завершення CMi (або M-TAB) . Якщо увімкнено семантичний режим, спробуйте використовувати дані семантичного аналізатора. Якщо семантичний режим вимкнено або не вдається, намагається завершити використання таблиці вибраних тегів (див. Теги)

http://www.gnu.org/software/emacs/manual/html_node/emacs/Symbol-Completion.html#index-C_002dM_002di

М-. (find-tag) запрошує ім'я тегу && перейти до визначення

http://www.gnu.org/software/emacs/manual/html_node/emacs/Find-Tag.html#index-M_002d_002e

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