Использование Emacs под Windows

<Вс 23 фев 2025>, обновлено <Сб 10 мая 2025>

Данная статья представляет собой инструкцию, в которой описывается установка и донастройка 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

Варианты инструкции по автозапуску:

На сайте 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.