На Boosty опубликовано техническое обновление книги. В AsciiDoc пустые строки являются частью синтаксиса, и иногда из-за этого одна глава "прилипает" к другой. Вставил пустые строки в начало, кажется, всех файлов, кроме
src/index.adoc
. Сейчас структура оглавления должна быть корректной. Обо всех найденных ошибках можете писать мне на почту dunmaksim@yandex.ru или в Telegram-канал с обсуждением книги.boosty.to
v25.02.20 - Максим Дунаевский
Техническое обновление, связанное с исправлением вёрстки.
👍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], и указанный каталог будет открыт в новом окне.
[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], тогда команды можно будет искать не по начальным буквам, а по регулярным выражениям. Но не только их.
2. Eglot до 1.18. Это такая реализация интерфейса для LSP-сервера от проекта GNU.
4. Jinx до 1.12. Наконец-то нормальная проверка орфографии, в том числе для мультиязычных текстов. В отличие от Flyspell автоматически проверяет весь буфер, а не только введённые строки.
5. Org до 9.7.24. Про этот режим можно отдельную книгу написать. Органайзер, список дел, список задач и так далее.
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. Про этот режим можно отдельную книгу написать. Органайзер, список дел, список задач и так далее.
GitHub
GitHub - abo-abo/swiper: Ivy - a generic completion frontend for Emacs, Swiper - isearch with an overview, and more. Oh, man!
Ivy - a generic completion frontend for Emacs, Swiper - isearch with an overview, and more. Oh, man! - abo-abo/swiper
👍8
В разработке Emacs используется SemVer, но не совсем обычный. Версии с минорным
29.0 — для разработчиков;
29.1 — релиз;
30.0 — для разработчиков;
30.1 — релиз.
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. Установите пакет
2. Используйте переключение методов ввода внутри Emacs вместо смены раскладки на уровне системы. При этом желательно настроить на уровне системы отдельную раскладку для каждого окна и сделать EN раскладкой по умолчанию.
Список методов ввода Emacs определяет автоматически на основе списка локалей, установленных в системе. Для некоторых локалей могут быть доступны несколько методов ввода, но активен будет только один, который по умолчанию.
Для смены метода ввода в Emacs нажмите [C-\]. В строке статуса появится дополнительная метка
Если вы работаете более чем с двумя методами ввода, для включения нужного используйте команду
Раскладка — это размещение клавиш на клавиатуре.
Метод ввода — реакция компьютера на нажатие клавиш или их последовательностей. Например, в некоторых методах ввода последовательные нажатия нескольких клавиш приводят к вводу одного символа (или лигатуры).
Для 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 "из коробки" несколько пакетов для работы с терминалом, пройдёмся по трём из них.
Команда:
Спросит какой интерпретатор вы хотите запустить, запустит его и будет работать как обычный терминал: вы вводите команды, интерпретатор их выполняет, Emacs показывает результаты работы в буфере
Минусы? Курсор всегда будет находиться в поле ввода команд. Ну, как в обычном терминале, короче.
Команда:
Ничего не спросит, а посмотрит в переменную окружения
Работает не как обычный терминал: можно перемещаться по выводу как по обычному буферу (я так примеры для книги делал — очень удобно). Чтобы вернуться ко вводу команд, нажмите [C->]. Переход по истории (при нахождении курсора в поле для ввода команд) — [M-n] и [M-p] соответственно.
Команда:
Интерпретатор, написанный на Emacs Lisp. Для работы такого терминала не нужны сторонние интерпретаторы, у него всё своё. Работают многие команды, доступные в оболочках типа Bash:
Запомните эту команду:
1. Переключитесь на буфер с терминалом.
2. Нажмите [C-x x u].
3. Запустите новый терминал: [M-x shell RET].
Поздравляю! Теперь у вас открыто 2 терминала типа
#терминал #shell #eshell #term
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
www.gnu.org
Eshell
Eshell is a shell-like command interpreter implemented in Emacs Lisp. It invokes no external processes except for those requested by the user. It is intended to be an alternative to the IELM (see Lisp Interaction in The Emacs Editor) REPL1 for Emacs and with…
👍7
На Tech Writer Days 2 ни одного доклада про Emacs. Но если бы он был, вы бы пошли?
Anonymous Poll
63%
Да
38%
Нет
Пакет Counsel делает очень простую вещь: ускоряет выбор из списков. Он не заменяет собой Ivy, а работает на его основе.
Допустим, как работает обычная команда
Counsel предоставляет замену стандартной команде —
Попробуем найти все команды со словом
1. [M-x counsel-M-x RET].
2. Удалите
3. Введите слово
Обратите внимание на то, сколько ещё возможных вариантов предлагает Emacs. В моём случае всего 47 команд, содержащих слово "compile" в своём названии.
Перемещение между записями классическое — [C-n], [C-p].
В Counsel есть не только
Допустим, как работает обычная команда
[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, уже не помню. Этот маркер не является частью синтаксиса и ни на что не влияет. Зато он позволяет быстро найти нужную настройку в
1. Нажмите [M-s o].
2. Введите 📦 или
3. Нажмите [RET].
В буфере
-->
. К чему это всё?Это небольшая хитрость, которую я подсмотрел у кого-то из активных пользователей Emacs: то ли Bozhidar Batsov, то ли Protesilaos Stavrou, уже не помню. Этот маркер не является частью синтаксиса и ни на что не влияет. Зато он позволяет быстро найти нужную настройку в
init.el
.1. Нажмите [M-s o].
2. Введите 📦 или
-->
(смотря чем вы пользуетесь).3. Нажмите [RET].
В буфере
*Occur*
вы увидите все нужные строки. Если вы переключитесь на этот буфер [C-x o], то сможете быстро перейти к нужной настройке.А некоторые комментарии ещё как часть синтаксиса и имеют особое значение! Я про то, что написано в книге в главе "File Local Variables".
Допустим, у вас есть файл на Python, и вы хотите для переменной
При открытии файла Emacs извлечёт значение этой переменной из комментария и задаст настройке указанное значение.
Лучший способ добавлять такие комментарии — использовать команду
Допустим, у вас есть файл на 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 вышла новая версия. Также часть контента доступна на моём сайте: я добавил описание настроек, которые предоставляет встроенный пакет
Работа над книгой продолжается, недавно на Boosty вышла новая версия. Также часть контента доступна на моём сайте: я добавил описание настроек, которые предоставляет встроенный пакет
rst.el
: https://dunaevsky-ms.ru/emacs/emacs/packages/builtin/rst.html👍5
Давайте поговорим про
Тут есть пара неочевидных свойств:
1. В
2. Нужно ли туда что-то добавлять вручную? Сейчас будет срыв покровов: во многих примерах в этом канале я писал ерунду, и многие примеры кода можно было бы сократить, убрав значения, предусмотренные авторами пакетов.
Допустим, у нас есть
Даю подсказку: надо посмотреть код самого
Ничего себе! Это регулярное выражение сложное, но включает не только
ВЫВОД: заполнение блока
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