использование emacs в качестве ide

<p>в настоящее время мой рабочий процесс с emacs, когда я пишу код на c или c++, включает три окна. самый большой справа содержит файл, с которым я работаю. левая часть разделена на две части, нижняя часть представляет собой оболочку, которую я использую для ввода команд компиляции или создания, а верхняя часть часто представляет собой какую-то документацию или файл readme, с которым я хочу ознакомиться во время работы. теперь я знаю, что есть некоторые довольно опытные пользователи emacs, и мне любопытно, что функционально полезно другим emacs, если предполагается использовать его как полноценную ide. в частности, большинство ide обычно выполняют эти функции в той или иной форме:</p><ul> <li>редактор исходного кода</li> <li>составитель</li> <li>отладка</li> <li>поиск документации</li> <li>контроль версий</li> <li>оо функции, такие как поиск классов и инспектор объектов </li> </ul><p>для некоторых из них довольно очевидно, как emacs может соответствовать этим функциям, но как насчет остальных? кроме того, если конкретный язык должен быть сфокусирован, я бы сказал, что это должен быть c++. </p><p><strong>edit:</strong> один пользователь указал, что я должен был быть более конкретным, когда сказал «что насчет остальных». в основном мне было интересно узнать об эффективном контроле версий, а также о поиске документации. например, в slime довольно просто выполнить быстрый поиск гиперспека для функции lisp. есть ли быстрый способ найти что-то в документации по c++ stl (если я, например, забыл точный синтаксис <a href="http://www.sgi.com/tech/stl/hash\_map.html">hash\_map</a> )?</p>

<p>вы должны быть конкретны в отношении того, что вы подразумеваете под «остальными». за исключением инспектора объектов (о котором я знаю), emacs выполняет все вышеперечисленное довольно легко:</p><ul> <li>редактор (очевидный)</li> <li>компилятор - просто запустите <code>m-x compile</code> и введите команду компиляции. с этого момента вы можете просто <code>m-x compile</code> и использовать значение по умолчанию. emacs будет фиксировать ошибки компилятора c/c++ (лучше всего работает с gcc) и поможет вам перейти к строкам с предупреждениями или ошибками.</li> <li>отладка - аналогично, когда вы хотите отладить, введите <code>m-x gdb</code>, и он создаст буфер gdb со специальными привязками</li> <li>поиск документации - emacs имеет отличные привязки cscope для навигации по коду. для другой документации: в emacs также есть читатель man-страниц, а для всего остального есть сеть и книги.</li> <li>контроль версий - существует множество привязок emacs для различных бэкэндов vcs (на ум приходят cvs, sccs, rcs, svn, git)</li> </ul><p>правка: я понимаю, мой ответ о поиске документации действительно относится к навигации по коду. вот еще немного точной информации: </p><ul> <li> <a href="http://www.delorie.com/gnu/docs/emacs/emacs\_289.html">поиск справочных страниц, информационных руководств и документации elisp изнутри emacs</a> </li> <li> <a href="https://bitbucket.org/jonwaltman/pydoc-info">поиск документации по python из emacs</a> . </li> </ul><p>поиск в google, несомненно, покажет дальнейшие примеры.</p><p>как видно из второй ссылки, поиск функций (и всего остального) в другой документации может быть выполнен, даже если он не поддерживается "из коробки".</p>

<p>я должен порекомендовать <a href="http://ecb.sourceforge.net/">emacs code browser</a> как более "традиционную" среду стиля ide для emacs.</p><p><strong>edit</strong>: я также сейчас рекомендую <a href="http://www.emacswiki.org/emacs/magit">magit</a> высоко по сравнению со стандартным интерфейсом vcs в emacs.</p>

<p>вместо запуска команды make в окне оболочки вы пробовали m-x compile? он запустит вашу команду make, отобразит ошибки и во многих случаях позволит очень легко перейти к строке кода, которая вызвала ошибку, если выходные данные содержат имена файлов и номера строк.</p><p>если вы являетесь поклонником ide, вы также можете взглянуть на пакет скоростных панелей emacs (m-x speedbar). и, если вы еще этого не сделали, узнайте, как использовать таблицы тегов для навигации по вашему коду.</p>

<p>есть уголки emacs, которые когда-то обнаружили, делают вас более продуктивным, чем вы никогда не думали. как уже упоминали другие, использование тегов - это фантастический и быстрый способ масштабирования исходного кода, а использование m-/(dabbrev-expand) часто дает именно то, что вы ожидаете при заполнении имени переменной. </p><p>использовать происходит полезно, чтобы получить буфер со всеми вхождениями регулярного выражения в буфере. это очень удобно при рефакторинге кода и поиске фрагментов кода или использования переменных, или если вы используете маркеры todo в своих исходных файлах и хотите посетить их все.</p><p>функции flush-lines, sort-numeric-fields, replace-regexp и rectangle могут быть действительно полезны для получения дампа из какого-либо инструмента и преобразования его в полезные данные, такие как программа elisp или электронная таблица с разделителями-запятыми. </p><p>я написал страницу о ide подобных вещах, которые вы можете делать с emacs </p><p> <a href="http://justinsboringpage.blogspot.com/2007/09/11-visual-studio-tricks-in-emacs.html">http://justinsboringpage.blogspot.com/2007/09/11-visual-studio-tricks-in-emacs.html</a> </p><p>изучение elisp - это еще один отличный способ ответить на вопрос, что еще может сделать emacs помимо того, что может сделать типичный ide. </p><p>например, я писал в блоге о написании вспомогательных функций perforce, таких как «вина» (написание своих собственных означает, что вы можете заставить его вести себя именно так, как вы хотите) ...</p><p> <a href="http://justinsboringpage.blogspot.com/2009/01/who-changed-line-your-working-on-last.html">http://justinsboringpage.blogspot.com/2009/01/who-changed-line-your-working-on-last.html</a> </p><p>я также написал код, который динамически создает комментарии для функции в точке, которая соответствует стандартам кодирования, с которыми я работаю. </p><p>ни один из моих elisp-кодов не особенно хорош, и большая его часть уже существует в библиотеках, но действительно полезно иметь возможность заставить emacs выполнять нестандартные вещи, которые появляются в течение рабочего дня. </p>

<p>вы можете найти подробное описание интеграции с emacs и контролем версий на <a href="http://xtalk.msk.su/~ott/en/writings/emacs-vcs/index.html">моем сайте</a> . я также работаю над статьей об использовании emacs в качестве среды разработки для многих языков - c/c++, java, perl, lisp/scheme, erlang и т.д.</p>

<p>хорошо, все здесь дают отличные советы, чтобы сделать emacs отличной ide. </p><p>но любой должен иметь в виду, что когда вы настраиваете свой emacs с большим количеством расширений (особенно с теми, которые проверяют на лету, ищут определения функций и т.д.), ваши emacs будут загружаться очень и очень медленно для редактора. </p><p>чтобы обойти это, я настоятельно рекомендую использовать emacs в <code>server mode</code>. </p><p>он довольно прост в использовании, нет необходимости настраивать файл инициализации .. вам просто нужно запустить emacs в режиме демона;</p><pre><code>emacs --daemon </code></pre><p>это создаст сервер emacs, после чего вы сможете подключить его либо из терминала, либо из графического интерфейса. я бы также порекомендовал создать псевдонимы, чтобы было удобно звонить. </p><pre><code>alias ec="emacsclient -t" alias ecc="emacsclient -c &" # some people also prefer this but no need to fight here; alias vi="emacsclient -t" </code></pre><p>таким образом, emacs будет запускаться даже быстрее, чем gedit, обещаю.</p><p>единственная возможная проблема: если вы запускаете демон emacs от своего обычного пользователя, вы, вероятно, не сможете подключиться к серверу emacs как <code>root</code>. </p><p>итак, если вам нужно открыть файл с правами root; используйте вместо этого <code>tramp</code>. просто запустите ваш клиент emacs с обычным пользователем и откройте файлы, как это;</p><pre><code>c-x c-f /sudo:root@localhost/some/file/that/has/root/access/permissions # on some linux distro it might be `/su:root@...` </code></pre><p>это сделало мою жизнь проще, я могу открыть свой тяжелый кастомизированный питон ide таким образом. вы также можете добавить emacs --daemon в вашу систему или создать файл рабочего стола для emacsclient. это зависит от вас. </p><p>более подробную информацию о emacs daemon и клиенте emacs можно найти на вики;</p><p> <a href="http://www.emacswiki.org/emacs/emacsasdaemon">http://www.emacswiki.org/emacs/emacsasdaemon</a> </p><p> <a href="http://www.emacswiki.org/emacs/emacsclient">http://www.emacswiki.org/emacs/emacsclient</a> </p>

<p>для контроля версий есть несколько вещей, которые вы можете использовать, в зависимости от того, какую систему контроля версий вы используете. но некоторые функции являются общими для всех из них.</p><p><b>vc.el</b> встроенный способ управления версиями на уровне файлов он имеет бэкэнды для большинства систем контроля версий. например, бэкэнд subversion поставляется с emacs, а есть git-бэкэнды и другие, доступные из других источников.</p><p>самая полезная команда <b>c-x v v</b> (vc-next-action), который выполняет соответствующее следующее действие для файла, который вы просматриваете. это может означать обновление из репозитория или принятие ваших изменений, vc.el также выполняет повторную привязку <b>c-x c-q</b> проверять входящие и исходящие файлы, если вы используете систему, которая в этом нуждается (например, rcs).</p><p>другие очень полезные команды <b>c-x v l</b> а также <b>c-x v =</b> которые показывают вам журнал и текущий diff для файла, который вы используете.</p><p>но для реальной производительности вам следует избегать использования однофайловых команд vc.el, кроме простых вещей. существует несколько пакетов, которые могут дать вам обзор состояния всего дерева и дать вам больше возможностей, не говоря уже о возможности создавать согласованные коммиты, охватывающие несколько файлов.</p><p>большинство из них находятся под сильным влиянием или основаны на оригинальной <b>pcl-резюме</b>/<b>pcvs</b> для cvs. есть даже два из них, которые идут с subversion, <b>psvn.el</b> а также <b>dsvn.el</b>, есть пакеты для мерзавцев и т.д.</p>

<p>я согласен, что вы должны узнать о компиляции m-x (свяжите это и m-x next-error с последовательностью коротких клавиш).</p><p>узнайте о привязках для контроля версий (например, vc-diff, vc-next-action и т.д.)</p><p>посмотрите на регистры. вы можете помнить не только местоположения в буферах, но и целые конфигурации окон (c-x r w - конфигурация окна для регистрации).</p>

<p>отправной точкой (которая может быть неочевидна) для изучения возможностей vc в emacs является<strong> m-x vc-next-action </strong>. </p><p>он выполняет «следующую логическую операцию контроля версий» для текущего файла, в зависимости от состояния файла и серверной части vc. таким образом, если файл не находится под контролем версий, он регистрирует его, если файл был изменен, изменения передаются и т.д. </p><p>требуется немного привыкнуть, но я нахожу это очень полезным. </p><p>связывание клавиш по умолчанию<strong> c-x v v </strong></p>

<p>существует <a href="http://www.emacswiki.org/emacs/mstfs">tfs.el для интеграции emacs в microsoft tfs</a> . он работает с любой tfs, включая tfs, на которой работает codeplex.com. </p><p>основные шаги для настройки:</p><ol> <li><p>поместите tfs.el в ваш путь загрузки.</p></li> <li><p>в вашем файле .emacs: </p> <pre><code>(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 </code></pre></li> <li><p>также в вашем файле .emacs, установите локальные или глобальные привязки клавиш для команд tfs. вот так:</p> <pre><code>(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) </code></pre></li> </ol>

<p>compile, next-error и previous-error - довольно важные команды для разработки на c++ в emacs (прекрасно работает и с выводом grep). etags, visit-tags-table и find-tag также важны. complete.el - один из величайших незамеченных хаков 20-го века, который может ускорить ваш хакер c++ на порядок. ох, и давайте не будем забывать эдифф.</p><p>мне еще предстоит научиться использовать контроль версий без посещения shell, но теперь, когда я запускаю коммиты, гораздо чаще (с git) мне, вероятно, придется.</p>

<p>вы также можете найти <a href="http://www.emacswiki.org/emacs/tabbarmode">tabbar</a> полезно. он имитирует единственное поведение, которое я пропустил при переходе от eclipse к emacs. связано с "," и "." для перехода к предыдущей и следующей панели вкладок он избавляет вас от необходимости постоянно переключать буфер с помощью ctrl-x b.</p><p>к сожалению, упомянутая веб-страница не предоставляет правильную версию для загрузки. однако большинство версий ubuntu поставляют его в своих пакетах emacs-goodies.</p>

<p>я знаю, что это очень старый пост. но этот вопрос актуален для начинающих в emacs.</p><p>imo лучший способ использовать emacs как идеал - это использовать протокол <a href="https://langserver.org/">language server</a> с emacs. вы можете найти всю информацию о языковых серверах на связанном веб-сайте. </p><p>для быстрой настройки я призываю вас перейти на эту страницу <a href="https://github.com/joaotavora/eglot">eglot</a> . imo eglot делает свою работу довольно хорошо. он хорошо интегрируется с пакетами автозаполнения, такими как компания. обеспечивает поиск ссылки и многое другое. </p><p>также для отладчика вам могут понадобиться специальные отладчики для определенных языков. вы можете использовать gdb из emacs. просто введите <code>m-x gdb</code>. </p><p>для компиляции вашего кода лучше всего использовать shell-команды. я работаю над этим проектом <a href="https://github.com/sidhartharya10/eproj">eproj</a> . это займет некоторое время, чтобы завершить это. но все, что он делает, это отображает команду shell на тип проекта. и строит ваш проект через shell. это делает то же самое, чтобы выполнить команду. мне может понадобиться помощь в завершении этого проекта. он не готов к использованию, но если вы знаете, что такое elisp, вы можете просмотреть код. </p><p>кроме того, всегда лучше использовать команду компиляции emacs.</p><p>что касается контроля версий, я еще не видел ни одного другого пакета, который мог бы соответствовать мощности <a href="https://github.com/magit/magit">magit</a> . это специфично для мерзавца. также для git есть еще один пакет git-timemachine, который я считаю очень полезным.</p><p>поиск объектов и поиск классов обеспечивается протоколом языкового сервера. </p><p>дерево проекта можно использовать для интерфейса ide like с <a href="https://github.com/magit/magit">treemacs</a> .</p><p>существует также библиотека взаимодействий проекта <a href="https://github.com/bbatsov/projectile">projectile</a> .</p><p>для автозаполнения я считаю <a href="https://github.com/company-mode/company-mode">company-mode</a> очень полезным. </p><p>поистине, emacs можно сделать что угодно.</p>

<p>при поиске документации: это зависит от вашего языка (ов) программирования.</p><p>библиотеки c и системные вызовы обычно документируются на страницах руководства. для этого вы можете использовать <code>m-x man</code>. некоторые вещи могут быть лучше задокументированы на информационных страницах; используйте <code>m-x info</code>.</p><p>для самого elisp используйте <code>c-h f</code>. для python используйте <code>>>> help(<function, class, module>)</code> в интерпретаторе.</p><p>я считаю, что большинство других языков предлагают документацию в виде html. для этого попробуйте встроенный браузер (я использую w3m). задайте для переменной среды <code>browser</code> сценарий-обертку вокруг <code>emacsclient -e "(w3m-goto-url-new-session \"$@\")"</code> (на * nix) на случай, если что-то может открыть браузер, и вы хотите, чтобы он открывался в emacs.</p>

<p>в последние годы clang стал важной частью поддержки emacs c++. атила невес выступил с докладом на cppcon 2015: <a href="https://youtu.be/5fqwq0qwbtu">"emacs как c++ ide"</a> </p><p>это 16-минутный доклад, в котором он показывает решения по следующим темам:</p><ul> <li>перейти к определению</li> <li>авто-завершение</li> <li>подсветка синтаксиса на лету</li> <li>найти файл в проекте</li> </ul><p>слайды можно найти <a href="https://github.com/cppcon/cppcon2015/raw/master/lightning%20talks%20and%20lunch%20sessions/emacs%20as%20a%20c%2b%2b%20ide/emacs%20as%20a%20c%2b%2b%20ide%20-%20atila%20neves%20-%20cppcon%202015.pdf">здесь</a> .</p>

<p>в стиле unix или x windows я не знаю, что есть интегрированный ide, который работает для всего. </p><p>для взаимодействия с отладчиками, только одним компонентом ide, рассмотрим <a href="https://github.com/realgud">realgud</a> . еще одна полезная вещь - парсеры для сообщений о местоположении, так что если у вас есть трассировка стека вызовов и вы хотите редактировать ее в определенном месте стека вызовов, этот интерфейсный интерфейс может это сделать. </p><p>безусловно, эта программа может использовать улучшения. но тогда он мог бы также использовать людей, работающих над этим, чтобы улучшить его. </p><p>отказ от ответственности: я работаю на реалгуд</p>