Використання Emacs як IDE


169

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

  • Редактор вихідного коду
  • Компілятор
  • Налагодження
  • Пошук документації
  • Контроль версій
  • Такі функції, як пошук класу та інспектор об'єктів

Для деяких із них цілком очевидно, як Emacs може відповідати цим функціям, а як щодо решти? Крім того, якщо певна мова повинна бути зосереджена, я б сказав, що це повинен бути C ++.

Редагувати: Один користувач зазначив, що я повинен був бути більш конкретним, коли сказав "як щодо решти". Переважно мені було цікаво ефективний контроль версій, а також пошук документації. Наприклад, у SLIME досить легко здійснити швидкий пошук гіперзвуку на функції Lisp. Чи є швидкий спосіб знайти щось у документації на C ++ STL (якщо я забув точний синтаксис hash_map , наприклад)?


5
У запитаннях та в усіх відповідях повністю відсутній основний пункт IDE. Але спочатку не зрозумійте мене: я думаю, що там немає жодної IDE (крім деяких рідкісних програм Lisp / Scheme), які б не були близькі до того, що може запропонувати Emacs. ЯКЩО сучасні IDE роблять подібне: миттєве виділення ймовірних помилок кодування (навіть на часткових некомпілюваних AST). IntelliJ IDEA робить це: якщо ви використовуєте, скажімо, @NotNull, він попередить вас в реальному часі про можливі порушення. Тоді є ціле "кодування за наміром" : воно просто не працює (поки) під Emacs.
SyntaxT3rr0r

18
Ще одна область, де хороший IDE справді може сяяти: завершення контекстного коду (ще раз, навіть на неупереджених, некомпілюваних вихідних файлах). Контекстуальне заповнення коду p0wns хіпі-розгортання будь - якого дня, як це навіть не смішно: воно просто приводить Emacs у сором. Ще раз мені дуже сумно, що "текстові редактори" IDE - це дешевий, кульгавий, дурний, жалюгідний шматок сміття порівняно з Emacs. Але хороші IDE світяться в багатьох областях (наприклад, рефакторинг, доповнення контекстного коду, попередження в режимі реального часу тощо), де Emacs в основному ніде. Дайте мені Emacs посеред мого IDE, який сказав. Я жадаю цього дня.
SyntaxT3rr0r

А що з кодом згортається?
Завжди слухання

Треба сказати, що коментарі тут, мабуть, не написані програмістами. Я читав, як Emacs не може цього і не може, але інші IDE можуть. Для мене це звучить так: програміст, людина, яка вирішує проблеми за допомогою мови програмування; є проблема у тому, що деяка програма не має функції, а тому є гіршою, але вони не хочуть створювати цю функцію. Мовляв, люди, чому на хуй ви стаєте програмістами в першу чергу ?? !!
red777

Відповіді:


76

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

  • редактор (очевидно)
  • компілятор - просто запустіть M-x compileі введіть свою команду компіляції. З цього M-x compileмоменту ви можете просто використовувати та використовувати за замовчуванням. Emacs буде фіксувати помилки компілятора C / C ++ (найкраще працює з GCC) та допоможе вам перейти до рядків із попередженнями чи помилками.
  • Налагодження - аналогічно, коли ви хочете налагоджувати, введіть, M-x gdbі це створить gdb буфер зі спеціальними прив'язками
  • Пошук документації - emacs має чудові прив'язки CScope для навігації з кодом. Щодо іншої документації: Emacs також має читацький веб-сайт, а для всього іншого - Інтернет та книги.
  • контроль версій - є багато прив’язок Emacs для різних VCS-пакетів (CVS, SCCS, RCS, SVN, GIT - все це приходить в голову)

Редагувати: Я розумію, що моя відповідь про пошук документації дійсно стосується навігації по коду. Ось ще кілька точних відомостей:

Пошук Google, без сумніву, відкриє подальші приклади.

Як показує друге посилання, пошук функцій (і будь-яких інших) в іншій документації можна виконати, навіть якщо вони не підтримуються поза полем.


3
чи не повинен це бути "компіляція Mx"?
Svante

1
Я думаю, що GNU global переважає над CScope цими днями: gnu.org/software/global
Jürgen Hötzel

@ Jürgen Hötzel: Я Emacs активно не використовував. У той час я використовував GNU global спільно з CScope, IIRC. Я б не здивувався, якби глобальний розвинувся CScope, хоча.
Бен Коллінз

також неволею підтримка з <a href=" p4el.sourceforge.net/p4.el.html"> p4.el </ а >
forksandhope

29

Я повинен рекомендувати браузер коду Emacs як "традиційне" середовище стилю IDE для emacs.

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


Ви повинні просто мати змогу редагувати публікацію, вам здається, що у вас є достатня кількість представників.
бодотака

19

Замість виконання команди make у вікні оболонки ви спробували компілювати Mx? Він запустить вашу команду make, відобразить помилки, а в багатьох випадках дуже легко перейти до рядка коду, який спричинив помилку, якщо вихід включає в себе назви файлів та номери рядків.

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


15

Є куточки emacs, які колись виявили вас, роблять вас більш продуктивними у способах, про які ви ніколи не думали. Як уже згадували інші, використання тегів - це фантастичний і швидкий спосіб збільшення масштабування вихідного коду, а використання M- / (dabbrev-розширення) часто робить саме те, що ви очікуєте при заповненні імені змінної.

Використання вживання буває корисним для отримання буфера зі всіма випадками регулярного виразу в буфері. Це дуже зручно, коли рефакторинг коду і пошук фрагментів коду або використання змінних, або якщо ви використовуєте маркери TODO у вихідних файлах і хочете відвідати їх усі.

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


10

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


8

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

vc.el - це вбудований спосіб керування версіями на рівні файлів. Він містить резервні копії для більшості систем управління версіями. Наприклад, субверсія Subversion постачається з Emacs, і є інші програмні засоби, доступні з інших джерел.

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

Інші дуже корисні команди - Cx vl і Cx v =, які показують вам журнал та поточну різницю для файлу, який ви використовуєте.

Але для реальної продуктивності вам слід уникати використання однофайлових команд vc.el, відмінних від простих речей. Існує кілька пакетів, які можуть дати вам огляд стану вашого цілого дерева і дати вам більше сил, не кажучи вже про можливість створення узгоджених комісій, що охоплюють кілька файлів.

Більшість із них сильно впливають або базуються на оригінальних pcl-cvs / pcvs для CVS. Є навіть два з них , що відбувається з підривною, psvn.el і dsvn.el . Є пакети для git тощо.


8

Гаразд, всі тут дають ідеальні підказки, щоб зробити emacs чудовим IDE.

Але кожен повинен пам’ятати, що, коли ви налаштовуєте 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.

Отже, якщо вам потрібно відкрити файл, який має кореневий доступ; використовувати 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@...` 

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

Більше про демона emacs та клієнта emacs можна знайти на wiki;

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

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


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

7

Я згоден, що вам слід дізнатися про компіляцію Mx (прив’яжіть цю та Mx наступну помилку до короткої послідовності ключів).

Дізнайтеся про прив’язки для контролю версій (наприклад, vc-diff, vc-next-action тощо)

Загляньте в регістри. Ви можете не тільки запам’ятовувати місця в буферах, але й цілі вікна (Cx rw - вікно-конфігурація для реєстрації).


6

Вихідним пунктом (який може бути неочевидним) для дослідження особливостей ВК Emacs є Mx vc-next-action .

Він виконує "наступну операцію управління логічною версією" на поточному файлі, залежно від стану файлу та сервера VC. Отже, якщо файл не знаходиться під контролем версій, він реєструє його, якщо файл був змінений, зміни подаються і т.д.

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

Типовим прив'язкою клавіш є Cx vv


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)

Гм ... це серйозно виступає за введення пароля в простому тексті у вашому файлі .emacs?
ТЕД

@TED ​​- ні, просто ілюстрація. Секрети повинні зберігатися в іншому місці, прочитаному з Elisp.
Cheeso

3

компіляція, наступна помилка та попередня помилка - це все дуже важливі команди для розробки C ++ в Emacs (чудово працює і при виведенні файлів grep). Важливими також є позначки, таблиця відвідувань-тегів та тег пошуку. fill.el - один з найвидатніших хакерів 20-го століття, і може пришвидшити ваше хакерство C ++ на порядок. О, і не будемо забувати будівництво.

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


3

Ви також можете знайти панель вкладок корисна . Це імітує єдину поведінку, яку я пропустив під час переходу від Eclipse до Emacs. Пов’язане з "," і "." для переміщення до попередньої та наступної панелі вкладок, це позбавить вас від перемикання буфера на Ctrl-x b весь час.

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


1
Класно, я шукав спосіб отримати нову версію вкладки. Для тих, хто не знаходиться на Ubuntu, ви можете знайти його тут. пакети.ubuntu.com
karmic/

3

Я використовую emacs у Windows. модуль компіляції приємний, але я хотів, щоб компіляція була розумнішою щодо командного рядка компіляції, який він пропонує. Можна вказати "Файлові змінні", щоб вказати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 зараз є " розумніший-compile.el ", який робить цю ідею ще на крок.


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.

Для контролю версій я ще не бачив жодного іншого пакету, який би міг відповідати потужності магіта . Це специфічно для git. Також для git є ще один пакет git-timemachine, який я вважаю дуже корисним.

Пошук об'єктів і пошук класів забезпечується протоколом мовного сервера.

Дерево проекту може бути використане для такого типу інтерфейсу з коштами .

Існує також бібліотека проекту Взаємодія під назвою снаряд .

Для автоматичного завершення я вважаю, що режим компанії дуже корисний.

Воістину emacs можна зробити будь-що.


1

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

Це 16-хвилинна бесіда, де він пропонує рішення наступних тем:

  • Перейти до визначення
  • Автозаповнення
  • Підсвічування синтаксису на ходу
  • Знайти файл у проекті

Слайди можна знайти тут .


0

У стилі Windows Unix або X я не знаю, що існує інтегрована IDE, яка працює на все.

Для взаємодії з налагоджувачами лише один компонент IDE розглянемо realgud . Інше, що мені здається корисним - це парсери для повідомлень про місцезнаходження, так що якщо у вас є стек стека виклику і ви хочете редагувати певне місце в стовпі викликів, цей інтерфейсний інтерфейс може це зробити.

На сьогодні ця програма може використати вдосконалення. Але тоді він також може використовувати людей, які працюють над цим, щоб покращити його.

Відмова: Я працюю над realgud


0

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.