Многие линуксоиды рано или поздно сталкиваются с редактором emacs. Его сложно не заметить, коммунити о нём регулярно
говорит. Но, как и perl, emacs давно мёртв. Тем не менее, перл остаётся удобным и приятным ЯП, когда дело заходит за
парсинг логов, например. И имакс тоже имеет свой use case.
красиво, как вписать его в моё окружение и так далее. Условно говоря, это один из фетишей unixporn.
Впрочем, внезапно, у emacs есть одно сравнительно неожиданное применение и именно потому что он такой старомодный. Это
вполне себе неплохой консольный редактор! Суть в том, что консоль не всегда локальная. Это может быть что-то доступное
по ssh и не обязательно иметь дисплей.
Я не большой любитель freebsd, но в моём случае это именно freebsd, это виртуальная машина и это ssh. И всё это
находится на моём линуксовом сервачке в соседней комнате. Сравнительно неплохой сетап. На локальной тачке у меня
запущено рабочее окружение а на удалённой - как раз emacs и некоторые другие экспериментальные штуки.
И я столкнулся с процессом, который бывает у имаксеров при переезде на новый ноутбук, на новый диск итд. Запуск этого
самого emacs-а с "отлаженным годами использования" конфигом в новом окружении. В моём случае, это оказался запуск emacs с
gui-шным конфигом под linux/macos/windows на тачке с freebsd в текстовом режиме, в консоли.
И совершенно внезапно имакс сломался. Он не сломался совсем, то есть загрузка происходила, но -debug-init не помогал,
так как традиционно ошибка была без пояснения и даже без указания, где она произошла.
Пришлось удлиннить конфиг почти вдвое - буквально перед каждой инструкцией конфига я написал
(message "-> Описание")
Такая "крафтовая" стрелочка позволяет определить, что сообщение пришло именно как каммент из конфига.
В итоге я нашёл проблемные места конфига и переписал их с учётом открывшихся мне знаний.
По ходу пьесы я обнаружил, что не все инструкции конфига работают в консольном режиме. Например, настройки шрифтов,
очевидно, гуёвая тема. Я наивно полагал, что в терминале эти настройки будут просто игнорироваться, но внезапно нет.
Решением этой проблемы стало условное выполнение команд для графического режима:
(if (display-graphic-p)
;; Code to run in GUI mode (e.g., load GUI theme, set fonts)
(progn
(message "-> Running in GUI mode")
(message "-> Set font to JetBrains Mono 12")
(set-frame-font "JetBrains Mono 12")
...
)
;; Code to run in terminal mode
(progn
(message "-> Running in Terminal mode")
;; Terminal specific settings
...
)
)
По сути, весь этот опус был про то, чтобы не забывать вербозно грузить конфиг, для отладки, потому что хэндлинг ошибок
в elisp - отстой и про кондиционные настройки, в том числе про условие, что запустился графический режим.