Title: Мой личный Editor war
Author: Viva Calman
Date: 2024-04-30 14:48:10
Correction code: 171449146593446

2024-04-27-113822<em>2560x1440</em>scrot.png

Сразу, скажу, что в этой войне победила дружба. Однако, обо всем по порядку.

Я больше десяти лет (а если быть точным, то наверное почти двадцать лет) пользовался в качестве основного редактора почтенным и надежным Vim. Я постепенно допиливал его под себя и, в принципе, меня все в нем устраивало. У меня был конфиг для рабочей машины, с некоторым количеством плагинов, был конфиг, который я копировал на сервера, чтобы везде иметь "отступы-в-четыре-пробела" и нумерацию строк (плагины там мне обычно не нужны). Я делал в нем лабораторки в универе, правил в нем конфиги, писал рабочие скрипты и даже заметки для этого дневника я делал в Vim.

Но внезапно все поменялось. Не то чтобы у меня сильно изменились рабочие задачи, однако, мне стало требоваться больше IDE-фишек, при том, что всякие графические IDE вызывают у меня в основном содрогание — привык я работать в терминале. Vim, конечно же, нетрудно допилить до состояния "IDE", обмазав плагинами (например, поставив отображение дерева проекта, открыв в небольшом буфере внизу терминал, да и вообще, разбивая окна так, как удобно и группируя их в табы, но... знаете, есть такая штука, как ощущения. И вот меня не покидало ощущение, что чем больше я допиливаю Vim, тем больше он напоминает мне собранное на изоленте радиолюбительское устройство. Да, оно работает, но оно собрано на изоленте. И в общем-то, даже с этим я был готов смириться, если бы не Org-mode.

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

2024-04-27-123218<em>2560x1440</em>scrot.png

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

Org-mode работает и в Vim, но есть нюанс — плагин реализует далеко не все возможности настоящего Org-mode (хотя и вполне достаточные для того, чтобы Org-mode нормально использовать). А полноценно плагин реализован в... Emacs конечно же.

Да, это заметка о том, как я вроде бы перешел на emacs в качестве основного редактора. И именно Org-mode продал мне emacs, как редактор. Сразу скажу, это не значит, что я забыл Vim, но об этом будет ниже.

2024-04-27-124842<em>2560x1440</em>scrot.png

Screenshot-2024-04-27-230549.png

Итак, что мы имеем после того, как поставили 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 пакетный менеджер. Кроме упомянутых выше у меня стоят:

Также для 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 не перейти?

^HOME