it-swarm-ru.tech

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

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

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

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

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

163
user7545

Вы должны быть конкретны в отношении того, что вы подразумеваете под «остальными». За исключением инспектора объектов (о котором я знаю), 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, несомненно, покажет дальнейшие примеры.

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

73
Ben Collins

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

EDIT: я также сейчас рекомендую Magit высоко по сравнению со стандартным интерфейсом VCS в emacs.

29
baudtack

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

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

19
Bryan Oakley

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

15
justinhj

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

10
Alex Ott

Хорошо, все здесь дают отличные советы, чтобы сделать 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

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

C-x C-f
/Sudo:[email protected]/some/file/that/has/root/access/permissions
# on some linux distro it might be `/su:[email protected]` 

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

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

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

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

8
Muhammet Can

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

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

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

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

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

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

8
dkagedal

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

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

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

7
HD.

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

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

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

Связывание клавиш по умолчанию C-x v v

6
Chopmo

Существует 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)
    
4
Cheeso

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

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

3
jfm3

Я использую Emacs на Windows. модуль компиляции хороший, но я хотел, чтобы компиляция была более умной в отношении командной строки компиляции, которую он предлагает. Можно использовать «File Variables» для указания 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


EDIT теперь есть " smarter-compile.el ", который продвигает эту идею на шаг вперед.

3
Cheeso

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

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

3
wr.

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

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

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

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

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

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

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

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

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

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

Для автозаполнения я считаю company-mode очень полезным. 

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

2
sidharth arya

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

Библиотеки 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 \"[email protected]\")" (на * nix) на случай, если что-то может открыть браузер, и вы хотите, чтобы он открывался в emacs.

2
Jonas Kölker

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

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

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

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

1
Philipp Claßen

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

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

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

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

0
rocky