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

169

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

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

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

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

user7545
источник
5
В вопросах и ответах полностью отсутствует основная точка IDE. Но сначала не поймите меня неправильно: я думаю, что нет ни одной IDE (кроме некоторых редких Lisp / Scheme), которые бы приблизились к тому, что может предложить Emacs. ОДНАКО современные IDE делают такие вещи: мгновенное выделение возможных ошибок кодирования (даже на некомпилируемых частично AST). IntelliJ IDEA делает это: если вы используете, скажем, @NotNull, он в реальном времени предупредит вас о возможных нарушениях. Тогда есть целое «кодирование по намерению» : оно просто не работает (пока) в Emacs.
СинтаксисT3rr0r
18
Другая область, где хорошая IDE действительно может сиять: контекстное завершение кода (опять же, даже на беспристрастных, не компилируемых исходных файлах). Завершение контекстного кода p0wns hippie-expand в любой день, как будто это даже не смешно: это просто позорит Emacs. Еще раз мне очень грустно, что "текстовые редакторы" IDE - дешевый, отстойный, глупый, жалкий кусок мусора по сравнению с Emacs. Но хорошие IDE блестят во многих областях (таких как рефакторинг, контекстное завершение кода, предупреждения в реальном времени и т. Д.), Где Emacs практически нигде нет. Дайте мне Emacs в середине моей IDE, которая сказала. Я с нетерпением жду этого дня.
СинтаксисT3rr0r
Как насчет свертывания кода?
AlwaysLearning
Я должен сказать, что комментарии здесь, вероятно, не написаны программистами. Я читал, как Emacs не может и не может, но другие IDE могут. Для меня это звучит так: программист, человек, который решает проблемы с использованием языка программирования; есть проблема в том, что некоторые программы не имеют функции и, следовательно, хуже, но они не хотят создавать эту функцию. Мол, люди, почему, черт возьми, вы становитесь программистами в первую очередь ?? !!
red777
@ SyntaxT3rr0r у нас есть семантика для контекстно-зависимого завершения кода.
Васанта Ганеш К

Ответы:

76

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

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

Изменить: я понимаю, мой ответ о поиске документации действительно относится к навигации по коду. Вот еще немного точной информации:

Поиск в Google, несомненно, покажет дальнейшие примеры.

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

Бен Коллинз
источник
3
не должно ли это быть "Mx compile"?
Сванте
1
Я думаю, что GNU global превосходит CScope в наши дни: gnu.org/software/global
Юрген Хетцель
@ Jürgen Hötzel: Я давно не использовал Emacs. В то время я использовал GNU global в сочетании с CScope, IIRC. Я не был бы удивлен, если бы глобальный изобрел CScope все же.
Бен Коллинз
также оказывать поддержку с <a href=" p4el.sourceforge.net/p4.el.html"> p4.el </ a >
forksandhope
29

Я должен рекомендовать Emacs Code Browser как более «традиционную» среду стиля IDE для emacs.

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

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

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

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

Брайан Оукли
источник
15

Есть уголки 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 выполнять нестандартные вещи, которые появляются в течение рабочего дня.

justinhj
источник
10

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

Алекс Отт
источник
8

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

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

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

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

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

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

dkagedal
источник
8

Хорошо, все здесь дают отличные советы, чтобы сделать 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 daemon от своего обычного пользователя, вы, вероятно, не можете подключиться к серверу emacs как root.

Итак, если вам нужно открыть файл с правами 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@...` 

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

Более подробную информацию о emacs daemon и клиенте emacs можно найти на вики;

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

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

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

Я согласен, что вы должны узнать о Mx compile (свяжите это и Mx next-error с последовательностью коротких клавиш).

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

Посмотрите на регистры. Вы можете помнить не только местоположения в буферах, но и целые конфигурации окон (Cx rw - window-configuration-to-register).

HD.
источник
6

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

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

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

Связывание клавиш по умолчанию - Cx vv

Chopmo
источник
4

Существует 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)
Cheeso
источник
Хм ... это серьезно за то, чтобы ваш пароль был в открытом тексте в вашем файле .emacs?
Тед
@TED ​​- нет, просто иллюстрация. Секреты должны храниться в другом месте, читать из elisp.
Cheeso
3

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

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

jfm3
источник
3

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

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

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

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

Функция предположения ищет файл 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.


РЕДАКТИРОВАТЬ теперь есть " smarter-compile.el ", который продвигает эту идею на шаг вперед.

Cheeso
источник
2

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

Библиотеки 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.

Йонас Кёлкер
источник
2

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

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

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

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

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

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

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

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

Дерево проекта может быть использовано для интерфейса ide с интерфейсом treemacs .

Существует также проект Interaction Library, который называется снаряд .

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

Поистине, Emacs можно сделать что угодно.

Сидхарт Арья
источник
1

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

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

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

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

Филипп Классен
источник
0

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

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

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

Отказ от ответственности: я работаю на реалгуд

скалистый
источник
0

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

acakojic
источник