GNU EMACS для технических писателей
282 subscribers
11 photos
19 files
87 links
Настройка, использование, хаки
Download Telegram
magit.pdf
150.2 KB
Добрый день, мои чюваки!

Я решил переписать с нуля главу про Magit. Выкладываю её на всеобщее обозрение для оценки читаемости и понятности.

Подписчики на Boosty чуть позже получат книгу, где эта глава будет переписана с учётом ваших замечаний и предложений. Так же там будет множество примеров использования Magit для выполнения типовых операций.
🔥9👍1
На Boosty опубликована новая версия книги. Глава про Magit переписана с нуля на основе ваших комментариев. Надеюсь, стало попроще.
Пока не описаны cherry-pick, stash и некоторые варианты, предложенные в комментариях. Это на следующее обновление.
5
Есть ли разница между [RET] и [C-j]?

На первый взгляд — нет. Но на самом деле [RET] учитывает настройки отступов и старается им соответствовать. Когда вы работаете с файлами ReStructured Text или Python это особенно заметно, т. к. Emacs не только переносит курсор на новую строку, но ещё и вставляет нужное (по его мнению) количество пробелов:

*  Элемент списка
Позиция курсора после нажатия [RET].


С [C-j] история попроще — заканчиваем эту строку и просто переносим курсор в начало следующей, без магии отступов:

*  Элемент списка
Позиция курсора после нажатия [C-j].


Зачем я вам об этом рассказываю? С целью экономии вашего времени: если отступ не нужен — используйте [C-j], а если нужен — [RET].
👍7
Многие утилиты при сборке проекта любят раскрашивать вывод в разные цвета с помощью последовательностей типа \033[0:31m и подобных. Bash заменяет эти последовательности на соответствующий цвет, получается красивый вывод: ошибки красные, успех зелёный, где-то жирность добавляют.

В Emacs по умолчанию буфер *compile* выводит всё как есть. При сборке проектов Sphinx в буфере нет цветов, зато есть последовательности, используемые для раскраски текста, и выглядит это некрасиво. Но это легко исправить:

;; 📦 ANSI-COLOR
(use-package ansi-color
:custom
(ansi-color-for-compilation-mode t "Расцветка буфера *compile*")
:hook
(compilation-filter . ansi-color-compilation-filter))
👍4
При работе над справочником по настройкам which-key я заметил, что по умолчанию этот пакет не хочет использовать все возможности Unicode. Исправим это:

;; 📦 WHICH-KEY MODE
;; https://elpa.gnu.org/packages/which-key.html
;; Показывает подсказки к сочетаниям клавиш.
(use-package which-key
:ensure t
:delight ""
:custom
(which-key-computer-remaps t "Выводить актуальные сочетания клавиш, а не «как должно быть»")
(which-key-dont-use-unicode nil "Используем Unicode")
(which-key-idle-delay 2 "Задержка появления подсказки")
(which-key-idle-secondary-delay 0.05 "Ещё одна задержка появления подсказки")
(which-key-show-major-mode t "То же самое что и [C-h m], но в формате which-key")
:config
(progn
(which-key-mode 1)
(which-key-setup-minibuffer)
(which-key-setup-side-window-right))) ;; Показывать подсказки справа


Влияет это буквально на три настройки: индикатор сокращённой строки (ellipsis), разделитель, перепривязанные клавиши. Но меня больше интересуют первые две настройки, всё ради них. Раньше было так:

DEL : backward-kill-sentence + : balance-windows
ESC : repeat-complex-command - : shrink-window-if-larget-t..
RET : +prefix . : set-fill-prefix
SPC : rectangle-mark-mode 0 : delete-window
TAB : indent-rigidly 1 : delete-other-windows


Теперь будет так:

DEL → backward-kill-sentence + → balance-windows
ESC → repeat-complex-command - → shrink-window-if-larget-t…
RET → +prefix . → set-fill-prefix
SPC → rectangle-mark-mode 0 → delete-window
TAB → indent-rigidly 1 → delete-other-windows

Главное чтобы используемый шрифт это всё поддерживал, иначе вместо и будет пустота.
👍6
Доброй ночи, дорогие подписчики!
На Boosty новая версия книги: https://boosty.to/simple-emacs/posts/30596aa2-0cd7-4ef4-9229-85e2135a350c?share=success_publish_link

Основные изменения:

1. Переписано описание базовых команд по выделению, вырезанию, копированию и вставке текста.
2. Исправлено несколько косяков в вёрстке.
3. Исправлены некоторые орфографические ошибки.
4. Добавлена инструкция как получить справку прямо в Emacs.
👍7
Увековечим великое:
Вкатился в 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