Использование Emacs под Windows
, обновлено
Данная статья представляет собой инструкцию, в которой описывается установка и донастройка Emacs под Windows. Основной сценарий использования – работа в Org-mode: написание документации и отчётов; ведение списка задач. Как показывает опыт, проще и удобнее написать документ на своём компьютере, после чего экспортировать данные в OpenDocument и перенести на wiki. Как инструмент, который позволяет выгрузить из головы все рабочие цели и задачи, он тоже весьма неплох. Для синхронизации org-файлов, если есть такая необходимость, предполагается использовать Syncthing. Помимо этого, будет немного затронута работа с Git и настройка Magit, который позволяет удобно работать с репозиториями.
Подразумевается, что Emacs и Org-mode уже настроены, а конфиг лежит где-то на GitHub и его надо только немного адаптировать для Windows. В этом конфиге, помимо всего прочего, должен быть подключен репозиторий MELPA.
Окружение
В качестве домашней директории предполагается использовать просто директорию в корне диска, путь к которой необходимо прописать в переменную окружения HOME
. Вероятно, можно использовать директорию, которая указана в переменной HOMEPATH
, но этот сценарий полностью не проверялся.
Chocolatey
Первым делом необходимо установить choco: скачать скрипт, изменить политику выполнения по умолчанию и запустить сам скрипт.
Описание требуемой политики с сайта Microsoft (для домашних компьютеров политика по умолчанию – Restricted
):
- Scripts can run.
- Requires that all scripts and configuration files be signed by a trusted publisher, including scripts that you write on the local computer.
- Prompts you before running scripts from publishers that you haven't yet classified as trusted or untrusted.
- Risks running signed, but malicious, scripts.
Изменить политику через PowerShell и запустить установочный скрипт (всё это надо делать с правами администратора):
PS C:\Temp> Set-ExecutionPolicy AllSigned Изменение политики выполнения Политика выполнения защищает компьютер от ненадежных сценариев. Изменение политики выполнения может поставить под угрозу безопасность системы, как описано в разделе справки, вызываемом командой about_Execution_Policies и расположенном по адресу https:/go.microsoft.com/fwlink/?LinkID=135170 . Вы хотите изменить политику выполнения? [Y] Да - Y [A] Да для всех - A [N] Нет - N [L] Нет для всех - L [S] Приостановить - S [?] Справка (значением по умолчанию является "N"):Y PS C:\Temp> .\install.ps1
После установить необходимые программы следующим образом:
PS C:\Temp> choco install git emacs findutils grep ag hunspell.portable zip unzip miktex strawberryperl powertoys
Пояснение:
findutils
,grep
– привычные утилиты, без которых не будет работать рекурсивный поиск в директории по содержимому, то есть командаrgrep
;ag
– отличная заменаrgrep
, которая настраивается в три строчки (см. The Silver Searcher);zip
,unzip
– необходимые утилиты, без которых не будет работать экспорт в OpenDocument Text;miktex
,strawberryperl
– необходимые пакеты, без которых не будет работать экспорт в PDF;powertoys
– утилита от Microsoft, которая, в том числе, позволяет переназначать клавиши или сочетания клавиш.
В дальнейшем, чтобы обновить все установленные пакеты разом, можно использовать команду:
PS C:\Temp> choco upgrade all Chocolatey v2.4.2 Upgrading the following packages: all
Словари для Hunspell можно взять тут. Файлы index.dic
и index.aff
необходимо скопировать в директорию ~/.dicts
и назвать соответствующим образом (для русского языка эти файлы будут называться, соответственно, ru_RU.dic
и ru_RU.aff
).
Внутри MiKTeX уже есть, вероятно, знакомы вам шрифты:
- Comfortaa – подойдёт для написания отчётов, хотя не выглядит достаточно формальным;
- Computer Modern Bright – подойдёт для написания технических заметок, где есть формулы и тому подобное.
Emacs
Для запуска Emacs следует использовать команду runemacs.exe
. При желании, можно настроить запуск в режиме сервера, для этого необходимо:
- перейти в директорию
C:\ProgramData\chocolatey\bin
, где находитсяrunemacs.exe
; - создать ярлык;
- открыть свойства ярлыка и добавить аргумент
--daemon
; - переместить ярлык в директорию
shell:startup
; - для запуска клиентской сессии использовать
emacsclientw.exe
.
Настройка Emacs, которую можно добавить в custom.el
:
(defun hunspell-list-dicts(directory) "builds dictionary path alist for hunspell" (let ((root (expand-file-name directory))) (mapcar #'(lambda(file) (list (substring file 0 -4) (expand-file-name file root))) (directory-files root nil "[[:lower:]]\\{2\\}_[[:upper:]]\\{2\\}\\.dic")))) (defun fix-find-regexp (list) (mapcar #'(lambda(entry) (if (string-match "\\^find" (car entry)) (list (string-replace "^find" "find\\.exe" (car entry)) (cadr entry)) entry)) list)) (setq ;; make `rgrep' work find-program (expand-file-name "bin/find.exe" (getenv "ChocolateyInstall"))) (with-eval-after-load 'grep (setq grep-mode-font-lock-keywords (fix-find-regexp grep-mode-font-lock-keywords))) ;; make `hunspell' work (let ((root (expand-file-name ".dicts" (or (getenv "HOME") (getenv "HOMEPATH"))))) (setenv "DICPATH" root) (setenv "DICTIONARY" "en_US") (setq ispell-hunspell-dict-paths-alist (hunspell-list-dicts root)))
Про работу с Hunspell под Windows можно почитать у Xah Lee в статье Hunspell Tutorial. Автор статьи, помимо всего прочего, обращает внимание на то, что порт Hunspell для Windows содержит ошибку (можно убедиться, если выполнить команду hunspell -D
из консоли), которая заключается в том, что переменные окружения (имеются в виду DICPATH
и DICTIONARY
) не работают. Выше приведена функция hunspell-list-dicts
, которая позволяет обойти эту проблему.
Для того, чтобы полноценно заработала команда rgrep
, необходимо указать полный путь до утилиты find
, иначе будет запускаться встроенная в Windows утилита, которая не совместима с версией из пакета GNU Find Utilities. Помимо этого, необходимо подправить регулярку, которая используется, если включена опция grep-find-abbreviate
(она включена по умолчанию), которая скрывает часть команды в буфере compile
, чтобы не захламлять его лишней информацией.
Альтернативный вариант, который позволит не тратить время впустую, – использовать для поиска ag
(The Silver Searcher):
(use-package ag :bind ("C-c g" . ag-regexp) :defer t :ensure t)
Более подробно про доступные команды можно прочитать в краткой справке ag.el – Usage.
Изменить шрифт можно через меню, если вы забыли про его существование или никогда им не пользовались:
- Options → Set Default Font …
- Options → Save Options
Самый простой шаблон для org-документа, который использует один из упомянутых шрифтов:
#+LATEX_CLASS: article #+LATEX_CLASS_OPTIONS: [a4paper] #+LATEX_HEADER_EXTRA: \usepackage{cmbright} #+LATEX_HEADER_EXTRA: \hypersetup{colorlinks=true, urlcolor=blue} #+LATEX_HEADER_EXTRA: \setlength{\parindent}{0pt}
Git
В Windows есть встроенный ssh-клиент, а Git, по умолчанию, использует свой внутренний, который может быть не доступен из консоли (расположен в директории C:\Program Files\Git\usr\bin
, которая, по умолчанию, не добавляется в пути). Если есть необходимость, это поведение можно изменить через переменную GIT_SSH
, подробности тут.
Чтобы сгенерировать ключи посредством команды ssh-keygen
, необходимо перейти в упомянутую директорию и выполнить:
PS C:\Program Files\Git\usr\bin> ssh-keygen.exe -f ${Env:HOME}/.ssh/id_${Env:COMPUTERNAME}
Затем обновить ~/.ssh/config
(GitHub используется просто для примера):
Host github.com User git IdentityFile ~/.ssh/id_computer-name
После чего можно загрузить полученный pub-файл на GitHub, TFS и т.д.
Для корректной работы Magit необходимо установить ssh-agency, который доступен в списке пакетов MELPA:
(use-package ssh-agency :demand t :ensure t)
Данный пакет необходим по ряду причин:
- как уже упоминалось, ssh-клиент и сопутствующие утилиты расположены в нестандартном месте;
- без
ssh-agent
придётся вводить пароль от ключа на каждый push, а возможно и pull.
Syncthing
Установка:
PS C:\Temp> choco install syncthing
Варианты инструкции по автозапуску:
- Run at user log on using the Startup folder
- Run at user log on or at system startup using Task Scheduler
На сайте Chocolatey, в описание пакета, приводится следующий способ автозапуска:
New-Service Syncthing $env:ChocolateyInstall/bin/syncthing.exe -StartupType Automatic Start-Service Syncthing
Этот способ работает плохо: сервис запускается с ошибкой и его, к тому же, потом не удалить. По идее, это можно сделать при помощи команды sc delete Syncthing
, но даже после перезагрузки, сервис никуда не исчезает. Данный способ исследовался на Windows 10 Home и претензия может быть уже неактуальной.
В свойствах директории Syncthing можно настроить маску (вкладка Ignore Patterns), которая позволит не синхронизировать временные файлы Emacs:
*.*~ .#*
В конфиг Org-mode при этом необходимо добавить включение Auto Revert Mode, чтобы буфер перезагружался при изменение файла:
(add-hook 'org-mode-hook #'auto-revert-mode)
Клавиатура
Переназначить Caps Lock можно через уже упомянутую утилиту PowerToys.
Сначала отключаем лишние функции, чтобы оставить привычное поведение системы, и включаем полезные, на мой вкус:
- отключаем System Tools → Advanced Past;
- отключаем System Tools → Color Picker;
- включаем System Tools → PowerToys Run – приятная замена Win+R;
- отключаем System Tools → Screen Ruler;
- отключаем Windows & Layouts → FancyZones – интересная штука, но лучше поразбираться с ней потом;
- включаем Input/Output → Keyboard Manager – самое необходимое из этого всего, чтобы переназначить Caps Lock;
- отключаем Input/Output → Mouse Utilities.
Как переназначить Caps Lock:
- переходим в Input/Output → Keyboard Manager;
- выбираем Remap key;
- выбираем слева Caps Lock, а справа, соответственно, Control.