Использование Emacs как IDE

В настоящее время мой рабочий процесс с Emacs, когда я кодирую на C или C++, включает три окна. Самый большой справа содержит файл, с которым я работаю. Левая часть разделена на две части, нижняя - это оболочка, которую я использую для ввода команд компиляции или создания, а верхняя часто представляет собой какую-то документацию или файл README, с которым я хочу ознакомиться во время работы. Теперь я знаю, что есть несколько довольно опытных пользователей Emacs, и мне любопытно, какие еще Emacs функционально полезны, если предполагается использовать его как полноценную IDE. В частности, большинство IDE обычно выполняют эти функции в той или иной форме:

  • Редактор исходного кода
  • Компилятор
  • Отладка
  • Поиск в документации
  • Управление версиями
  • OO-функции, такие как поиск классов и инспектор объектов

Для некоторых из них довольно очевидно, как Emacs может соответствовать этим функциям, но как насчет остальных? Кроме того, если необходимо сосредоточиться на конкретном языке, я бы сказал, что это должен быть C++.

Редактировать: Один пользователь указал, что мне следовало быть более конкретным, когда я сказал «а как насчет остальных?». В основном меня интересовало эффективное управление версиями, а также поиск документации. Например, в SLIME довольно легко выполнить быстрый поиск по гиперпространству Lisp-функции. Есть ли быстрый способ найти что-нибудь в документации C++ STL (например, если я забыл точный синтаксис hash_map)?

В вопросах и ответах полностью отсутствует основная идея IDE. Но сначала не поймите меня неправильно: я думаю, что нет ни одной IDE (кроме некоторых редких Lisp / Scheme), которые хоть немного приблизились бы к тому, что может предложить Emacs. ТЕМ НЕ МЕНИЕ современные IDE делают такие вещи: мгновенное выделение возможных ошибок кодирования (даже на частично некомпилируемых AST). IntelliJ IDEA делает это: если вы используете, скажем, @Не ноль, он будет предупреждать вас в режиме реального времени о возможных нарушениях. Затем есть весь "кодирование намерением": он просто (пока) не работает под Emacs.

SyntaxT3rr0r 09.09.2011 20:15

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

SyntaxT3rr0r 09.09.2011 20:18

А как насчет сворачивания кода?

AlwaysLearning 08.01.2017 23:56

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

red777 19.07.2018 10:11

@ SyntaxT3rr0r у нас есть семантика для контекстно-зависимого завершения кода.

Vasantha Ganesh 20.07.2020 11:37
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
170
5
72 565
18
Перейти к ответу Данный вопрос помечен как решенный

Ответы 18

Вы пробовали компилировать M-x вместо того, чтобы запускать команду make в окне оболочки? Он запустит вашу команду make, отобразит ошибки и во многих случаях упростит переход к строке кода, вызвавшей ошибку, если вывод включает имена файлов и номера строк.

Если вы поклонник IDE, вы также можете посмотреть пакет emacs Speedbar (M-x speedbar). И, если вы еще этого не сделали, узнайте, как использовать таблицы тегов для навигации по вашему коду.

Ответ принят как подходящий

Вам нужно будет уточнить, что вы подразумеваете под «остальным». За исключением инспектора объектов (о котором я знаю), emacs довольно легко выполняет все вышеперечисленное:

  • редактор (очевидно)
  • компилятор - просто запустите M-x compile и введите свою команду компиляции. С этого момента вы можете просто M-x compile и использовать значение по умолчанию. Emacs фиксирует ошибки компилятора C / C++ (лучше всего работает с GCC) и помогает вам переходить к строкам с предупреждениями или ошибками.
  • Отладка - аналогично, когда вы хотите отладить, введите M-x gdb, и он создаст буфер gdb со специальными привязками.
  • Поиск документации - emacs имеет отличные привязки CScope для навигации по коду. Для другой документации: в Emacs также есть программа для чтения справочных страниц, а для всего остального есть Интернет и книги.
  • контроль версий - существует множество привязок Emacs для различных бэкэндов VCS (на ум приходят CVS, SCCS, RCS, SVN, GIT)

Обновлено: я понимаю, что мой ответ о поиске документации действительно относился к навигации по коду. Вот еще кое-что по существу:

Поиск в Google, несомненно, покажет и другие примеры.

Как видно из второй ссылки, можно выполнять поиск функций (и чего угодно) в другой документации, даже если они не поддерживаются из коробки.

Разве это не должно быть "M-x compile"?

Svante 27.02.2009 16:34

Я думаю, что в наши дни GNU global превосходит CScope: gnu.org/software/global

Jürgen Hötzel 22.05.2010 11:07

@ Jürgen Hötzel: Я давно не использовал Emacs. В то время я использовал GNU global вместе с CScope, IIRC. Я бы не удивился, если бы global переросла CScope.

Ben Collins 24.05.2010 21:57

также принудительная поддержка с <a href="p4el.sourceforge.net/p4.el.html">p4.el</a>

forksandhope 03.03.2011 20:36

Я согласен с тем, что вы должны узнать о компиляции M-x (привяжите это и M-x next-error к короткой последовательности клавиш).

Узнайте о привязках для управления версиями (например, vc-diff, vc-next-action и т. д.)

Загляните в регистры. Вы можете запоминать не только местоположения в буферах, но и целые конфигурации окна (C-x r w - window-configuration-to-register).

Я должен рекомендовать Браузер кода Emacs как более "традиционную" среду в стиле IDE для emacs.

РЕДАКТИРОВАТЬ: теперь я также настоятельно рекомендую Magit по сравнению со стандартным интерфейсом VCS в emacs.

Вы должны просто иметь возможность редактировать сообщение, у вас, кажется, достаточно репутации.

baudtack 27.01.2013 07:15

compile, next-error и previous-error - все это довольно важные команды для разработки C++ в Emacs (отлично работает и с выводом grep). Также важны Etags, visit-tags-table и find-tag. Завершение.el - один из величайших незамеченных хаков 20-го века, который может на порядок ускорить взлом C++. О, и давайте не будем забывать о ediff.

Я еще не научился использовать контроль версий без посещения оболочки, но теперь, когда я запускаю коммиты гораздо чаще (с git), мне, вероятно, придется.

Отправной точкой (которая может быть неочевидной) для изучения возможностей Emacs VC является M-x vc-следующее-действие.

Он выполняет «следующую логическую операцию управления версиями» для текущего файла в зависимости от состояния файла и серверной части VC. Поэтому, если файл не находится под контролем версий, он регистрирует его, если файл был изменен, изменения отправляются и т. д.

К этому нужно немного привыкнуть, но я считаю это очень полезным.

Привязка клавиш по умолчанию - C-x v v

Для контроля версий вы можете использовать несколько вещей в зависимости от того, какую систему контроля версий вы используете. Но некоторые функции у них общие.

vc.el - это встроенный способ управления версиями на уровне файлов. Он имеет бэкенды для большинства систем контроля версий. Например, бэкэнд Subversion поставляется с Emacs, а есть бэкэнды git и другие, доступные из других источников.

Самая полезная команда - это C-x v v (vc-next-action), которая выполняет соответствующее следующее действие для файла, который вы посещаете. Это может означать обновление из репозитория или фиксацию ваших изменений, vc.el также повторно связывает С-х С-д для возврата и извлечения файлов, если вы используете систему, которая в этом нуждается (например, RCS).

Другими очень полезными командами являются C-x v l и C-x v =, которые показывают вам журнал и текущие различия для файла, который вы используете.

Но для реальной производительности вам следует избегать использования однофайловых команд vc.el, кроме как для простых вещей. Есть несколько пакетов, которые могут дать вам обзор состояния всего вашего дерева и дать вам больше возможностей, не говоря уже о возможности создавать согласованные коммиты, охватывающие несколько файлов.

Большинство из них сильно зависит от оригинального pcl-cvs / pcvs для CVS или основано на нем. Есть даже два из них, которые идут с Subversion, psvn.el и dsvn.el. Есть пакеты для git и т. д.

Вы можете найти подробное описание интеграции emacs и контроля версий на мой сайт. Я также работаю над статьей об использовании Emacs в качестве среды разработки для многих языков - C / C++, Java, Perl, Lisp / Scheme, Erlang и т. д.

Есть некоторые уголки emacs, которые однажды обнаружат, что сделают вас более продуктивными способами, о которых вы даже не догадывались. Как уже упоминалось, использование тегов - это фантастический и быстрый способ масштабирования исходного кода, а использование M- / (dabbrev-expand) часто делает именно то, что вы ожидаете при заполнении имени переменной.

Использование случая полезно для получения буфера со всеми вхождениями регулярного выражения в буфере. Это действительно удобно при рефакторинге кода и поиске фрагментов кода или использования переменных, или если вы используете маркеры TODO в исходных файлах и хотите просмотреть их все.

Функции flush-lines, sort-numeric-fields, replace-regexp и rectangle могут быть действительно полезны для получения дампа из некоторого инструмента и преобразования его в полезные данные, такие как программа elisp или электронная таблица с разделителями-запятыми.

Я написал страницу об IDE, как о том, что вы можете делать с emacs

http://justinsboringpage.blogspot.com/2007/09/11-visual-studio-tricks-in-emacs.html

Изучение elisp - еще один отличный способ ответить для себя, что еще Emacs может делать помимо того, что может делать обычная IDE.

Например, я писал в блоге о написании вспомогательных функций Perforce, таких как вина (написание собственного означает, что вы можете заставить его вести себя именно так, как хотите) ...

http://justinsboringpage.blogspot.com/2009/01/who-changed-line-your-working-on-last.html

Я также написал код, который динамически создает комментарии для функции на определенном этапе, что соответствует стандартам кодирования, с которыми я работаю.

Ни один из моих кодов на elisp не особенно хорош, и большая его часть уже существует в библиотеках, но действительно полезно иметь возможность заставлять emacs делать нестандартные вещи, которые появляются только в течение рабочего дня.

При поиске документации: это зависит от вашего языка (языков) программирования.

Библиотеки C и системные вызовы обычно документируются на страницах руководства. Для этого вы можете использовать M-x man. Некоторые вещи могут быть лучше задокументированы на информационных страницах; используйте M-x info.

Для самого elisp используйте C-h f. Для python используйте >>> help(<function, class, module>) в интерпретаторе.

Я считаю, что большинство других языков предлагают документацию в форме html. Для этого попробуйте встроенный браузер (я использую w3m). Задайте для переменной среды BROWSER сценарий оболочки emacsclient -e "(w3m-goto-url-new-session \"$@\")" (в * nix) на случай, если что-то может открыть браузер, и вы хотите, чтобы он открывался внутри emacs.

Вы также можете найти панель вкладок полезным. Он имитирует единственное поведение, которое я пропустил при переходе с Eclipse на Emacs. Связан с "," и "." для перехода к предыдущей и следующей панели вкладок он избавляет вас от постоянного переключения буфера с помощью Ctrl-x b.

К сожалению, указанная веб-страница не предоставляет правильную версию для загрузки. Однако большинство версий Ubuntu поставляют его в своих пакетах emacs-goodies.

Круто, я искал способ получить более новую версию панели вкладок. Для тех, кто не использует Ubuntu, вы можете найти его здесь. packages.ubuntu.com/karmic/emacs-goodies-el

Ibrahim 13.05.2009 01:29

Есть TFS.el для интеграции emacs в Microsoft TFS. Он работает с любой TFS, включая TFS, на которой работает Codeplex.com.

Основные шаги по настройке:

  1. Поместите tfs.el в свой путь загрузки.

  2. В вашем файле .emacs:

    (require 'tfs)
    (setq tfs/tf-exe  "c:\vs2008\common7\ide\tf.exe")
    (setq tfs/login "/login:domain\userid,password")
          -or-
    (setq tfs/login (getenv "TFSLOGIN"))  ;; if you have this set
    
  3. Также в вашем файле .emacs установите локальные или глобальные привязки клавиш для команд tfs. вот так:

    (global-set-key  "\C-xvo" 'tfs/checkout)
    (global-set-key  "\C-xvi" 'tfs/checkin)
    (global-set-key  "\C-xvp" 'tfs/properties)
    (global-set-key  "\C-xvr" 'tfs/rename)
    (global-set-key  "\C-xvg" 'tfs/get)
    (global-set-key  "\C-xvh" 'tfs/history)
    (global-set-key  "\C-xvu" 'tfs/undo)
    (global-set-key  "\C-xvd" 'tfs/diff)
    (global-set-key  "\C-xv-" 'tfs/delete)
    (global-set-key  "\C-xv+" 'tfs/add)
    (global-set-key  "\C-xvs" 'tfs/status)
    (global-set-key  "\C-xva" 'tfs/annotate)
    (global-set-key  "\C-xvw" 'tfs/workitem)
    

Гм ... это серьезно защищает размещение вашего пароля открытым текстом в вашем файле .emacs?

T.E.D. 16.07.2015 23:38

@ТЕД. - нет, просто иллюстрация. Секреты следует хранить в другом месте, прочитав из elisp.

Cheeso 17.07.2015 21:05

Я использую emacs в Windows. модуль компиляции хорош, но я хотел, чтобы при компиляции использовалась более продуманная командная строка компиляции, которую он предлагает. Можно использовать "Переменные файла" для указания compile-command., но я хотел чего-то более умного, чем это. Поэтому я написал небольшую функцию, чтобы помочь. Он угадывает команду компиляции, которую нужно использовать для запроса пользователю при запуске compile.

Функция guess ищет файл vbproj, csproj или sln и, если он найден, предлагает msbuild. Затем он смотрит на имя файла буфера и, в зависимости от этого, предлагает разные вещи. Файл .wxs означает, что это проект WIX, и вы, вероятно, захотите создать MSI, поэтому логика предположений предлагает команду nmake для MSI. Если это модуль Javascript, то предлагается запустить jslint-for-wsh.js для линтинга файла .js. В качестве запасного варианта предлагается nmake.

Код, который я использую, выглядит так:

(defun cheeso-guess-compile-command ()
  "set `compile-command' intelligently depending on the
current buffer, or the contents of the current directory."
  (interactive)
  (set (make-local-variable 'compile-command)
       (cond
        ((or (file-expand-wildcards "*.csproj" t)
             (file-expand-wildcards "*.vcproj" t)
             (file-expand-wildcards "*.vbproj" t)
             (file-expand-wildcards "*.shfbproj" t)
             (file-expand-wildcards "*.sln" t))
         "msbuild ")

        ;; sometimes, not sure why, the buffer-file-name is
        ;; not set.  Can use it only if set.
        (buffer-file-name
         (let ((filename (file-name-nondirectory buffer-file-name)))
           (cond

            ;; editing a .wxs (WIX Soluition) file
            ((string-equal (substring buffer-file-name -4) ".wxs")
             (concat "nmake "
                     ;; (substring buffer-file-name 0 -4) ;; includes full path
                     (file-name-sans-extension filename)
                     ".msi" ))

            ;; a javascript file - run jslint
            ((string-equal (substring buffer-file-name -3) ".js")
             (concat (getenv "windir")
                     "\system32\cscript.exe c:\users\cheeso\bin\jslint-for-wsh.js "
                     filename))

            ;; something else - do a typical .exe build
            (t
             (concat "nmake "
                     (file-name-sans-extension filename)
                     ".exe")))))
        (t
         "nmake "))))


(defun cheeso-invoke-compile-interactively ()
  "fn to wrap the `compile' function.  This simply
checks to see if `compile-command' has been previously set, and
if not, invokes `cheeso-guess-compile-command' to set the value.
Then it invokes the `compile' function, interactively."
  (interactive)
  (cond
   ((not (boundp 'cheeso-local-compile-command-has-been-set))
    (cheeso-guess-compile-command)
    (set (make-local-variable 'cheeso-local-compile-command-has-been-set) t)))
  ;; local compile command has now been set
  (call-interactively 'compile))

;; in lieu of binding to `compile', bind to my monkeypatched function
(global-set-key "\C-x\C-e"  'cheeso-invoke-compile-interactively)

Я попытался сделать это как «предварительный совет» для функции компиляции, но не смог заставить ее работать удовлетворительно. Поэтому я определил новую функцию и привязал ее к той же комбинации клавиш, которую я использовал для compile.


EDIT there is now "smarter-compile.el" which takes this idea one step further.

Хорошо, все здесь дают отличные подсказки, чтобы сделать emacs отличной IDE.

Но любой должен иметь в виду, что когда вы настраиваете свои emacs с большим количеством расширений (особенно для проверки типов на лету, поиска определений функций и т. д.), Ваши emacs будут загружаться очень и очень медленно для редактора.

Чтобы обойти это, я настоятельно рекомендую использовать emacs в server mode.

Он довольно прост в использовании, нет необходимости настраивать файл инициализации. Вам просто нужно запустить emacs в режиме демона;

emacs --daemon

Это создаст сервер emacs, после чего вы сможете подключить его либо из терминала, либо из графического интерфейса. Я также рекомендовал бы создать несколько псевдонимов, чтобы было легче звонить.

alias ec = "emacsclient -t"
alias ecc = "emacsclient -c &"
# some people also prefer this but no need to fight here;
alias vi = "emacsclient -t"

Таким образом, emacs будет запускаться даже быстрее, чем gedit, обещание.

Единственная возможная проблема здесь: если вы запускаете демон emacs от своего обычного пользователя, вы, вероятно, не можете подключить сервер emacs как root.

Итак, если вам нужно открыть файл с корневым доступом; используйте вместо него tramp. Просто запустите свой клиент emacs под своим обычным пользователем и откройте такие файлы;

C-x C-f
/sudo:root@localhost/some/file/that/has/root/access/permissions
# on some linux distro it might be `/su:root@...` 

Это сделало мою жизнь проще, так я могу открыть свою тяжело настроенную IDE на Python за миллисекунды. Вы также можете добавить emacs --daemon при запуске вашей системы или создать файл рабочего стола для emacsclient. Решать вам.

Больше о демоне emacs и клиенте emacs можно найти на вики;

http://www.emacswiki.org/emacs/EmacsAsDaemon

http://www.emacswiki.org/emacs/EmacsClient

Я знаю, что это произошло пятью годами позже, но я тоже использовал его в то время: если вы установите EDITOR = "emacsclient -t" VISUAL = "emacsclient -c", вы можете выполнять редактирование на основе sudo с помощью sudo -e или sudoedit, что иногда предпочтительнее, чем использование TRAMP (обычно по причинам аудита). Вы также можете вызвать emacsclient с --alternate-editor= (потребности пробел в конце), и он запустит демон, если он не запущен, что устраняет необходимость помещать демон в запуск системы, если вы готовы дождаться его времени первый вы запускаете редактор при каждой загрузке.

Darael 18.02.2018 04:13

В последние годы Clang стал важной частью поддержки Emacs C++. Атила Невес выступила с докладом на CppCon 2015: "Emacs как C++ IDE"

Это 16-минутный доклад, в котором он показывает решения для следующих тем:

  • Перейти к определению
  • Автозаполнение
  • Подсветка синтаксиса на лету
  • Найти файл в проекте

Слайды можно найти здесь.

В стиле Windows Unix или X я не знаю, есть ли интегрированная IDE, которая работает для всего.

Для взаимодействия с отладчиками, только одним компонентом IDE, рассмотрите Realgud. Еще одна вещь, которую я считаю полезной, - это парсеры для сообщений о местоположении, так что, если у вас есть трассировка стека вызовов и вы хотите редактировать в определенном месте в стеке вызовов, этот интерфейсный интерфейс сможет это сделать.

Безусловно, в этой программе можно было бы улучшить. Но затем он также может использовать людей, работающих над этим, для его улучшения.

Отказ от ответственности: я работаю на realgud

Я знаю, что это очень старый пост. Но этот вопрос актуален для новичков в emacs.

IMO лучший способ использовать emacs в качестве ide - использовать протокол языкового сервера с emacs. Вы можете найти всю информацию о языковых серверах на связанном веб-сайте.

Для быстрой настройки я настоятельно рекомендую вам перейти на эту страницу Эглот. IMO eglot отлично справляется со своей работой. Он хорошо интегрируется с такими пакетами автозаполнения, как company. Предоставляет справочную информацию и многое другое.

Также для отладчика вам могут потребоваться специальные отладчики для определенных языков. Вы можете использовать gdb из emacs. Просто введите M-x gdb.

Для компиляции кода лучше всего использовать shell-команды. Я работаю над этим проектом эпрой. Это займет некоторое время. Но все, что он делает, это сопоставляет команду оболочки с типом проекта. И строит ваш проект через оболочку. То же самое происходит при выполнении команды. Мне может понадобиться помощь в завершении этого проекта. Он не готов к использованию, но если вы немного разбираетесь в elisp, вы можете просмотреть код.

Помимо этого, всегда лучше использовать команду компиляции emacs.

Что касается управления версиями, я еще не видел другого пакета, который мог бы соответствовать мощности магит. Это специфично для git. Также для git есть еще один пакет git-timemachine, который я считаю очень полезным.

Поиск объектов и классов обеспечивается протоколом языкового сервера.

Дерево проекта может использоваться для идеального интерфейса с Treemacs.

Также существует библиотека взаимодействия проекта под названием снаряд.

Для автозаполнения я считаю очень полезным корпоративный режим.

Поистине emacs можно заставить делать что угодно.

Попробуйте lsp-mode. Теперь вы можете использовать другие функции IDE внутри emacs, подключающегося к серверу. Ищите дополнительную информацию: lsp-режим

Другие вопросы по теме