Уже более года я пытаюсь использовать Emacs в качестве C / C ++ IDE. До сих пор я добился лишь незначительного успеха, но по пути наткнулся на несколько кирпичных стен. В настоящее время я пытаюсь использовать CEDET, но мне трудно понять, как эффективно его использовать.
Функции, которые я ищу в IDE, следующие:
- Управление программным обеспечением «Проекты». Я хочу, чтобы моя среда разработки имела представление обо всех файлах, составляющих мой текущий проект, чтобы я мог выполнять такие функции, как поиск и замена в моем проекте. (Было бы неплохо, если бы я мог достичь этого, не засоряя дерево исходных текстов большим количеством вспомогательных файлов. Почему мне нужно более одного централизованного файла проекта на проект?)
- Возможность построить текущий проект из среды IDE, независимо от того, какой буфер я сейчас посещаю. Мне нужно иметь возможность связать ключ, который будет строить текущий проект.
- Отчет об ошибках. Я не хочу читать более 500 строк, чтобы найти ошибки, о которых сообщили инструменты сборки. Предпочтительно ошибки отображаются в собственном буфере с одной строкой на ошибку.
- Осведомленность о символах в рамках проекта и о том, где они определены. Я хочу перейти к определению символа, находится ли он в моих файлах проекта или в системных включаемых файлах.
- Визуальная отладка. Я хочу иметь список отслеживания локальных переменных, которые обновляются автоматически при выполнении кода. Я хочу иметь возможность устанавливать точки останова в коде, чтобы увидеть, какая строка кода будет выполняться дальше.
Я знаю, что каждая из этих функций существует, потому что у меня была каждая из них, работающая в то или иное время с использованием EDE, Semantic, GDB и т. Д. Проблема в том, что мне никогда не удавалось работать со всеми этими функциями одновременно потому что каждый компонент обычно должен быть настроен сам по себе, и обычно слишком много работы, чтобы выяснить, как настроить их все сразу и заставить их работать вместе.
Какие существуют решения для превращения Emacs в полнофункциональную среду разработки C / C ++? Вы всегда должны настраивать все по частям, или есть способ настроить все функции одновременно?
РЕДАКТИРОВАТЬ: хороший ответ на этот вопрос не обязательно должен точно соответствовать всем пяти из указанных критериев. Я просто предоставил список, чтобы дать более конкретное представление о типе функций, которые я хочу увидеть, прежде чем я буду считать IDE «полнофункциональным». Вполне возможно, что CEDET мог бы соответствовать всем требованиям, но мне еще предстоит найти рабочее пошаговое руководство по его настройке с нуля.
Ответы:
Для разных языков существуют разные уровни «IDE-сущности», и, к сожалению, вы никогда не получите полнофункциональные возможности IDE без какой-либо настройки (если вам не нравится конфигурирование, вам, вероятно, не следует использовать Emacs). CEDET стремится быть законченным решением, которое покрывает все ваши потребности в поддерживаемых языках, но лично я никогда не работал должным образом; вместо этого я использую несколько пакетов в тандеме для покрытия моих баз IDE. Я расскажу о ваших пунктах по порядку и предложу несколько решений для разных языков:
M-x compile
могут вместить практически все, что упрощает разбивку по ошибкам (просто используйтеnext-error
). Вы можете легко настроить индивидуально для каждого проекта, используя переменные каталога для установкиcompile-command
. Вы можете запуститьcompile
с помощью снаряда, используяprojectile-compile-project
(C-c p c
).M-x compile
Также вы рассмотрели здесь - ошибки обычно заканчиваются по одному на строку в*compilation*
буфере, с легкой подкачкойnext-error
.M-.
перейти к определению. Вот некоторые пакеты, которые предоставляют аналогичную поддержку для других языков: CIDER (для Clojure); SLIME (для Common Lisp); халат (для Руби); семантические или clang-теги для C / C ++ (отказ от ответственности: я никогда не использовал ни одного, поэтому я не знаю, хорошо ли они работают). Если ничего не помогает, вы также можете использовать встроенные в Emacs средства TAGS, используя что-то вроде обильных ctags , но я никогда не достигал приемлемых результатов с TAGS.источник
projectile
можно интегрировать напрямую сperspective
созданиемperspective-per-project
автоматически включенного проекта.semantic
к # 4, семантика - отличный пакет, он понимает ваш код и может сделать много полезного с этой информацией.semantic
, и я помню, что он имеет неполную поддержку C ++, но я добавил это к ответу.Я использовал это руководство, чтобы начать использовать Emacs в качестве C ++ IDE. Он представляет Хелм и Снаряд, который поможет ответить на ряд ваших вопросов. Для остроумия,
Снаряд управляет проектами. Он ищет в дереве каталогов файлы Makefile, SConstruct, Git repo, SVN repo и, возможно, некоторые другие файлы системы сборки или контроля версий, чтобы автоматически узнать, какие файлы связаны с текущим проектом. Например,
C-c p h
запуски,helm-projectile
использующие Helm для поиска файла в текущем проекте.Снаряд может строить ваши проекты.
C-c p c
запускает,projectile-compile-project
который пытается запустить Make / SCons / CMake на основе доступных файлов. Мне никогда не приходилось настраивать это; он всегда знал, что делать.Ошибки появляются в их собственном буфере, когда вы запускаете,
projectile-compile-project
но я не уверен, что это так красиво, как хотелось бы.Вы можете использовать пакет,
helm-gtags
который взаимодействует сgtags
программой (который вы должны иметь в своей системе). Обратите внимание, что gtags является проектом GNU и поэтому вряд ли будет работать сразу в Windows.После настройки Helm узнает о символах в проекте и может переходить к определениям и использовать местоположения. Например,
helm-gtags-dwim
можно перейти к любому использованию переменной или функции, и при запуске на заголовочный файл открывает этот заголовочный файл.Я еще не пробовал это.
Перечисленное руководство дает очень подробную информацию о конфигурации, как начать работу.
источник
Поскольку вы сейчас запрашиваете полнофункциональную 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. Благодаря этому мой продукт работал нормально на компьютерах компании, но зависал на компьютерах клиентов .
После этого случая я начал понимать Ричарда Столлмана.
источник
CMakeLists.txt
?Для # 4 я настоятельно рекомендую exuberant-ctags и поддержку встроенных тегов, которые я использовал годами. В качестве альтернативы, я только недавно перешел на использование GNU Global и пакета ggtags и обнаружил, что они немного лучше; хотя они функционируют почти одинаково. Оба работают практически без конфигурации. Для других функций IDE мне также нравится пакет автозаполнения. Аналогично, я
M-x compile
широко использую и привязываю глобальные ключи к следующей и предыдущей ошибке. Для поиска внутри «проектов» я вообще просто пользуюсьM-x find-grep
. Обратите внимание, что он будет использовать те же привязки клавиш для следующей и предыдущей ошибки.источник
Снаряд кажется лучшим вариантом для управления проектами в emacs. Это очень легкий, вам не нужно добавлять какие-либо дополнительные файлы в ваш проект. Он попытается автоматически определить проекты для вас на основе наличия определенных специальных файлов. Например - если вы работаете в git-репо, projectile будет рассматривать его как проект (любые файлы, отслеживаемые git, будут обрабатываться как часть проекта), тогда вы сможете использовать такие команды, как
projectile-find-file
открыть любой файл проекта. У него есть куча других команд, которые работают на основе проекта.Flycheck поддерживает проверку синтаксиса с использованием clang / gcc.
Я бы порекомендовал вам взглянуть на rtags . Он использует Clang в качестве бэкэнда и довольно неплохую работу по переходу к определению и завершению. Он также может помочь вам с № 3, поскольку он также интегрируется с flymake для отображения ошибок и предупреждений с помощью clang. Кроме того, он имеет ограниченную поддержку рефакторинга. Другой вариант для интеллектуального автозаполнения - режим иронии
источник
Версия 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
в любом буфере.источник
Для # 4, кажется, новый проект под названием YouCompleteme , и соответствующий клиент Emacs, который, кажется, следующая классная вещь. Поскольку он использует clang, он лучше видит код, чем теги или глобальные.
источник
Я был счастлив с CEDET от его исходного репо + ECB + gtags + cscope. Тем не менее, есть много предложений на этот пост, которые я буду пытаться.
источник
Как уже упоминалось выше, снаряд (опционально с рулем) является отличным решением для управления проектами.
Ycmd отлично подходит для дополнения кода и некоторой навигации, и лучшим клиентом для него является emacs-ycmd (полное описание: я написал клиент emacs.)
Для «тегов» и индексации лучшее общее решение, которое я нашел, - это поиск кода (более подробное описание: я тоже написал это). Это довольно глупо, потому что на самом деле просто выполняет поиск по регулярным выражениям, но это невероятно быстро и, как правило, все, что вам нужно и он хорошо работает на нескольких языках.
источник