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

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

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

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

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

Ответ 1

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

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

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

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

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

Ответ 2

Я должен рекомендовать Magit высоко над стандартным интерфейсом VCS в emacs.

Ответ 3

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

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

Ответ 4

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

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

flush-lines, sort-numeric-fields, replace-regexp и функции прямоугольника могут быть действительно полезны для взятия дампа с некоторого инструмента и преобразования его в полезные данные, такие как 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 делал пользовательские вещи, которые просто появляются в течение рабочего дня.

Ответ 5

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

Ответ 6

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

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-cvs/ pcvs для CVS. Есть даже два из них, которые поставляются с subversion, psvn.el и dsvn.el. Существуют пакеты для git и т.д.

Ответ 7

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

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

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

Ответ 8

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

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

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

По умолчанию ключевое слово C-x v v

Ответ 9

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

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

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

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

emacs --daemon

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

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 python в миллисекундах таким образом. Вы также можете добавить emacs -daemon в свой системный запуск или создать файл рабочего стола для emacsclient. Это зависит от вас.

Подробнее о emacs daemon и emacs можно найти в wiki;

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

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

Ответ 10

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

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

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

  • В файле .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
    
  • также в вашем файле .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)
    

Ответ 11

компиляция, следующая ошибка и предыдущая ошибка - все довольно важные команды для разработки на С++ в Emacs (отлично работает и с выходом grep). Также важны Etags, table-table-table и find-tag. complete.el является одним из великих невоспетых хаков 20-го века и может ускорить ваш взлом С++ на порядок. О, и не забывайте об этом ediff.

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

Ответ 12

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

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

Ответ 13

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

Функция угадывания ищет файл vbproj или csproj или sln, и если он найден, он предлагает msbuild. Затем он смотрит на имя файла буфера и в зависимости от этого предлагает разные вещи. Файл .wxs означает проект WIX, и вы, вероятно, захотите построить MSI, поэтому логика предположений предлагает команду nmake для MSI. Если это модуль Javascript, то предложение заключается в запуске jslint-for-wsh.js для lint файла .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", который делает эту идею еще на один шаг.

Ответ 14

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

Библиотеки

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

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

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

Ответ 15

В последние годы Clang стал важной частью поддержки Emacs С++. Atila Neves поговорила о CppCon 2015: "Emacs как среда С++"

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

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

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

Ответ 16

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

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

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

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