Использование Emacs в качестве IDE - PullRequest
164 голосов
/ 15 сентября 2008

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

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

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

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

Ответы [ 17 ]

3 голосов
/ 07 января 2011

Я использую 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)

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


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

3 голосов
/ 10 мая 2009

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

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

3 голосов
/ 16 сентября 2008

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

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

2 голосов
/ 04 ноября 2018

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

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

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

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

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

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

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

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

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

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

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

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

2 голосов
/ 27 февраля 2009

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

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

1 голос
/ 15 ноября 2015

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

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

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

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

0 голосов
/ 07 ноября 2017

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

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

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

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

...