Эссе о разработке игр, мышлении и книгах

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

Скриншот полноразмерного 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 как текстовый редактор, а не комбайн.