Сразу, скажу, что в этой войне победила дружба. Однако, обо всем по порядку.
Я больше десяти лет (а если быть точным, то наверное почти двадцать лет) пользовался в качестве основного редактора почтенным и надежным Vim. Я постепенно допиливал его под себя и, в принципе, меня все в нем устраивало. У меня был конфиг для рабочей машины, с некоторым количеством плагинов, был конфиг, который я копировал на сервера, чтобы везде иметь "отступы-в-четыре-пробела" и нумерацию строк (плагины там мне обычно не нужны). Я делал в нем лабораторки в универе, правил в нем конфиги, писал рабочие скрипты и даже заметки для этого дневника я делал в Vim.
Но внезапно все поменялось. Не то чтобы у меня сильно изменились рабочие задачи, однако, мне стало требоваться больше IDE-фишек, при том, что всякие графические IDE вызывают у меня в основном содрогание — привык я работать в терминале. Vim, конечно же, нетрудно допилить до состояния "IDE", обмазав плагинами (например, поставив отображение дерева проекта, открыв в небольшом буфере внизу терминал, да и вообще, разбивая окна так, как удобно и группируя их в табы, но... знаете, есть такая штука, как ощущения. И вот меня не покидало ощущение, что чем больше я допиливаю Vim, тем больше он напоминает мне собранное на изоленте радиолюбительское устройство. Да, оно работает, но оно собрано на изоленте. И в общем-то, даже с этим я был готов смириться, если бы не Org-mode.
Org-mode — это такой режим редактора, который превращает редактор в систему трекинга задач, управления делами и вообще реализует очень много штук, которые помогают организовывать дела. Собственно, потому и Org-mode.
Вот тут на скрине видно, как это выглядит в одном из самых простых вариантов — есть несколько записей TODO, у них разные дедлайны, разные статусы, есть отмененная задача, есть закрытая задача, есть задача с подзадачами в виде чекбоксов. И все это легко управляется прямо из редактора — не надо ручками стирать TODO и заменять его на DONE, или рисовать крестик внутри упомянутого чекбокса, после выполнения пункта. Все делает редактор.
Org-mode работает и в Vim, но есть нюанс — плагин реализует далеко не все возможности настоящего Org-mode (хотя и вполне достаточные для того, чтобы Org-mode нормально использовать). А полноценно плагин реализован в... Emacs конечно же.
Да, это заметка о том, как я вроде бы перешел на emacs в качестве основного редактора. И именно Org-mode продал мне emacs, как редактор. Сразу скажу, это не значит, что я забыл Vim, но об этом будет ниже.
Итак, что мы имеем после того, как поставили emacs (есть, кажется, под любую современную ОС)? Ну, во-первых, мы имеем полноценный Org-mode, а во-вторых, стоит в него добавить некоторое количество плагинов. И почему-то эти плагины, написанные, как и половина самого emacs, на elisp, не создают у меня ощущение той разнородности, что была с Vim. Совершенно субъективное ощущение, но что ж теперь поделать.
Первым делом я поставил evil-mode. Это — реализация Vim-биндингов и схемы управления. Как ни крути, модальный режим, который существует в Vim, имеет свои преимущества и от него сложно отказаться.
Полезно иметь такую штуку, как use-package, которая позволит использовать эту конструкцию к главном файле конфигурации (а это, по сути elisp-исходник), чтобы ставить непоставленное при первом запуске.
В emacs несколько непривычное управление окнами редактора, которое реализовано с помощью кнопок Ctrl-X [1234], однако к нему быстро привыкаешь. А от для того, чтобы проще было нужный буфер переложить в нужное окно, стоит поставить плагин buffer-move. Он хоть и несколько тормознут, но помогает переместить терминал из верхнего окна в нижнее, если ты по ошибке отрыл его не там, где хотел.
Для терминала я поставил multi-term, ибо родной терминал, как я понял, не умеет несколько независимых сессий.
Еще полезный плагин workgroups2 — это аналог сессий Vim, хотя сессии в Vim показались мне более гибкими — они запоминают состояние окон для конкретной директории и вызов сохраненной сессии очень прост:
vim -S
Емаксовские же workgroup-ы сохраняются в отдельные файлы где-то в недрах емаксовского каталога и их нужно вызывать по имени. Так что я сделал пару групп с нужной раскладкой окон, но обычно просто создаю эти окошки по необходимости, благо хоткеи все таки достаточно удобные.
Для дерева кода я попробовал neotree и treemacs. Первый — просто показывает папки, с небольшой интеграцией с проектами через projectile (эту фишку я еще не осваивал), второй — требует сохранения путей до папок в свой конфиг и служит скорее органайзером проектов, чем способом навигации. Treemacs показался мне избыточным, однако я дам ему шанс и попробую все же понять, как он работает.
Вообще, плагинов для Emacs — миллион. И большинство можно поставить прямо через встроенный в emacs пакетный менеджер. Кроме упомянутых выше у меня стоят:
- auctex для LaTeX
- auto-complete — довольно удобная штука для реализации автодополнений. Когда пишешь код с хорошими (читай, имеющими смысл) названиями переменных, очень лень их каждый раз набирать. Тут то автодополнение и приходит на выручку.
- rust-mode
- yaml-mode
- markdown-mode — режимы для отдельных языков программирования и разметки
- slime — Шикарный решим разработки по Common Lisp. Я не смог найти ничего подобного в Vim.
- magit — интеграция с Git. Довольно удобная, хотя к ней и надо привыкать.
- reverse-im — плагин, слегка облегчающий вечную проблему "хоткеи работают только на английской раскладке"
- yasnippet — сниппеты. Пока еще не использую, но планирую освоить.
- undo-tree — менеджер изменений, сделанных в файле.
Также для emacs есть плагины для интеграции с Docker и Cubernetes. Когда-то я думал, что это технологии для хипстеров, но потом я понял, что просто хипстеры используют эти технологии, как обезьяна — микроскоп. И с тех пор я стал относиться к ним сильно мягче. Ну и начал использовать в работе.
В качестве темы стоит слегка допиленная Cyberpunk-theme, к которой я добавил раскраску заголовков табов — с цветами по умолчанию я постоянно путал, какой таб сейчас активен.
Также я обнаружил, что в емаксе весьма удобно сделана проверка правописания — достаточно выполнить Alt-X ispell и будет запущен системный механизм проверки орфографии. В Vim такое тоже было, но в emacs это выглядит слегка более удобным.
Ну и еще раз — Org-mode. Не представляю, как я раньше жил без Org-mode.
Теперь о минусах emacs. Они тоже есть. Во-первых, он медленно запускается. Vim взлетает почти моментально, emacs может стартовать несколько секунд. Вроде бы ничего страшного, но временами раздражает. Решается это использованием emacs в режиме демона, когда процесс постоянно висит к памяти и к нему цепляются только клиенты. Но это порождает следующие проблемы — если вы имеете открытые окна клиентов и хотите добавить что-то в конфиг, то перезапуск демона (что логично), закроет всех клиентов. А еще полезно помнить, что это режим client-server, и что открытый буфер остается в памяти сервера, если вы просто закроете клиент. Для того, чтобы прибить буфер на выходе, надо нажать не Ctrl-X Ctrl-C, а Ctrl-x #. Я вроде бы к этому приспособился, но по началу удивлялся, что у меня в списке буферов висит непонятная уйма файлов.
Исходя из этого оказалось, что мой почтеннейший нетбук, на котором все это пишется, emacs, конечно же, тянет, но по скорости запуска даже близко к Vim не приближается.
Во-вторых, как я уже сказал, тут нет полноценного аналога сессий из Vim — то, что я нашел, мне не понравилось. С другой стороны, все таки оказалось довольно просто дробить фреймы на окна на лету — мне все равно редко когда надо больше трех-четырех окон в одном фрейме, поэтому проблема скорее косметическая. Хотя в Vim было удобно после перезагрузки вернуть состояние редактора в проекте одной командой.
В-третьих — в режиме демона несколько странно работает neotree. Точнее, ничего странного, но так как демон запускается, фактически из домашней директории, он отдает этот путь, как рабочий каталог. В итоге neotree всегда смотрит в ~. Исправляется командой для neotree, запущенной вручную, но опять же, временами раздражает.
В-четвертых — по умолчанию emacs оставляет кучу мусора после работы — копия измененного файла, база undo-tree, и все это висит в каталоге, где вы правили файлы. Благо, я добавил нужные вайлдкарды в глобальный gitignore и это добро не пытается пролезть в коммиты.
В-пятых, это все же комбинации клавиш. Я смотрел ролик на Youtube, где на экране отображались нажатые клавиши, и мне то Conami-code там мерещился, то казалось, что автор ролика fatality в Mortal Kombat пытается сделать. Проще говоря, первое время ощущаешь себя гитаристом, который разучивает новую песню — пальцы немного заплетаются, сооружая комбинации из трех-четырех аккордов.
Тем не менее, большинство минусов все же компенсируются плюсами. Я не могу сказать, что в этой "войне редакторов" победил emacs — например, на серверах я продолжу использовать Vim просто потому что мне не хочется держать там демон emacs постоянно запущенным. Ну а Vim-а для задач уровня "поправить конфиг" мне вполне хватает. Также я не смог пока что добиться нормальной работы emacsclient в качестве редактора по умолчанию, особенно в mc — почему-то файл открывается в последнем активном окне emacsclient-а, а не в том терминале, где запущен сам mc. Вообще не то поведение, которое мне хотелось бы иметь. По этой причине у меня EDITOR по прежнему выставлено, как Vim.
Однако, во всех остальных моментах, emacs выглядит для меня более цельным, более удобным и более гибким инструментом. Так что, скорее всего, в дальнейшем я буду использовать в качестве основного редактора именно его.
P.S. А вообще, гибкость и возможности emacs — просто неописуемы. Его можно использовать, как клиент для мессенджеров, получать и отправлять через него электронную почту и даже есть байка, что один аэропорт в Германии несколько лет управлялся кодом на elisp, который крутился где-то на компьютере в диспетчерской. Emacs правда гибкий. Чудовищно гибкий, возможно, избыточно гибкий, однако, я видимо до него дорос. В бороде уже седые волосы начали пробиваться, почему и на emacs не перейти?