GNU EMACS для технических писателей
272 subscribers
11 photos
19 files
87 links
Настройка, использование, хаки
Download Telegram
Увековечим великое:
Вкатился в Emacs с третьей попытки и так и остался. Емакс – это не редактор, и даже не ОС. Емакс – это манифестация коллективного аутизма, выраженная в коде. Примерно как мальчики на пляже собираются и строят замки из песка вместе, без какого-либо планирования и процесса, так же сборище поехавших аутистов собрались и сделали Емакс. Это было просто неизбежно. Емакс не мог не быть написан.

Оригинал: https://www.linux.org.ru/forum/desktop/17998582?cid=17998705
👍6🔥511
Одна из особенностей Antora в том, что исходники документации лежат в одном репозитории (мы рассматриваем самый простой случай), а для сборки надо запускать команды в другом. Как решить эту проблему? Довольно просто. Я использую Projectile, поэтому добавил в свой .dir-locals.el каждого репозитория с исходниками документации такое:

((nil . ((projectile-project-compilation-cmd . "cd ../antora && make"))))


Как использовать? Да как обычно: [C-x p p c RET]. Наверное, можно забиндить на какую-нибудь F-клавишу, но мне туда лень тянуться.
Добрый день, друзья!
Новости:
1. На Boosty новая версия книги: https://boosty.to/simple-emacs/posts/9e5fcb7a-d4ac-4b7a-a5d2-05411d1c7a30
2. Теперь не обязательно оформлять подписку, можно покупать отдельные посты.
3. В каждом посте будут доступны форматы EPUB и PDF, причём PDF в светлой теме оформления и Monokai.
4. В Telegram-канал книга будет выкладываться только в белой теме и с задержкой в полгода.
👍7
По мотивам сегодняшнего обсуждения в чате.

Я не люблю стрелочки. Чтобы их использовать, надо сдвинуть правую руку с её обычной позиции на ширину ладони вправо. Если у вас полноразмерная клавиатура, то ещё дальше. На ноутбуках клавиши со стрелками часто делают маленькими. Т. е. выделять текст удобнее с помощью команд Emacs, а не зажав Shift и двигая стрелки. Однако, есть несколько исключений, которые я сделал для себя.

Начнём с того, как стрелки называются в Emacs:

<left>
<right>
<up>
<down>

;; 📦 WINDMOVE
;; Встроенный пакет для быстрого переключения окон.
;; Перемещение между окнами Emacs.
(use-package windmove
:config
(progn
(windmove-default-keybindings 'ctrl)
(windmove-swap-states-default-keybindings 'meta)))


windmove это встроенный пакет, его даже не надо устанавливать отдельно. Что он даёт? После его активации вы можете переходить между окнами Emacs, зажав Ctrl и нужную стрелку. Например, хотите перейти в окно справа от активного? Нажмите [C-<right>]. В обычном режиме для этого нужно было бы нажимать [C-x o] или [C-x O], т. е. на одну клавишу больше.

Некоторые режимы, например, Magit и IBuffer, а также компиляция, любят создавать собственные окна, т. е. ломать существующий порядок. На них тоже есть управа — встроенный пакет winner:

;; 📦 WINNER-MODE
;; Встроенный пакет для управления состояниями окон.
;; https://www.gnu.org/software/emacs/manual/html_node/emacs/Window-Convenience.html
;; Для управления конфигурациями окон используются последовательности
;; [C-c <left>] и [C-c <right>]
(use-package winner
:config
(winner-mode 1))


После его активации состояние окон (всех окон! всех сразу!) можно менять с помощью [C-c <left>] или [C-c <right>]: влево — отмена, вправо — отмена отмены.

Примечание: в использовании Emacs нет догм. Нет "единственно верного пути" типа "настоящий емаксер не пользуется стрелками". Как вам удобно, так и делайте.
👍6🔥3
В продолжение темы переключения окон.

Я когда-то использовал пакет ace-window. Он очень просто работает:

1. Нажмите [M-o].
2. Если окон два, ace-window просто переместит фокус с активного окна на неактивное.
3. Если окон больше двух, ace-window нарисует в левом верхнем углу каждого из них номер. Нажмите цифру с этим номером, и окажетесь в нужном окне. Т. е. если у вас 4 окна, вы можете из первого попасть в четвёртое по нажатию трёх клавиш.

Удобно? Удобно.

Но если вы не хотите использовать ace-window, можно привязать M-o к встроенной команде next-window-any-frame: фокус будет переключаться циклически между всеми открытыми окнами:


;; 📦 FRAME
;; Встроенный пакет.
;; Управление фреймами.
(use-package frame
:custom
(window-divider-default-places 't "Разделители окон со всех сторон (по умолчанию только справа)")
(window-divider-default-right-width 3 "Ширина в пикселях для линии-разделителя окон")
(frame-resize-pixelwise t "Размер фреймов считать по пикселям а не по символам")
:bind
(:map global-map
("C-x O" . previous-window-any-frame) ;; Перейти в предыдущее окно
;; Перейти в следующее окно
("C-x o" . next-window-any-frame)
("M-o" . next-window-any-frame)))
👍4
На Boosty новый пост, на этот раз экспериментального формата: помимо книги там ещё и видео, показывающее как пользоваться Avy.
https://boosty.to/simple-emacs/posts/fb39b1c5-8fc5-4ebe-b710-6ed944ca8ab8?share=post_link
👍4
Сегодня разберём небольшой практический пример использования регулярных выражений. Допустим, у нас большое количество опций, которые нужно описать. Ну и вёрстка, само собой. Пусть у нас используется формат ReStructured Text, как более распространённый, чем AsciiDoc.

name
user
image
force
enabled


Мы хотим получить вёрстку типа такой:

.. option:: name

TODO

.. option:: user

TODO

.. option:: image

TODO

.. option:: force

TODO

.. option:: enabled

TODO


Про существование multiple-cursors сейчас забудем.

Итак.

1. Выделите текст. Достаточно нажать [M-h].
2. Вызовите команду replace-regexp.
3. Введите выражение для поиска ^\(.+\) и нажмите [RET].
4. Введите выражение замены:

.. option:: \1

TODO


Просто напоминаю, что переход на новую строку в минибуфере делается так: [C-q C-j].

5. Нажмите [RET]. Ура! Мы получили нужный результат.

Теперь разберём само выражение.

^ — это маркер начала строки.
.+ — любые символы в любом количестве.

А что это за круглые скобки и зачем они экранированные? А это — выделение нумерованной группы. Если по-простому, мы говорим движку регулярных выражений: "Вот этот фрагмент, когда найдёшь, сохрани куда-нибудь, он мне позже понадобится". Экранирование же нужно для того, чтобы Emacs не воспринимал скобки буквально. Без \ он бы начал искать строки типа таких:

(текст любой длины)

А строки типа таких не видел бы в упор:

текст любой длины, но без скобок в начале и конце


Фрагмент мы сохранили. Далее можно обратиться к нему по индексу, причём в регулярных выражениях они начинаются с единицы. А чтобы движок воспринимал индекс именно как индекс, а не как число, мы снова используем экранирование: \1. Эта запись означает "Вставить сюда текст, найденный при поиске первой группы".
🔥6👍21
Было такое, что перемещали куда-то курсор, а потом хотели бы быстро вернуться назад? Было. Как решить эту проблему?

1. Сохранить позицию в регистр.
2. Создать закладку и прыгнуть к ней.
3. Использовать пакет cursor-undo.

Первые 2 способа требуют дополнительных усилий (работа с регистрами в целом не очень приятна), а вот третий сейчас рассмотрим:

;; 📦 CURSOR-UNDO
;; https://elpa.gnu.org/packages/cursor-undo.html
;; Отмена работает в том числе на перемещение курсора.
(use-package cursor-undo
:ensure t
:pin "gnu"
:config (cursor-undo 1))


Добавьте в init.el и выполните этот код. Теперь перемещения курсора хранятся в списке отмен. Переместились куда-то и хотите быстро вернуться назад (в пределах одного и того же буфера)? Нажмите одно из сочетаний клавиш отмены:

[C-/]
[C-_]
[C-z] (это если вы перебиндили привязку, как я писал выше).
🔥6
Добрый день!
У меня сегодня нет электричества, поэтому пишу с калькулятора на солнечных батареях. Предыдущие 2 недели я болел, но это не значит, что обновления книги на Boosty не будет. Будет! Добавится новая глава про настройки ядра.

Вот тут немножко остановимся.

Ядро Emacs написано на языке C, а пакеты для него – на языке Emacs Lisp.

Большая часть настроек описана именно в файлах с расширением .el. Для использования этих настроек надо загрузить соответствующий модуль и вызвать customize-set-variables (use-package неявно делает то же самое в блоке :custom).

А вот настройки ядра хранятся в коде на языке C, и чтобы использовать их, про них нужно знать. Загрузку модуля делать не нужно.

Могут ли эти настройки быть вам полезны? Ещё как! Настройки ядра это (включая но не ограничиваясь):

1. Создание lock-файлов.
2. Пищание.
3. Поведение TAB.
4. Внешний вид курсора.
5. Настройки сборщика мусора.
И многое, многое другое.
👍13
Сервер GNU ELPA обновил ключ GPG, который используется для подписи пакетов. Это создаёт определённые проблемы при загрузке и установке пакетов из архива GNU ELPA. Решений несколько:

1. Правильное решение: импорт нового ключа в связку GPG:

gpg --keyserver keyserver.ubuntu.com --recv-keys 645357D2883A0966

2. Неправильный путь: выключение проверки подписей на уровне GNU Emacs:

(customize-set-variable
'package-check-signature nil)

Это решение плохое по нескольким причинам сразу, но основная — проверка подписи выключается не только для GNU ELPA, а для всех архивов вообще. По возможности избегайте.

3. Пользователи Seahorse могут использовать эту утилиту для загрузки ключей:

3.1. Запустите Seahorse.
3.2. Нажмите кнопку вызова главного меню и выберите Параметры.
3.3. Нажмите кнопку Добавить сервер ключей.
3.4. Выберите тип Сервер ключей HTTPS, а в поле Узел укажите keyserver.ubuntu.com. Поле с номером порта заполнять не нужно.
3.5. Закройте окно Параметры и выберите в главном меню Найти ключ в из сети (да, там опечатка).
3.6. В окне Найти ключи в сети введите идентификатор ключа 645357D2883A0966 и нажмите кнопку Искать.
3.7. В окне со списком найденных ключей нажмите кнопку загрузки.
3👍1
IMenu

Никакого отношения к корпорации Apple эта функция Emacs не имеет. А что это вообще такое? Это интерактивное меню, позволяющее быстро переходить к нужным местам в коде.

Если в вашем файле есть несколько разделов, заголовки и так далее, то это будет работать.

1. Нажмите [M-g i], и Emacs покажет список с компонентами первого уровня.
2. Выберите нужный пункт и нажмите [RET].
3. Если в выбранном пункте есть подпункты, Emacs их покажет.
4. Повторяйте шаги 2 и 3 до тех пор, пока не найдёте нужное. В последний момент Emacs переместит вас в нужное место.

Как использовать IMenu на практике? Для навигации в больших файлах, когда вам примерно известно, что и где находится, и вы просто хотите быстро перейти к нужному месту, а использовать закладки или регистры — не хотите.

Почитать в документации на сайте GNU: https://www.gnu.org/software/emacs/manual/html_node/emacs/Imenu.html
👍6🔥1
Только что под руку подвернулся хороший пример использования регулярных выражений. Разберём его.

Списки можно оформлять по-разному, но, например, в документации Yandex Cloud принят подход, при котором в конце строк ставится точка с запятой, если все строки состоят только из одного предложения. В конце последнего элемента списка ставится точка.

Версии Debian:

* 12 Bookworm;
* 11 Bullseye;
* 10 Buster;
* 9 Stretch.


Допустим, у нас уже есть список версий Ubuntu:

Версии Ubuntu:

* 14.04 Trusty Tahr.
* 16.04 Xenial Xerus.
* 18.04 Bionic Beaver.
* 20.04 Focal Fossa.
* 22.04 Jammy Jellyfish.


Ну, в чём проблема сделать из этого списка такой же, как в первом случае? Просто заменим точки на точку с запятой. Ничего плохого ведь не случится, правда?

Версии Ubuntu:

* 14;04 Trusty Tahr;
* 16;04 Xenial Xerus;
* 18;04 Bionic Beaver;
* 20;04 Focal Fossa;
* 22;04 Jammy Jellyfish;


Так, погодите-ка. А почему точка в номере версии тоже стала точкой с запятой? Нам этого не надо. Сейчас можно и руками поправить. Но представьте, что у вас список из 50 элементов. В таком случае задачу поможет решить регулярное выражение.

Нам нужно найти точку, стоящую в конце строки.

Символ . в регулярных выражениях означает "вообще любой символ", поэтому её надо экранировать:

\.


Символ конца строки обозначается знаком $:

\.$


Давайте сделаем замену:

1. Выделите список и вызовите команду replace-regexp.
2. Введите выражение \.$ и нажмите [RET].
3. Введите строку замены ; и нажмите [RET].
4. Исправьте точку с запятой на точку в последнем элементе списка.

Поздравляю! С помощью регулярных выражений вы сэкономили себе немного времени.
👍5🔥2
Лучшее автодополнение для минибуфера
Anonymous Poll
16%
Avy
13%
Helm
2%
Icomplete
69%
Vertico
На Boosty вышла новая версия книги, с IComplete, Vertico, Helm и Counsel. Порядок глав мне сейчас не очень нравится. Я даже подумываю отказаться от деления книги на главы по алхимическому принципу.
https://boosty.to/simple-emacs/posts/3be25add-53b5-41c1-918e-034ce37022c4?share=post_link
👍4
gnu-emacs-for-technical-writers-25.02.09-white.pdf
5.3 MB
А это старая версия книги, от 9 февраля этого года.