Використання Emacs як повнофункціонального IDE C / C ++


50

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

Особливості, які я шукаю в IDE, такі:

  1. Управління програмними "проектами". Я хочу, щоб мій IDE мав уявлення про всі файли, що входять до мого поточного проекту, щоб я міг виконувати такі функції, як пошук і заміна в рамках мого проекту. (Було б добре, якби я також міг досягти цього, не засмічуючи своє вихідне дерево великою кількістю файлів підтримки. Навіщо мені потрібно більше одного централізованого файлу проекту на проект?)
  2. Можливість побудови поточного проекту з IDE, незалежно від того, який буфер я зараз відвідую. Мені потрібно вміти прив’язати ключ, який будуватиме поточний проект.
  3. Повідомлення про помилки Мені не хочеться читати 500+ рядків виводу, щоб знайти помилки, про які повідомили інструменти збирання. Переважно, помилки відображаються у власному власному буфері з одним рядком на помилку.
  4. Усвідомлення символів в рамках проекту та місця їх визначення. Я хочу перейти до визначення символу, чи є він у моїх проектних файлах чи в систему включаються файли.
  5. Візуальна налагодження. Хочу мати список перегляду локальних змінних, які автоматично оновлюються під час переходу коду. Я хочу мати змогу встановити точки перерви в коді, побачити, який рядок коду буде виконуватися далі.

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

Які рішення існують для перетворення Emacs у повнофункціональний CE + + IDE? Чи завжди вам потрібно налаштувати все на частини, чи є спосіб налаштувати всі функції за один раз?

EDIT: Щоб відповісти на це запитання, не потрібно точно відповідати всім п'яти заданим критеріям. Я просто надав список, щоб дати більш конкретне уявлення про тип функцій, які я хочу побачити, перш ніж я вважатиму IDE "повнофункціональним". Цілком можливо, що CEDET міг би відповідати законопроекту, але я ще не знайшов робочого покрокового підручника щодо того, як його налаштувати з нуля.


6
Це питання, можливо, краще розділити на кілька. Можливо, ви отримаєте купу часткових відповідей, коли жодному з питань не приділяється належної уваги.
Малабарба

2
Також пункт 1 може бути дублікатом emacs.stackexchange.com/questions/448/…
Malabarba

6
@Malabarba: Якщо я задав п'ять окремих питань, це може бути дублікат. Вся суть цього питання полягає в тому, що може бути п’ять різних пакетів, які досягають п'яти різних цілей, але налаштувати всіх п’ять на прекрасну гру між собою здається майже неможливою. Якщо відповідь повернеться як "Emacs не може функціонувати як повнофункціональний IDE, оскільки для конфігурування потрібні неможливі час". то так і буде.
nispio

4
Кожен із пунктів може бути власним запитанням (потенційно дублюється), якщо їх об'єднати в одне питання, іноді може призвести до різних відповідей через взаємодію пакету.
Джонатан Ліч-Пепін

Відповіді:


27

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

  1. снаряд є найближчим пакетом для забезпечення справжнього досвіду, подібного до IDE. Це забезпечує тону корисної функціональності на основі проекту. Ви, ймовірно, також захочете якесь управління вікном / робочим простором; Я використовую власне рішення під назвою wacspace , але інші хороші рішення включають перспективу , робочі групи та електронний екран .
  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); СЛАЙМ (для Common Lisp); халат (для Рубі); семантичні або clang-теги для C / C ++ (відмова від відповідальності: я ніколи не використовував, тому не маю уявлення, чи добре вони працюють). Якщо все інше не вдається, ви також можете використовувати вбудовані засоби TAGS Emacs, використовуючи щось на зразок насичених ctags , але я ніколи не мав десь близьких прийнятних результатів із TAGS.
  5. Emacs має дуже розсіяну підтримку налагоджувачів. GDB з GUD - найкраща ставка для мов, подібних до С; інакше це майже повністю на мові. (Я не думаю, що мовна налагодження візуальної дійсності справді не реальна мета.)

4
Як бічний вузол projectileможе інтегруватися безпосередньо зі perspectiveстворенням perspective-per-projectавтоматичного перемикача проекту.
Джонатан Ліч-Пепін

Я б додав нотатки про semantic№4, семантичний - це чудовий пакет, він розуміє ваш код і може зробити багато корисного з цією інформацією.
Джордон Біондо

Я ніколи насправді не використовував semantic, і я думаю, що пам’ятаю, що у нього неповна підтримка C ++, але я додав це у відповідь.
shosti

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. Я ще цього не пробував.

У наведеному посібнику наведена дуже чітка інформація про конфігурацію того, як розпочати роботу.


Я також натрапив на це керівництво і застосував його. IMHO - це якось важковаговик і занадто сильно змінює багато основних взаємодій Emacs. Я відключив декілька конфігурацій, що стосуються керма, оскільки вони заважали звичайним ярликам (наприклад, легко відкривати поточний каталог у буфері або відкривати файл у підпорядкуванні з кількома натисканнями клавіш). Варто поглянути, але, мабуть, слід спробувати поетапно, а не в цілому.
Стефан Гурішон

9

Оскільки зараз ви просите про повнофункціональний ID / C ++ IDE, я можу бути кваліфікованим.

Я використовував усі 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 на основі глобальної для навігації з кодом, я рекомендую ggtags.el

Відповідь на запитання 5 : Візуальна налагодження, багато людей рекомендували M-x gdb-many-window, я спробував це, але це не вийшло. Це просто тому, що моя версія gdb застаріла (підказка, я використовую OSX 10.7.3), і я занадто ледачий, щоб оновити ОС. Але GUD чудово. Я створюю коротку клавішу для друку змінної для мене у вікні редактора. всі речі з налагодження можна використовувати. У ньому немає макета UX таблиці як VS. але, щоб бути чесним з тобою. Відладчик Microsoft UX також не найкращий у світі. Найкращий налагоджувальний налагоджувач - 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. Зауважте, що він буде використовувати однакові прив'язки клавіш для наступної та попередньої помилок.


4

Управління програмними "проектами". Я хочу, щоб мій IDE мав уявлення про всі файли, що входять до мого поточного проекту, щоб я міг виконувати такі функції, як пошук і заміна в рамках мого проекту. (Було б добре, якби я міг досягти цього, не засмічуючи своє вихідне дерево великою кількістю файлів підтримки. Навіщо мені потрібно більше одного централізованого файлу проекту на проект?)

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

Повідомлення про помилки Мені не хочеться читати 500+ рядків виводу, щоб знайти помилки, про які повідомили інструменти збирання. Переважно, помилки відображаються у власному власному буфері з одним рядком на помилку.

Flycheck має підтримку перевірки синтаксису за допомогою clang / gcc.

Усвідомлення символів в рамках проекту та місця їх визначення. Я хочу перейти до визначення символу, чи є воно в моїх проектних файлах чи в систему включаються файли

Я рекомендую вам поглянути на rtags . Він використовує кланг як бекенд і досить непогану роботу з переходу до визначення та завершення. Він також може допомогти вам з номером №3, оскільки він також інтегрується з макетом для відображення помилок та попереджень за допомогою кланг. Крім того, він має деяку обмежену підтримку для рефакторингу. Інший варіант інтелектуального автоматичного завершення - це режим іронії


2

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

EDE CEDET дозволяє керувати, наприклад, makefile та автоматизувати проекти, додаючи до нього цілі та пов’язуючи файли з цілями. Потім можна скласти проект за допомогою команд EDE. Оскільки він використовує вбудований режим компіляції Emacs, ваша потреба №3 також задоволена.

CEDET's Semantic має парсери для декількох мов, включаючи C ++. Він може отримати теги, визначені у файлі, як exuberant-ctags та GNU Global, але він також має точні функції автоматичного завершення та стрибки. Якщо у вас є два методи під назвою "foo", стрибок Semantic досить розумний, щоб перевести вас на правильний.

Для №1 я особисто використовую снаряд , і я успішно використовував GDB №5 кілька разів тому.

Підказка для №3: Якщо EDE для вас надмірний, Emacs має команду M-x recompileзапустити останню команду компіляції, тож ви можете запустити компіляцію один раз, а потім використовувати recompileв будь-якому буфері.


1

Для №4, здається, це новий проект під назвою YouCompleteme , і відповідний клієнт Emacs, який, здається, є наступною цікавою справою. Оскільки він використовує clang, він має кращий вигляд коду, ніж теги або глобальний.


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 з його джерела repo + ECB + gtags + cscope. Однак, на цій посаді є багато пропозицій, які я буду намагатися.


1
Чи можете ви пояснити, що вам потрібно було зробити, щоб усі ці інструменти працювали разом?
nispio

4
Зараз це майже виглядає як невдалий коментар. :-) Якщо ви будете доброзичливі, будь ласка, детально розкажіть.
Малабарба

Вибачте за те, що ми маємо стислий характер. Додаток StackExchange приймає до купола звикання. Це рішення відповідає №4, що стосується навігації символів та аналізу джерела. CEDET, звичайно, містить семантичне. ECB - це браузер коду Emacs і використовує CEDET для переліку методів та інформації про символи звітів. Gtags та Cscope створюють таблиці символьної інформації з вихідної бази (кермо також це робить) та інтегруються з Emacs, щоб дозволити навігацію за тегами чи символом.
Клей Хаапала

1

Як було сказано в деталях вище, снаряд (необов'язково з кермом) - це геніальне рішення для управління проектами.

Ycmd відмінно підходить для заповнення коду та деякої навігації, а найкращий клієнт для нього - emacs-ycmd (повне розкриття: я написав клієнт emacs.)

Щодо "тегів" та індексації, найкраще загальне рішення, яке я знайшов, - це пошук коду (більше розкриття: я теж написав цей.) Це досить глухо, що він дійсно просто шукає регулярні вирази, але це надзвичайно швидко і, як правило, все, що вам потрібно , і він добре працює на кількох мовах.

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