Emacs в Windows
Как же я дошёл до жизни такой?
В связи со сменой работы мне пришлось взять новый ноут (корпоративный забрали).
Требования к ноуту у меня были достаточно понятные: 16 гиг оперативы, 512 гиг жёсткого диска (или больше) и — это самое противное — чтобы на нём завёлся Linux без особых танцев.
Я не очень долго выбирал, потому что несколько лет работал на Lenovo X1 Carbon (вроде как 4 поколения), взяв Lenovo X1 Carbon но уже 9 поколения.
Когда мне пришёл ноут, я запустил Windows 10 Pro, которая шла в комплекте, и … решил не ставить Linux. Почему? Потому что тут внезапно(!) оказался тачскрин, работающий сканер отпечатков пальцев, профили питания для экономии батареи… Короче, я понял, что заводить всё это в лялихе мне неохота, а отказываться от таких удобств чисто ради виндекапца я не готов.
Настроил за пару дней WSL2, Docker, Emacs, всё завелось, я смог работать.
Но тут по работе пришлось скачивать кучу файлов, смотреть/редактировать их, затем отправлять назад. Так как все приложения кроме докера и Emacs’а у меня запущены в винде, открывать всё это в Emacs, который работает изнутри WSL не очень удобно. Я решил попробовать запустить Emacs в винде. Так как на многие мои вопросы ответы в интернете ищутся не по первой ссылке, я решил часть всего этого описать тут.
Установка
Ну тут всё просто: идём на сайт https://www.gnu.org/software/emacs/, качаем, ставим.
Складываем конфиги
По-умолчанию Emacs ищет конфиги не в C:\Users\<Username>
, а в C:\Users\<Username>\AppData\Roaming
. Туда их и сложим, чтобы не извращаться с особенностями винды.
Так как я держу конфиги в Git, я склонировал репозиторий в C:\Users\<Username>\Code\emacs_config
, а затем сделал символические ссылки в PowerShell (запущенном под админом):
C:\Users\Valen> mkdir .emacs.d
C:\Users\Valen> New-Item -ItemType SymbolicLink -Path C:\Users\Valen\ -Name .emacs -Value 'C:\Users\Valen\Code\emacs_config\.emacs'
C:\Users\Valen> New-Item -ItemType SymbolicLink -Path C:\Users\Valen\.emacs.d\ -Name settings -Value 'C:\Users\Valen\Code\emacs_config\.emacs.d\settings'
Меняем домашнюю директорию
Так как emacs по-умолчанию считает домашней директорией C:\Users\<Username>\AppData\Roaming
, открывать файлы в emacs не очень удобно (нужно постоянно возвращаться в C:\Users\<Username>
). Чтобы с этим побороться есть несколько способов:
- Перенастроить переменную HOME
Не мой вариант, потому что мне лень возиться с тем, чтобы объяснять Emacs’у, где у него HOME из винды - Переопределить переменную HOME
Вот это мой варик, тут мне всё понятно
Для этого в конец .emacs дописываем следующий код:
(if (string= system-type "windows-nt")
(setenv "HOME" "C:\\Users\\Valen"))
emacs –daemon и emacsclient
Я достаточно долго (пару часов) гуглил, чтобы решить ряд непонятных ошибок, поэтому в этом разделе, думаю, самое ценное.
Во-первых, мне бы хотелось пользоваться emacsclient, потому что в 2021 году emacs всё ещё стартует непозволительно долго.
Во-вторых, мне не хотелось запускать emacs --daemon
при каждом старте системы. Ну просто потому что.
Выход я нашёл следующий: если запускать emacsclient с ключом -a
(который запускает альтернативный редактор, если emacsclient не запустился) равным пустой строке, то emacsclient сам пытается запустить emacs --daemon
и подключиться к нему. Наш вариант!
Для того, чтобы это всё заработало, надо удалить папку C:\Users\Valen\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Emacs-<version>
, в которой находятся ярлыки, созданные при установке Emacs.
Далее в папке C:\Users\Valen\AppData\Roaming\Microsoft\Windows\Start Menu\Programs
нужно создать ярлык с названием Emacs и в свойстве target
указать следующее:
"C:\Program Files\Emacs\x86_64\bin\emacsclient.exe" -c -n -f "c:\Users\Valen\.emacs.d\server\server" -a=
Где -f "c:\Users\Valen\.emacs.d\server\server"
указывает на файл сокета. Помните, мы меняли домашнюю директорию? Так вот да, есть последствия.
Перенастройка
Linux’овый конфиг Emacs’а не давал нормально запускаться. Пришлось искать и лечить.
В частности, пришлось отключить pinentry-интеграция (в винде она всё равно не актуальна):
(if (string= system-type "gnu/linux")
(progn (setenv "INSIDE_EMACS" (format "%s,comint" emacs-version))
(setq epa-pinentry-mode 'loopback)
(pinentry-start)))
PowerShell
Для полного счастья не хватало только PowerShell в shell-mode. Делается это добавлением следующего в конфиг Emacs:
(if (string= system-type "windows-nt")
(setq
shell-file-name "C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe"
explicit-powershell.exe-args '("-InputFormat" "Text" "-NoLogo")))
Правда, автодополнение не завелось пока что.
Что ещё?
Очевидно, не завелись ни grep, ни silversearcher-ag, что печалит. Но наверняка найдётся выход и из этого положения.
Плюс я не занимался вопросом интеграции с git, потому что, очевидно, под виндой не занимаюсь написанием кода.
Небольшое заключение
В WSL2 он (Emacs) всё ещё работает быстрее а пользоваться им удобнее. Поэтому я всё-таки сделал symlink /mnt/c/Users/Valen → ~/winhome
и пользуюсь WSL’ным.
А, да, на днях вышел анонс Surface Laptop Studio, так что я пожалел, что взял Lenovo Carbon. Но теперь я знаю, что на винде есть жизнь.