Обновил конфиги 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, что сильно упростило возню с конфигом. По сравнению с тем бардаком, что был, это большой шаг вперёд. Конфиг наконец стал выглядеть как конфиг: декларативно и структурировано.
Неоднозначно, но естественно, выглядит формирование сильносвязанных множеств библиотек вокруг специализированных фреймворков и сборок. Совместно использовать библиотеки из разных множеств становится затруднительно.
Всё ещё остаётся проблема производительности некоторых сторонних библиотек, особенно при «внезапном» сочетании их между собой. Вызвано это, насколько я понимаю, тремя факторами:
- недостатками кода самих библиотек;
- базарным подходом к разработке;
- реализацией интерпретатора Lisp в Emacs, в частности, отсутствием JIT.
Мой набор библиотек для Emacs
Напомню, итоговый конфиг лежит на github.
Небольшая оговорка. Я всё время говорю о библиотеках, но фактически большинство из них реализуют режимы, модифицирующие стандартное поведение Emacs: minor & major modes. То есть конфигурация редактора заключается во включении, выключении и модификации поведения различных режимов. Для простоты изложения буду каждый режим считать отдельной библиотекой, хотя это не обязательно так.
В списках библиотек я опустил специфичные для языков программирования режимы, тот же python-mode. Их есть несколько на каждый язык.
Суммарно конфиг затрагивает около 40 режимов. Из них примерно 30 — сторонние. Это те, что остались, перебрал я раза в 2 больше.
Приведу полный список затронутых конфигом библиотек с кратким описанием их задач.
Стандартные библиотеки.
- column-number-mode — отображает в modeline номер колонки, в которой находится курсор.
- desktop-save-mode — сохраняет открытые окна между сессиями.
- eldoc-mode — отображает документацию по функциям lisp. Режим отключён.
- hl-line — подсвечивает текущую строку,
- menu-bar-mode — отображает меню. Режим отключён.
- scroll-bar-mode — отображает стандартный скролл. Режим отключён.
- selection-mode — перезаписывает выделенный кусок текста, если начинаешь печатать.
- subword-mode — переключает команды редактирования слов, на редактирование подслов. Например, в слове
my_variable_name
3 подслова:my
,variable
,name
. Если я дам команду «удалить следующее слово», вместо всего идентификатора будет удалено «my_
». - tool-bar-mode — отображает тулбар. Режим отключён.
- visual-line-mode — при отображении строк, которые не помещаются в окно, разбивает их на несколько коротких.
- winner-mode — добавляет undo/redo операции над конфигурацией окон.
- uniquify — улучшает названия буферов с текстами.
Сторонние библиотеки.
Самые интересные выделил жирным — на их страницах обычно можно найти подробную информацию с картинками. Само собой, это не обязательно уникальные фичи Emacs, большинство концепций заимствовано у других редакторов.
- avy — позволяет быстро переместить курсор на любую точку в коде. Вводите пару символов из нужного места, после чего режим подсвечивает все места, где они встречаются, и рисует над каждым уникальную комбинацию клавиш, которую надо нажать, чтобы курсор оказался в указанном месте.
- cheatsheet — отображает настраиваемую вами страницу помощи по сочетаниям клавиш.
- color-identifiers-mode — подсвечивает каждый уникальный идентификатор своим цветом. Читать код становится удобнее.
- command-log-mode — показывает историю нажатия клавиш и событий. Полезна, чтобы учиться работать в редакторе и записывать видео.
- company — автодополнение в коде.
- counsel + ivy + swiper — фреймворк для автодополнения, переопределяющий часть стандартной функциональности Emacs. Интегрирован с некоторыми другими режимами, например, с avy.
- dimmer — при работе в несколько окон приглушает цвета на неактивных окнах.
- doom-modeline — более удобная альтернатива для стандартной modeline.
- doom-themes — темы оформления из Doom Emacs. Лучше всего интегрировались с остальными библиотеками.
- dumb-jump — позволяет прыгать в места определения функций, классов и прочих сущностей.
- flycheck — проверяет синтаксис кучи языков. Требует установки сторонних линтеров.
- highlight-parentheses — подсвечивает скобки.
- minions — подчищает modeline, скрывает лишнюю информацию.
- prescient — улучшает сортировку списков при работе других режимов (ivy, company). Например, помещает самые частые варианты выбора в начале списка.
- smartparens — умная работа со скобками.
- undo-tree — хитрая навигация по истории изменений. Позволяет работать с изменениями как с ветками в системе контроля версий. Например, сделав кучу изменений можно отойти на точку перед ними, начать другую ветку, после чего, если новая не устроит, переключиться на оригинальные правки.
- volatile-highlights — подсвечивает некоторые изменения текста при работе с историей изменений.
- which-key — интерактивная подсказка по нажатым клавишам. Жмёте начало сочетания клавиш, если есть несколько вариантов его завершения, через некоторое время вылезет подсказка со всеми вариантами. Особенно полезно для новичков.
- yascroll — симпатичный скроллбар. Использую для визуализации положения курсора в буфере, так как не получилось завести nyan-mode.
Некоторые режимы пока обошёл стороной.
Не использую org-mode. Может быть после реализации Тарантоги посмотрю в его сторону.
Не настраивал интеграцию с git, выглядит интересно, но я стараюсь использовать Emacs как текстовый редактор, а не комбайн.
Читать далее
- Модная типизация в Python
- Опыт использования Julia
- Генерация подземелий — от простого к сложному
- World Builders 2023: Предпочтения игроков в стратегии
- Автоматический генератор квестов
- Миграции backend на практике
- Типы в Python не радуют
- Open source сервисы аутентификации
- Что будет, если открыть код игры
- Генерация текста на русском по шаблонам