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


43

Emacs не может конкурировать с другой IDE, если у него нет функции автозаполнения. Автозаполнение просто делает меня более эффективным программистом. Я знаю расширение Auto Complete Mode , но оно не работает с 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/issues/131#issuecomment-60008803
Гийом Папен

Связанные, для будущих читателей: github.com/Sarcasm/irony-mode/issues/140
Шон Оллред

Как соотносятся роли irony-mode и emacs-ycmd? Являются ли они альтернативами друг другу? Будет ли когда-нибудь иметь смысл использовать оба?
Праксеолит

23

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

Эти варианты:

  • Используя Иронию . Настоятельно рекомендуется, поскольку он использует Clang и прост в настройке по сравнению с другими решениями.

  • Использование встроенного парсера из Emacs. Это лучшее автозаполнение, которое вы можете получить из синтаксического анализатора Emacs, Semantic, но оно будет медленным в больших проектах, таких как ядро ​​Linux.

  • Используя company-modeпакет с company-clang. Обеспечивает точное выполнение кода для системных включаемых путей, поскольку он может автоматически получать пути от Clang, но должен выполнить некоторую настройку для локального проекта

  • Использование company-modeс company-gtags. В качестве завершения он использует базу данных тегов, сгенерированную из GNU Global. Вы можете использовать это для предоставления кода, завершенного локально для вашего проекта. Это не совсем разумно, так как он бросает вам все в сгенерированной базе данных.

  • rtagsидет дальше, предоставляя сервер для анализа в реальном времени. Но это сложно настроить по сравнению с чистым решением Elisp.


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

Хорошее дополнение к гиду Тухдо: syamajala.github.io/c-ide.html
Виктор,

9

Я имел большой успех с RTags + Company .

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

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


Я только что переключился с режима иронии на rtags. Режим иронии постоянно исчезает и перестает работать примерно через 15 минут или около того. Пока что Rtags выглядит довольно неплохо и имеет более четкую интеграцию с yasnippet.
Ненчев

6

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

Единственная проблема заключается в том, что вам нужно указать company-mode, где искать заголовочные файлы вашего проекта c / c ++.

Если вы используете cmake, вы можете позволить https://github.com/redguardtoo/cpputils-cmake выполнить настройку для вас (СОВЕТ: я являюсь автором cpputils-cmake).

ИЛИ

Решение 2: компания-режим + GNU Global

Больше нечего сказать, вам нужно создать теги с помощью инструмента GNU Global Cli, как уже упоминалось.


1

Я использовал cmake-ide для настройки rtags, flycheck, иронии и company-clang.

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

РЕДАКТИРОВАТЬ: Обратите внимание, что компания Clang предоставляет автозаполнения, которая была функция, которую вы искали. cmake-ide также может настраивать flycheck и rtags, что добавляет еще несколько IDE-подобных функций.


1
Пожалуйста, объясните, как это отвечает на вопрос, как получить автозаполнение C ++.
Дрю

@Drew company-clang предоставляет доработки
AnimatedRNG

Пожалуйста, укажите это в своем ответе. Спасибо.
Дрю

0

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

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

&&

Теги Таблицы

находить . -name "*. [chCH]" -print | Этагс -

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

M-. (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.