Использование Emacs в качестве полнофункциональной C / C ++ IDE

50

Уже более года я пытаюсь использовать Emacs в качестве C / C ++ IDE. До сих пор я добился лишь незначительного успеха, но по пути наткнулся на несколько кирпичных стен. В настоящее время я пытаюсь использовать CEDET, но мне трудно понять, как эффективно его использовать.

Функции, которые я ищу в IDE, следующие:

  1. Управление программным обеспечением «Проекты». Я хочу, чтобы моя среда разработки имела представление обо всех файлах, составляющих мой текущий проект, чтобы я мог выполнять такие функции, как поиск и замена в моем проекте. (Было бы неплохо, если бы я мог достичь этого, не засоряя дерево исходных текстов большим количеством вспомогательных файлов. Почему мне нужно более одного централизованного файла проекта на проект?)
  2. Возможность построить текущий проект из среды IDE, независимо от того, какой буфер я сейчас посещаю. Мне нужно иметь возможность связать ключ, который будет строить текущий проект.
  3. Отчет об ошибках. Я не хочу читать более 500 строк, чтобы найти ошибки, о которых сообщили инструменты сборки. Предпочтительно ошибки отображаются в собственном буфере с одной строкой на ошибку.
  4. Осведомленность о символах в рамках проекта и о том, где они определены. Я хочу перейти к определению символа, находится ли он в моих файлах проекта или в системных включаемых файлах.
  5. Визуальная отладка. Я хочу иметь список отслеживания локальных переменных, которые обновляются автоматически при выполнении кода. Я хочу иметь возможность устанавливать точки останова в коде, чтобы увидеть, какая строка кода будет выполняться дальше.

Я знаю, что каждая из этих функций существует, потому что у меня была каждая из них, работающая в то или иное время с использованием EDE, Semantic, GDB и т. Д. Проблема в том, что мне никогда не удавалось работать со всеми этими функциями одновременно потому что каждый компонент обычно должен быть настроен сам по себе, и обычно слишком много работы, чтобы выяснить, как настроить их все сразу и заставить их работать вместе.

Какие существуют решения для превращения Emacs в полнофункциональную среду разработки C / C ++? Вы всегда должны настраивать все по частям, или есть способ настроить все функции одновременно?

РЕДАКТИРОВАТЬ: хороший ответ на этот вопрос не обязательно должен точно соответствовать всем пяти из указанных критериев. Я просто предоставил список, чтобы дать более конкретное представление о типе функций, которые я хочу увидеть, прежде чем я буду считать IDE «полнофункциональным». Вполне возможно, что CEDET мог бы соответствовать всем требованиям, но мне еще предстоит найти рабочее пошаговое руководство по его настройке с нуля.

nispio
источник
6
Этот вопрос может быть лучше разделить на несколько. Вы можете получить несколько частичных ответов, где ни один из пунктов не получит того внимания, которого они заслуживают.
Малабарба
2
Кроме того, элемент 1 может быть дубликатом emacs.stackexchange.com/questions/448/…
Малабарба,
6
@Malabarba: Если бы я задавал пять отдельных вопросов, это мог бы быть дубликат. Весь смысл этого вопроса в том, что может быть пять разных пакетов, которые достигают пяти разных целей, но настроить все пять для приятной игры друг с другом кажется почти невозможным. Если ответ возвращается как «Emacs не может функционировать как полнофункциональная IDE, потому что для конфигурирования требуется немало времени». Так тому и быть.
Ниспио
4
Каждый из пунктов может быть своим собственным вопросом (потенциально дублированным), объединение их всех в один вопрос может иногда приводить к разным ответам из-за взаимодействия пакетов.
Джонатан Лич-Пепин
Связанный: emacs.stackexchange.com/q/3359/2264
Шон Оллред

Ответы:

27

Для разных языков существуют разные уровни «IDE-сущности», и, к сожалению, вы никогда не получите полнофункциональные возможности IDE без какой-либо настройки (если вам не нравится конфигурирование, вам, вероятно, не следует использовать Emacs). CEDET стремится быть законченным решением, которое покрывает все ваши потребности в поддерживаемых языках, но лично я никогда не работал должным образом; вместо этого я использую несколько пакетов в тандеме для покрытия моих баз IDE. Я расскажу о ваших пунктах по порядку и предложу несколько решений для разных языков:

  1. projectile является наиболее близким пакетом для обеспечения реального IDE-подобного опыта. Он предоставляет массу полезных функций для каждого проекта. Вы, вероятно, также захотите какое-то управление окнами / рабочим пространством; Я использую свое собственное решение под названием wacspace , но другие хорошие решения включают перспективу , рабочие группы и elscreen .
  2. Разные языки имеют разные представления о том, что такое «сборка», но M-x compileмогут вместить практически все, что упрощает разбивку по ошибкам (просто используйте next-error). Вы можете легко настроить индивидуально для каждого проекта, используя переменные каталога для установки compile-command. Вы можете запустить compileс помощью снаряда, используя projectile-compile-project( C-c p c).
  3. M-x compileТакже вы рассмотрели здесь - ошибки обычно заканчиваются по одному на строку в *compilation*буфере, с легкой подкачкой next-error.
  4. Переход к символу подразумевает «понимание вашего кода», и здесь поддержка значительно варьируется в зависимости от языка. Для Elisp вы можете использовать превосходную elisp-slime-nav , а затем M-.перейти к определению. Вот некоторые пакеты, которые предоставляют аналогичную поддержку для других языков: CIDER (для Clojure); SLIME (для Common Lisp); халат (для Руби); семантические или clang-теги для C / C ++ (отказ от ответственности: я никогда не использовал ни одного, поэтому я не знаю, хорошо ли они работают). Если ничего не помогает, вы также можете использовать встроенные в Emacs средства TAGS, используя что-то вроде обильных ctags , но я никогда не достигал приемлемых результатов с TAGS.
  5. В Emacs очень разбросана поддержка отладчиков. GDB с GUD - ваш лучший выбор для языков, подобных C; в противном случае, это в значительной степени полностью на основе языка. (Я не думаю, что визуальная отладка на нескольких языках действительно является реалистичной целью.)
shosti
источник
4
В качестве бокового узла projectileможно интегрировать напрямую с perspectiveсозданием perspective-per-projectавтоматически включенного проекта.
Джонатан Лич-Пепин
Я бы добавил примечания semanticк # 4, семантика - отличный пакет, он понимает ваш код и может сделать много полезного с этой информацией.
Джордон Биондо
Я никогда не использовал semantic, и я помню, что он имеет неполную поддержку C ++, но я добавил это к ответу.
Шости
15

Я использовал это руководство, чтобы начать использовать Emacs в качестве C ++ IDE. Он представляет Хелм и Снаряд, который поможет ответить на ряд ваших вопросов. Для остроумия,

  1. Снаряд управляет проектами. Он ищет в дереве каталогов файлы Makefile, SConstruct, Git repo, SVN repo и, возможно, некоторые другие файлы системы сборки или контроля версий, чтобы автоматически узнать, какие файлы связаны с текущим проектом. Например, C-c p hзапуски, helm-projectileиспользующие Helm для поиска файла в текущем проекте.

  2. Снаряд может строить ваши проекты. C-c p cзапускает, projectile-compile-projectкоторый пытается запустить Make / SCons / CMake на основе доступных файлов. Мне никогда не приходилось настраивать это; он всегда знал, что делать.

  3. Ошибки появляются в их собственном буфере, когда вы запускаете, projectile-compile-projectно я не уверен, что это так красиво, как хотелось бы.

  4. Вы можете использовать пакет, helm-gtagsкоторый взаимодействует с gtagsпрограммой (который вы должны иметь в своей системе). Обратите внимание, что gtags является проектом GNU и поэтому вряд ли будет работать сразу в Windows.

    После настройки Helm узнает о символах в проекте и может переходить к определениям и использовать местоположения. Например, helm-gtags-dwimможно перейти к любому использованию переменной или функции, и при запуске на заголовочный файл открывает этот заголовочный файл.

  5. Я еще не пробовал это.

Перечисленное руководство дает очень подробную информацию о конфигурации, как начать работу.

Патрик Стил
источник
Я тоже наткнулся на это руководство и применил его. ИМХО, это как-то тяжеловесно и слишком сильно меняет базовое взаимодействие с emacs. Я отключил ряд настроек, связанных с рулем, потому что они мешали обычным сочетаниям клавиш (например, легко открывать текущий каталог в буфере или открывать файл в подпрограмме sub с помощью нескольких нажатий клавиш). Стоит посмотреть, хотя, но, вероятно, следует попробовать шаг за шагом, а не в целом.
Стефан Гурихон
9

Поскольку вы сейчас запрашиваете полнофункциональную IDE C / C ++, я могу быть квалифицированным.

Я использовал все MS IDE от vc4 до Visual Studio 2010, поэтому я полностью понимаю, что вы хотите.

Хорошей новостью является то, что Emacs может быть на 95% лучше Visual Studio, и он может сделать гораздо больше. но вы можете быть не заинтересованы в "более" части. Поэтому я сосредоточусь только на ваших вопросах.

Теперь ключевой момент, вы ДОЛЖНЫ ИСПОЛЬЗОВАТЬ CMake , даже ваше приложение C ++ предназначено только для Windows! Конец истории. Другого выбора нет, я знаю о чем говорю. Если вы не используете CMake, продолжать бессмысленно.

Ответ на вопрос 1 : Вам не нужно ничего настраивать, установите cpputils-cmake ( https://github.com/redguardtoo/cpputils-cmake ), который устанавливает другие плагины. Это даже удобнее, чем Visual Studio. Так что для каждого проекта настройка не требуется. Для поиска и замены я комбинирую мощь bash / perl / git и percol ( https://github.com/mooz/percol ), что намного лучше, чем в любой IDE. проверьте мой блог ( http://blog.binchen.org/categories/emacs.html ) и мой ~ / .bashrc ( https://gist.github.com/redguardtoo/01868d7a13817c9845e8#file-bashrc ). Например, я могу искать заменить файлы в определенном коммите.

Ответ на вопрос 2 : он уже настроен cpputils-cmake, вам просто нужно, M-x compileкак обычно.

Ответ на вопрос 3 : так же, как вопрос 2. Я не знаю, почему это проблема. это то же самое поведение, что и VS, с лучшими привязками клавиш.

Ответ на вопрос 4 : сейчас большинство людей просто используют Gnu Global, который можно комбинировать с cpputils-cmake. Я понимаю, что реальная проблема заключается в автоматическом обнаружении каталогов, содержащих все включенные заголовки C ++ . Это можно сделать с помощью cpputils-cmake, все остальное легко. Пожалуйста, man globalв оболочке и прочитайте руководство по поводу переменной среды GTAGSLIBPATH. Есть много плагинов для обеспечения хорошего UX на основе Global для навигации по коду, я рекомендую ggtags.el

Ответ на вопрос 5 : визуальная отладка, многие рекомендовали M-x gdb-many-window, я пробовал, но это не сработало. Это просто потому, что моя версия GDB устарела (подсказка, я использую OSX 10.7.3) и мне лень обновлять мою ОС. Но GUD в порядке. Я создаю некоторый короткий ключ для печати переменной для меня в окне редактора. все отладочные материалы можно использовать. Он не имеет таблицы UX, как VS. но если честно с тобой. Отладчик UX от Microsoft также не самый лучший в мире. Лучший удобный отладчик - DDD ( http://www.gnu.org/software/ddd/). Гуд и В.С. сосут по этому вопросу. В эти дни я просто вставляю код регистрации с yasnippet, который является другим плагином Emacs. Чтобы уточнить, я знаю все продвинутые приемы о точках останова, просто потому, что мне лень применять эти приемы. Вставка кода регистрации в Emacs намного проще.

В IDE есть еще много вещей: завершение кода? используйте режим компании, нет необходимости в настройке. проверка синтаксиса в реальном времени? используйте cpputils-cmake, затем(flymake-mode 1)

Лучше всего, что вам нужно меньше настраивать, чем VS, если вы используете мою настройку по адресу ( https://github.com/redguardtoo/emacs.d ). Эта установка имеет заголовок «Настройка emacs purcell плюс поддержка C / C ++» .

Теперь я должен подчеркнуть кое-что: Emacs дает вам полную свободу . Вы можете выбрать любой способ начать. трудный путь или легкий путь.

Самый простой способ - просто скопировать мои настройки (или чьи-либо настройки на github, сначала посчитайте звезды), через 5 минут у вас будет полнофункциональная C ++ IDE. VS не закончил запуск в эти 5 минут.

Сложный способ настройки с нуля. Если вы выбираете трудный путь, то не жалуйтесь на Emacs . Это твой выбор.

Кстати, в конечном счете, знание Emacs Lisp может оказаться полезным. Я думаю, что для профессионального разработчика на C ++ это тривиально по сравнению с тем временем, которое я потратил на MS sh * t. Много лет назад MS молча обновила свою среду выполнения VC в некоторых обновлениях Windows. Благодаря этому мой продукт работал нормально на компьютерах компании, но зависал на компьютерах клиентов .

После этого случая я начал понимать Ричарда Столлмана.

чен бен
источник
1
Интересно. «Вы ДОЛЖНЫ ИСПОЛЬЗОВАТЬ CMake» -> Итак, вы говорите, что при работе со случайным бесплатным программным пакетом, который использует autoconf или персональный скрипт, нужно написать оболочку CMakeLists.txt?
Стефан Гурихон
1
Вместо этого вы можете использовать GNU Global, не такой совершенный, как решение cmake. Но более гибко, см. Blog.binchen.org/posts/emacs-as-c-ide-easy-way.html
chen bin
5

Для # 4 я настоятельно рекомендую exuberant-ctags и поддержку встроенных тегов, которые я использовал годами. В качестве альтернативы, я только недавно перешел на использование GNU Global и пакета ggtags и обнаружил, что они немного лучше; хотя они функционируют почти одинаково. Оба работают практически без конфигурации. Для других функций IDE мне также нравится пакет автозаполнения. Аналогично, я M-x compileшироко использую и привязываю глобальные ключи к следующей и предыдущей ошибке. Для поиска внутри «проектов» я вообще просто пользуюсь M-x find-grep. Обратите внимание, что он будет использовать те же привязки клавиш для следующей и предыдущей ошибки.

b4hand
источник
4

Управление программным обеспечением «Проекты». Я хочу, чтобы моя среда разработки имела представление обо всех файлах, составляющих мой текущий проект, чтобы я мог выполнять такие функции, как поиск и замена в моем проекте. (Было бы неплохо, если бы я мог достичь этого, не засоряя дерево исходных текстов большим количеством вспомогательных файлов. Почему мне нужно более одного централизованного файла проекта на проект?)

Снаряд кажется лучшим вариантом для управления проектами в emacs. Это очень легкий, вам не нужно добавлять какие-либо дополнительные файлы в ваш проект. Он попытается автоматически определить проекты для вас на основе наличия определенных специальных файлов. Например - если вы работаете в git-репо, projectile будет рассматривать его как проект (любые файлы, отслеживаемые git, будут обрабатываться как часть проекта), тогда вы сможете использовать такие команды, как projectile-find-fileоткрыть любой файл проекта. У него есть куча других команд, которые работают на основе проекта.

Отчет об ошибках. Я не хочу читать более 500 строк, чтобы найти ошибки, о которых сообщили инструменты сборки. Предпочтительно ошибки отображаются в собственном буфере с одной строкой на ошибку.

Flycheck поддерживает проверку синтаксиса с использованием clang / gcc.

Осведомленность о символах в рамках проекта и о том, где они определены. Я хочу перейти к определению символа, находится ли он в файлах моего проекта или в системных включаемых файлах.

Я бы порекомендовал вам взглянуть на rtags . Он использует Clang в качестве бэкэнда и довольно неплохую работу по переходу к определению и завершению. Он также может помочь вам с № 3, поскольку он также интегрируется с flymake для отображения ошибок и предупреждений с помощью clang. Кроме того, он имеет ограниченную поддержку рефакторинга. Другой вариант для интеллектуального автозаполнения - режим иронии

Икбал Ансари
источник
2

Версия CEDET, поставляемая в настоящее время с Emacs, сложна в настройке, но ту, которую вы можете получить на официальном сайте , легче настроить, и она может удовлетворить ваши потребности № 2 и № 4.

EDE CEDET позволяет вам управлять, например, make-файлом и автоматизировать проекты, добавлять цели в них и связывать файлы с целями. Затем вы можете скомпилировать свой проект с помощью команд EDE. Поскольку он использует встроенный режим компиляции Emacs, ваша потребность №3 также удовлетворена.

В CEDET Semantic есть парсеры для нескольких языков, включая C ++. Он может извлекать теги, определенные в файле, такие как exuberant-ctags и GNU Global, но он также имеет точные функции автозаполнения и перехода. Если у вас есть два метода, называемых «foo», переход Semantic достаточно умен, чтобы найти правильный путь.

Для # 1 я лично использую снаряд , и несколько раз назад я успешно использовал GDB для # 5.

Подсказка для # 3: Если EDE для вас излишен, Emacs имеет команду M-x recompileдля запуска вашей последней команды компиляции, так что вы можете запустить компиляцию один раз, а затем использовать ее recompileв любом буфере.

Стивен Ремо
источник
1

Для # 4, кажется, новый проект под названием YouCompleteme , и соответствующий клиент Emacs, который, кажется, следующая классная вещь. Поскольку он использует clang, он лучше видит код, чем теги или глобальные.

rlazo
источник
1
Спасибо за предложение, но так как я ищу вещи, которые хорошо интегрируются вместе, я не уверен, что попытка получить одну из функций с помощью плагина Vim с прототипом клиента Emacs - лучшая отправная точка.
Nispio
3
Вместо этого попробуйте github.com/abingham/emacs-ycmd для клиента emacs (обратите внимание, что он использует github.com/Valloric/ycmd , а не github.com/Valloric/YouCompleteMe ). Он работает в режиме компании (рекомендуется другими ответами здесь), поэтому он хорошо интегрируется с остальной частью Emacs. Вы можете установить ycmd и company-ycmd из MELPA ( мой конфигурационный файл - sprunge.us/LXGY ); и следуйте инструкциям по сборке для ycmd. Единственная проблема в том , нужно поставить свои флаги компиляции в файл , как github.com/Valloric/ycmd/blob/master/examples/...
unhammer
1

Я был счастлив с CEDET от его исходного репо + ECB + gtags + cscope. Тем не менее, есть много предложений на этот пост, которые я буду пытаться.

Глина Хаапала
источник
1
Не могли бы вы рассказать, что вам нужно было сделать, чтобы все эти инструменты работали вместе?
Nispio
4
Прямо сейчас это выглядит как неуместный комментарий. :-) Если вы хотите сделать добро, пожалуйста, уточните немного.
Малабарба
Извините за краткость. StackExchange App принимает купол, чтобы привыкнуть к. Это решение отвечает на вопрос № 4, касающийся символьной навигации и анализа источника. CEDET, конечно, содержит семантику. ECB - это Emacs Code Browser, который использует CEDET для перечисления методов и представления информации о символах. Gtags и Cscope создают таблицы символьной информации из исходной базы (это также делает helm) и интегрируются с Emacs для обеспечения навигации по тегам или символам.
Глина Хаапала
1

Как уже упоминалось выше, снаряд (опционально с рулем) является отличным решением для управления проектами.

Ycmd отлично подходит для дополнения кода и некоторой навигации, и лучшим клиентом для него является emacs-ycmd (полное описание: я написал клиент emacs.)

Для «тегов» и индексации лучшее общее решение, которое я нашел, - это поиск кода (более подробное описание: я тоже написал это). Это довольно глупо, потому что на самом деле просто выполняет поиск по регулярным выражениям, но это невероятно быстро и, как правило, все, что вам нужно и он хорошо работает на нескольких языках.

abingham
источник