tazjin's blog


Зачем reliably-switch-buffers?

Вчера вечером написал некоторые патчи для моего emacs-конфига. Их на самом деле давно уже хотел написать, они решают маленькие проблемы которые мне постоянно мешали. Об одной из проблем я хочу рассказать, потому что она привела к тому, что "порог раздражения" был переступлен.

Emacs у меня основная часть своей рабочей среды. Он у меня является, конечно, текстовым редактором, но и еще менеджером окон, мэйл-клиентом, чат-клиентом и много другого.

Внутри emacs есть концепция "буферов", один буфер может быть один открытый файл в текстовом редакторе, один чат на Телеграме, или одно десктопное окно (например, браузер). Навигация между ними осуществляется с помощью команды switch-to-buffer (или кое-каких альтернатив, например ivy-switch-buffer, helm-switch-buffer и так далее). Буфер - на стороне emacs-lisp является объектом с некоторыми полями. Одно из них: buffer-name.

У всех buffer-switch команд есть одинаковая проблема: Они берут список буферов из emacs, показывают имена буферов пользователю, и в результате получают выбранное имя. Затем они просят emacs открыть буфер с этим именем.

Кто-то наверно уже понял какая тут проблема. Имени буферов могут меняться, и да, не только могут, но и делают! Например, Телеграм-клиент может показать каличество непрочитанных сообщений в названии, окно с Яндекс Музыкой меняет названия по треку, и так далее. Получается довольно часто такая ситуация, что название меняется при выборе буфера, и switch-to-buffer больше не найдет выбранный буфер и просто открывает новый, пустой буфер с старым названием! Когда разработывали эти команды в emacs (да, это совершенно давно, где-то в 70х/80х, большинства нас пока не было тогда!), они никогда не сталкивались с такими ситуациями, и это решение, которое тогда хорошо работало теперь больше просто не адекватно.

Фикс был не очень сложным. Вместо списка имен буферов создаю alist с названием и с самим объектом, и после выбора буфера с списка передаю именно этот объект, а не только его название, в функтцию, которая открывает буфер.

Коммит с этой новой функцией здесь: cl/9147 Советую её особенно всем пользователям EXWM!

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

Выньте камни из своих ботинок!