2008-09-15 4 views
156

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

  • Исходный код редактор
  • Компилятор
  • Отладка
  • Документация Поиск
  • управления версиями
  • OO функции, такие как класс поиска и инспектора объекта

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

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

+5

Вопросы и ответы полностью не соответствуют основной точке IDE. Но сначала не поймите меня неправильно: я думаю, что там нет ни одной IDE (помимо некоторых редких Lisp/Scheme), которые приходят где-нибудь рядом с тем, что Emacs может предложить. ** ОДНАКО ** современные IDE делают такие вещи: мгновенное выделение вероятных ошибок кодирования (даже на частичных не компилируемых АСТ). IntelliJ IDEA делает это: если вы используете, скажем, * @ NotNull *, он должен предупредить вас в режиме реального времени о возможных нарушениях. Тогда есть целая * «кодировка по замыслу» *: она просто не работает (пока) под Emacs. – SyntaxT3rr0r 2011-09-09 16:15:28

+18

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

+0

Как насчет коллапса? – AlwaysLearning 2017-01-08 20:56:25

ответ

70

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

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

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

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

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

+3

не должно быть «M-x compile»? – Svante 2009-02-27 13:34:06

+0

Да, M-x правильный. Это то, что я имел в виду. – 2009-02-27 18:54:50

+1

Я думаю, что GNU global превосходит CScope в эти дни: http://www.gnu.org/software/global/ – 2010-05-22 07:07:10

19

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

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

7

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

Узнайте о креплениями для контроля версий (например, VC-дифф Ус-некст-акции и т.д.)

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

29

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

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

3

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

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

6

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

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

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

По умолчанию KeyBinding является C-х v v

8

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

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

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

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

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

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

10

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

15

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

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

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

2

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

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

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

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

3

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

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

4

Есть TFS.el for emacs integration into 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) 
    
3

Я использую Emacs на Windows. модуль компиляции хорош, но я хотел, чтобы компиляция была умнее в командной строке компиляции, о которой она говорит. It's possible to use "File Variables" to specify compile-command, но я хотел кое-что немного умнее этого. Поэтому я написал небольшую функцию, чтобы помочь. Он угадывает команду компиляции для использования, чтобы запросить пользователя при запуске 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», который принимает эту идею один шаг вперед.

7

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

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

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

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

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

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

1

В последние годы Clang стал важной частью Emacs поддержки Си ++. Atila Невиш побеседовал на CppCon 2015: "Emacs as a C++ IDE"

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

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

Sli des можно найти here.

0

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

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

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

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