GNU EMACS для технических писателей
282 subscribers
11 photos
19 files
87 links
Настройка, использование, хаки
Download Telegram
На Boosty опубликовано техническое обновление книги. В AsciiDoc пустые строки являются частью синтаксиса, и иногда из-за этого одна глава "прилипает" к другой. Вставил пустые строки в начало, кажется, всех файлов, кроме src/index.adoc. Сейчас структура оглавления должна быть корректной. Обо всех найденных ошибках можете писать мне на почту dunmaksim@yandex.ru или в Telegram-канал с обсуждением книги.
👍3
В книгу вчера были добавлены описания того, как работать с окнами Emacs. Частично продублирую контент сюда.

[C-x 0] — закрыть активное окно.
[C-x 1] — сделать активное окно единственным. Все прочие окна будут закрыты.
[C-x 2] — разделить активное окно горизонтальной чертой.
[C-x 3] — разделить активное окно вертикальной чертой.
[C-x 4 1] и [C-x 4 4] — это префиксы. Указанная после них команда будет принудительно выполнена в том же самом окне или в отдельном соответственно. Кстати, существует несколько сокращений по умолчанию. Например, не нужно отдельно вызывать Dired, достаточно нажать [C-x 4 d], и указанный каталог будет открыт в новом окне.
👍2🔥1
Какое действие выполняет последовательность [C-x 4 f]?
Anonymous Quiz
8%
Запуск find-grep
63%
Запуск find-file
29%
Создаёт окно и перемещает в него курсор
Пожалуй, постановка последнего опроса не вполне корректна, ведь при выполнении find-file-other-window формально Emacs создаёт новое окно и перемещает в него курсор. Постараюсь в следующий раз формулировать вопросы и ответы без спешки.
Надоело, что в русской раскладке не работает команда dired-up-directory, привязанная к [^]. Решил проблему радикально:
(keymap-set dired-mode-map ":" 'dired-up-directory)
👍2🤯1
Последнее время дичайше обновляются разные пакеты:

1. Counsel и Ivy до 0.15.0. Используется для быстрого поиска. Может заменить собой [M-x], тогда команды можно будет искать не по начальным буквам, а по регулярным выражениям. Но не только их. counsel-load-theme отличная замена для load-theme, а counsel-describe-function — для describe-function. Странно, что этот пакет (точнее, семейство пакетов) до сих пор не стали встроенными.
2. Eglot до 1.18. Это такая реализация интерфейса для LSP-сервера от проекта GNU.
4. Jinx до 1.12. Наконец-то нормальная проверка орфографии, в том числе для мультиязычных текстов. В отличие от Flyspell автоматически проверяет весь буфер, а не только введённые строки.
5. Org до 9.7.24. Про этот режим можно отдельную книгу написать. Органайзер, список дел, список задач и так далее.
👍8
В разработке Emacs используется SemVer, но не совсем обычный. Версии с минорным 0 — это версии для разработчиков, а вот если минорная версия 1 и выше, то это уже считается релиз для повседневного пользования. Именно поэтому так странно выглядит история версий:

29.0 — для разработчиков;
29.1 — релиз;
30.0 — для разработчиков;
30.1 — релиз.
👍8
Маленькая хитрость: в русской раскладке не работает сочетание [M-@], потому что при этом вводится не собака, а двойная кавычка. Но поскольку команда mark-word используется довольно часто, а сочетание [M-"] ни к чему не привязано, имеет смысл добавить в init.el такую строку:

(keymap-global-set "M-\"" 'mark-word) ;; Чтобы в RU раскладке тоже работало
👍1
В продолжение последнего поста надо бы объяснить, что такое метод ввода и чем он отличается от раскладки.

Раскладка — это размещение клавиш на клавиатуре.
Метод ввода — реакция компьютера на нажатие клавиш или их последовательностей. Например, в некоторых методах ввода последовательные нажатия нескольких клавиш приводят к вводу одного символа (или лигатуры).

Для Emacs "родной" является раскладка EN/US QWERTY. Все нажатия клавиш он по умолчанию обрабатывает только в этой раскладке. Если на уровне системы вы включите для окна Emacs раскладку RU, то сочетания клавиш перестанут работать.

Решений несколько:

1. Установите пакет reverse-im. Это костыль, который не всегда работает хорошо. Например, [M-@] (mark-word) работать не будет, ведь в русской раскладке вместо @ вводится двойная кавычка ".


;; 📦 REVERSE-IM
;; https://github.com/a13/reverse-im.el
;; Чтобы сочетания клавиш работали в любой раскладке.
(use-package reverse-im
:ensure t
:custom
(reverse-im-input-methods '("russian-computer"))
:config
(reverse-im-mode 1))


2. Используйте переключение методов ввода внутри Emacs вместо смены раскладки на уровне системы. При этом желательно настроить на уровне системы отдельную раскладку для каждого окна и сделать EN раскладкой по умолчанию.

Список методов ввода Emacs определяет автоматически на основе списка локалей, установленных в системе. Для некоторых локалей могут быть доступны несколько методов ввода, но активен будет только один, который по умолчанию.

Для смены метода ввода в Emacs нажмите [C-\]. В строке статуса появится дополнительная метка RU. Ещё одно нажатие вернёт метод ввода к значению по умолчанию.

Если вы работаете более чем с двумя методами ввода, для включения нужного используйте команду set-input-method [C-x RET C-\]. По умолчанию для русского языка доступны методы russian-computer и russian-typewriter (как на печатных машинках).
5👍3
В Emacs "из коробки" несколько пакетов для работы с терминалом, пройдёмся по трём из них.


term.el

Команда: term.

Спросит какой интерпретатор вы хотите запустить, запустит его и будет работать как обычный терминал: вы вводите команды, интерпретатор их выполняет, Emacs показывает результаты работы в буфере *term*. Можно даже вместо /bin/bash указать psql или, скажем, python — тоже будет работать.

Минусы? Курсор всегда будет находиться в поле ввода команд. Ну, как в обычном терминале, короче.


shell.el

Команда: shell.

Ничего не спросит, а посмотрит в переменную окружения SHELL. Какой интерпретатор там указан, тот и будет запущен. У меня это /bin/bash.

Работает не как обычный терминал: можно перемещаться по выводу как по обычному буферу (я так примеры для книги делал — очень удобно). Чтобы вернуться ко вводу команд, нажмите [C->]. Переход по истории (при нахождении курсора в поле для ввода команд) — [M-n] и [M-p] соответственно.


eshell.el

Команда: eshell.

Интерпретатор, написанный на Emacs Lisp. Для работы такого терминала не нужны сторонние интерпретаторы, у него всё своё. Работают многие команды, доступные в оболочках типа Bash: ls, cp, diff и кое-какие другие. Полный список не вижу смысла приводить, он большой и лучше описан в документации.

Запомните эту команду: rename-uniquely, [C-x x u]. Она добавляет к названию буфера уникальный суффикс, тем самым позволяя открыть несколько буферов, которые по умолчанию доступны только в одном экземпляре. Например, *term* / *shell* / *eshell*.

1. Переключитесь на буфер с терминалом.
2. Нажмите [C-x x u].
3. Запустите новый терминал: [M-x shell RET].

Поздравляю! Теперь у вас открыто 2 терминала типа shell.

#терминал #shell #eshell #term
👍7
На Tech Writer Days 2 ни одного доклада про Emacs. Но если бы он был, вы бы пошли?
Anonymous Poll
63%
Да
38%
Нет
Пакет Counsel делает очень простую вещь: ускоряет выбор из списков. Он не заменяет собой Ivy, а работает на его основе.

Допустим, как работает обычная команда [M-x]? Вы вводите название команды, помогая себе с помощью [TAB]. То есть вам нужно знать с какого слова начинается название нужной команды.

Counsel предоставляет замену стандартной команде — counsel-M-x. Эта команда использует регулярные выражения для фильтрации записей. А это значит, что вы не обязаны знать с каких слов начинается название нужной команды: достаточно помнить хотя бы одну из частей, а Counsel сделает всё остальное.
Попробуем найти все команды со словом compile в названии:

1. [M-x counsel-M-x RET].
2. Удалите ^, т. к. этот символ в регулярных выражениях означает "начало строки". Другими словами, пока ^ находится в начале строки, Counsel интерпретирует команды так: "найди всё, что начинается с указанной строки", т. е. реализует обычное поведение Emacs.
3. Введите слово compile.

Обратите внимание на то, сколько ещё возможных вариантов предлагает Emacs. В моём случае всего 47 команд, содержащих слово "compile" в своём названии.

Перемещение между записями классическое — [C-n], [C-p].

В Counsel есть не только counsel-M-x, но и другие команды. Рекомендую:
;; 📦 COUNSEL
;; https://elpa.gnu.org/packages/counsel.html
;; Автодополнение на основе Ivy
(use-package counsel
:ensure t
:bind
(:map global-map
("C-c c" . counsel-compile)
("C-c g" . counsel-git)
("C-h f" . counsel-describe-function)
("C-h l" . counsel-find-library)
("C-h v" . counsel-describe-variable)
("C-x 8 RET" . counsel-unicode-char)
("C-x C-f" . counsel-find-file)
("M-x" . counsel-M-x)
("M-y" . counsel-yank-pop)))
👍8
Кто давно читает этот канал, обратил внимание, что я вставляю в код символ 📦, а в книге можно увидеть такую конструкцию: -->. К чему это всё?

Это небольшая хитрость, которую я подсмотрел у кого-то из активных пользователей Emacs: то ли Bozhidar Batsov, то ли Protesilaos Stavrou, уже не помню. Этот маркер не является частью синтаксиса и ни на что не влияет. Зато он позволяет быстро найти нужную настройку в init.el.

1. Нажмите [M-s o].
2. Введите 📦 или --> (смотря чем вы пользуетесь).
3. Нажмите [RET].

В буфере *Occur* вы увидите все нужные строки. Если вы переключитесь на этот буфер [C-x o], то сможете быстро перейти к нужной настройке.
А некоторые комментарии ещё как часть синтаксиса и имеют особое значение! Я про то, что написано в книге в главе "File Local Variables".

Допустим, у вас есть файл на Python, и вы хотите для переменной fill-column (переменной Emacs!) задать значение 120. Добавьте в конец файла такие строки:

# Local Variables:
# fill-column: 120
# End:


При открытии файла Emacs извлечёт значение этой переменной из комментария и задаст настройке указанное значение.

Лучший способ добавлять такие комментарии — использовать команду add-file-local-variable. Однако, я советую вам воздержаться от этого и всё-таки задавать значения настроек на уровне файлов .dir-locals.el.
👍6
Не обновляйте tree-sitter-langs до версии 0.12.268, там ошибка:

⛔️ Error (use-package): tree-sitter-langs/:catch: Eager macro-expansion failure: (error "Error calling (tar -xvzf tree-sitter-grammars.x86_64-unknown-linux-gnu.v0.12.268.tar.gz), exit code is 2")


Посидите пока на старой версии пакета.
👍3
В Emacs 29 разработчики добавили функцию setopt. Она работает так же, как customize-set-variable, но пишется значительно короче. Большого смысла в использовании setopt я не вижу, разве что ваш init.el усыпан setq: тогда, разумеется, лучше сделать замену. Про проблему setq я уже писал: она не вызывает сеттер, если он есть. А без этого значения многих настроек не применяются.
Добрый день, друзья!

Работа над книгой продолжается, недавно на Boosty вышла новая версия. Также часть контента доступна на моём сайте: я добавил описание настроек, которые предоставляет встроенный пакет rst.el: https://dunaevsky-ms.ru/emacs/emacs/packages/builtin/rst.html
👍5
Давайте поговорим про auto-mode-alist. Это такой ассоциированный список, где слева — регулярное выражение для имени файла, а справа — название основного режима. Благодаря auto-mode-alist Emacs понимает, какой режим надо использовать при открытии файлов.
Тут есть пара неочевидных свойств:

1. В auto-mode-alist уже есть какие-то значения. Как их посмотреть? describe-variable: [M-x describe-variable RET auto-mode-alist RET].
2. Нужно ли туда что-то добавлять вручную? Сейчас будет срыв покровов: во многих примерах в этом канале я писал ерунду, и многие примеры кода можно было бы сократить, убрав значения, предусмотренные авторами пакетов.

Допустим, у нас есть yaml-mode. Надо ли писать так?

(use-package yaml-mode
:ensure t
:mode
(("\\.yml\\'"
"\\.yaml\\'") . yaml-mode))


Даю подсказку: надо посмотреть код самого yaml-mode, а именно найти строку с переменной auto-mode-alist. Смотрим:

;;;###autoload
(add-to-list 'auto-mode-alist '("\\.\\(e?ya?\\|ra\\)ml\\'" . yaml-mode))


Ничего себе! Это регулярное выражение сложное, но включает не только .yml и .yaml! А значит, нам и делать ничего не нужно, всё будет работать само собой.

ВЫВОД: заполнение блока :mode в use-package или ручное добавление элементов в auto-mode-alist в императивном стиле имеет смысл только в том случае, когда нужное регулярное выражение не добавлено автором пакета. Например, нужно ассоциировать ruby-mode с файлами Vagrantfile, а вот с расширением .rb — не нужно.
🔥4👍1