Обновил конфиги Emacs

Скриншот полноразмерного Emacs на моём мониторе не влезает сюда, поэтому вот вам его кусочек.

В конце ноября смотрел чего наворотили в актуальных текстовых редакторах, вроде Atom и VS Code, в итоге нажаловался на них в facebook. Дескать даже файл открыть без мышки не могут. А для меня, как емаксера, тягание мыши — стресс и выпадение из потока — чистые боль и страдание.

Поэтому, и не в первый раз кстати, я решил от добра добра не искать — обновить то, что и так работает. Тем более, в последний раз я радикально перерабатывал конфиг Emacs лет 5 назад. 

Кстати, по поводу «не в первый раз». У меня сложилось стойкое ощущение, что Emacs и Vim стали своего рода глобальными локальными оптимумами в пространстве возможных текстовых редакторов. Отказаться от них тем сложнее, чем дольше и глубже с ними знакомишься. А я с Emacs уже лет 12, видимо слезть с него совсем шансов нет.

Так вот. На обновление конфигов у меня ушло примерно 7 рабочих дней :-D И ещё дней 5 на автоматизацию настройки системы с помощью ansible — давно хотел сделать, но всё руки не доходили, а тут за компанию само пошло. 

Вот она — прелесть безработности творческого отпуска — можешь неделю настраивать Emacs и никто тебе слова поперёк не скажет.

Если вы начинающий емаксер или просто интересуетесь, не пугайтесь сроков. Emacs — сложная штука, но не на столько. Просто я упоротый и полез делать собственное окружение, а для нормальных людей есть готовые и проверенные сборки: Spacemacs, Doom Emacs и прочие, которые должны работать сразу после установки.

Далее расскажу как я искал нужные библиотеки, какое мнение сформировал о текущем состоянии Emacs и что в итоге получилось.

Итоговый конфиг лежит на github. Если его разместить в /home/<user_name>/.emacs, то при следующем запуске Emacs сам скачает и установит все нужные библиотеки. Будет работать всё, кроме некоторых фич в режиме редактирования Python — для их включения смотрите определение переменных python‑binaries, python‑interpreter, python‑pylint.

Поиск информации

Emacs — типичный продукт bazaar development и философии unix со всеми плюсами и минусами этих подходов. В частности, без сторонних библиотек, он всё ещё текстовый редактор, но уже не такой крутой и удобный. Поэтому ставить сторонние библиотеки жизненно необходимо.

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

Ах да, Emacs со всеми библиотеками и конфигами написан на собственном диалекте Lisp. Надо хотя бы представлять, что это такое, и уметь это читать.

Поэтому не получится просто открыть wiki, по ней найти всё нужное и настроить.

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

  • по всем проектам с тегом «emacs», у которых было много звёзд;
  • по всем проектам из списка Awesome Emacs;
  • по всем проектам, на которых найденные репозитории ссылались.

Если вы ещё не познакомились с поиском GitHub по тегами и списками Awesome*, очень рекомендую познакомиться. GitHub действительно превращается в социальную сеть для программистов и значительно упрощает навигацию по нишевым предметным областям.

В итоге я двигался по списку, ставил библиотеки, крутил их настройки и смотрел: нравится или не нравится.

Настройка

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

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

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

Самым простым примером могут служить наборы тем оформления, а-ля Emacs Doom Themes, которые поддерживают корректное отображение популярных сторонних расширений или предоставляют свои аналоги.

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

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

К сожалению, мне всё-таки пришлось читать код устанавливаемых библиотек. Далеко не все опции конфигурации вынесены в документацию, приходится раскапывать их собственными силами. Даже пришлось написать 2 функции в 6 строчек кода, на что я потратил рабочий день :-D

Текущее состояние редактора

Emacs жив и развивается активнее, чем лет 5 назад. Это радует.

Более того, редактор начал разворачиваться лицом к простым смертным. Появились удобные сборки для казуальных пользователей. У того же Spacemacs 20k звёзд на GitHub.

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

Если вы интересуетесь Emacs-ом, но боитесь, сейчас самое время попробовать.

Очень порадовало появление библиотек, стандартизирующих установку и настройку сторонних пакетов. Я остановился на use-package, что сильно упростило возню с конфигом. По сравнению с тем бардаком, что был, это большой шаг вперёд. Конфиг наконец стал выглядеть как конфиг: декларативно и структурировано.

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

Всё ещё остаётся проблема производительности некоторых сторонних библиотек, особенно при «внезапном» сочетании их между собой. Вызвано это, насколько я понимаю, тремя факторами:

  1. недостатками кода самих библиотек;
  2. базарным подходом к разработке;
  3. реализацией интерпретатора Lisp в Emacs, в частности, отсутствием JIT.

Мой набор библиотек для Emacs

Напомню, итоговый конфиг лежит на github.

Небольшая оговорка. Я всё время говорю о библиотеках, но фактически большинство из них реализуют режимы, модифицирующие стандартное поведение Emacs: minor & major modes. То есть конфигурация редактора заключается во включении, выключении и модификации поведения различных режимов. Для простоты изложения буду каждый режим считать отдельной библиотекой, хотя это не обязательно так. 

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

Суммарно конфиг затрагивает около 40 режимов. Из них примерно 30 — сторонние. Это те, что остались, перебрал я раза в 2 больше. 

Приведу полный список затронутых конфигом библиотек с кратким описанием их задач.

Стандартные библиотеки.

  1. column-number-mode — отображает в modeline номер колонки, в которой находится курсор.
  2. desktop-save-mode — сохраняет открытые окна между сессиями.
  3. eldoc-mode — отображает документацию по функциям lisp. Режим отключён.
  4. hl-line — подсвечивает текущую строку,
  5. menu-bar-mode — отображает меню. Режим отключён.
  6. scroll-bar-mode — отображает стандартный скролл. Режим отключён.
  7. selection-mode — перезаписывает выделенный кусок текста, если начинаешь печатать.
  8. subword-mode — переключает команды редактирования слов, на редактирование подслов. Например, в слове my_variable_name 3 подслова: my, variable, name. Если я дам команду «удалить следующее слово», вместо всего идентификатора будет удалено «my_».
  9. tool-bar-mode — отображает тулбар. Режим отключён.
  10. visual-line-mode — при отображении строк, которые не помещаются в окно, разбивает их на несколько коротких.
  11. winner-mode — добавляет undo/redo операции над конфигурацией окон.
  12. uniquify — улучшает названия буферов с текстами.

Сторонние библиотеки. 

Самые интересные выделил жирным — на их страницах обычно можно найти подробную информацию с картинками. Само собой, это не обязательно уникальные фичи Emacs, большинство концепций заимствовано у других редакторов.

  1. avy — позволяет быстро переместить курсор на любую точку в коде. Вводите пару символов из нужного места, после чего режим подсвечивает все места, где они встречаются, и рисует над каждым уникальную комбинацию клавиш, которую надо нажать, чтобы курсор оказался в указанном месте. 
  2. cheatsheet — отображает настраиваемую вами страницу помощи по сочетаниям клавиш.
  3. color-identifiers-mode — подсвечивает каждый уникальный идентификатор своим цветом. Читать код становится удобнее.
  4. command-log-mode — показывает историю нажатия клавиш и событий. Полезна, чтобы учиться работать в редакторе и записывать видео. 
  5. company — автодополнение в коде.
  6. counsel + ivy + swiper — фреймворк для автодополнения, переопределяющий часть стандартной функциональности Emacs. Интегрирован с некоторыми другими режимами, например, с avy.
  7. dimmer — при работе в несколько окон приглушает цвета на неактивных окнах. 
  8. doom-modeline — более удобная альтернатива для стандартной modeline.
  9. doom-themes — темы оформления из Doom Emacs. Лучше всего интегрировались с остальными библиотеками. 
  10. dumb-jump — позволяет прыгать в места определения функций, классов и прочих сущностей.
  11. flycheck — проверяет синтаксис кучи языков. Требует установки сторонних линтеров.
  12. highlight-parentheses — подсвечивает скобки.
  13. minions — подчищает modeline, скрывает лишнюю информацию.
  14. prescient — улучшает сортировку списков при работе других режимов (ivy, company). Например, помещает самые частые варианты выбора в начале списка.
  15. smartparens — умная работа со скобками.
  16. undo-tree — хитрая навигация по истории изменений. Позволяет работать с изменениями как с ветками в системе контроля версий. Например, сделав кучу изменений можно отойти на точку перед ними, начать другую ветку, после чего, если новая не устроит, переключиться на оригинальные правки.
  17. volatile-highlights — подсвечивает некоторые изменения текста при работе с историей изменений.
  18. which-key — интерактивная подсказка по нажатым клавишам. Жмёте начало сочетания клавиш, если есть несколько вариантов его завершения, через некоторое время вылезет подсказка со всеми вариантами. Особенно полезно для новичков.
  19. yascroll — симпатичный скроллбар. Использую для визуализации положения курсора в буфере, так как не получилось завести nyan-mode.

Некоторые режимы пока обошёл стороной.

Не использую org-mode. Может быть после реализации Тарантоги посмотрю в его сторону.

Не настраивал интеграцию с git, выглядит интересно, но я стараюсь использовать Emacs как текстовый редактор, а не комбайн.