GNU EMACS для технических писателей
285 subscribers
11 photos
19 files
87 links
Настройка, использование, хаки
Download Telegram
За удаление выделенного фрагмента при вводе нового текста отвечает:
Anonymous Quiz
44%
overwrite-mode
56%
delete-selection-mode
0%
read-only-mode
Давайте немного про overwrite-mode и delete-selection-mode расскажу. Вижу, что эта тема не всем достаточно понятна

Вы можете включить режим overwrite-mode, и в этом случае новые символы будут заменять уже стоящие в тех же позициях. Но на удаление выделенного фрагмента это не влияет.

Поведение Emacs по умолчанию при работе с выделенным текстом отличается от других редакторов. Например, если вы выделите текст в VS Code, а потом введёте любой символ, то он заменит собой весь выделенный фрагмент. В Emacs выделение будет снято, а новый символ будет вставлен в текущей позиции курсора.

Режим delete-selection-mode включает в Emacs такое же поведение, как и в других редакторах — ввод нового символа приводит к замене выделенного фрагмента.
This media is not supported in your browser
VIEW IN TELEGRAM
Демонстрация отличий overwrite-mode и delete-selection-mode.
👍8
Ничего себе! company дорос до версии 1.0.0! Кстати, я говорил, что он теперь под управлением проекта GNU?
https://elpa.gnu.org/devel/doc/company.html
🔥6
Курлык, и company версии 1.0.1 вышел. Феноменальная скорость, конечно. Кстати, забыл написать, что настройки здорового человека выглядят так:

;; 📦 COMPANY-MODE
;; https://company-mode.github.io/
;; Автодополнение
(use-package company
:ensure t
:vc (
:url "https://github.com/company-mode/company-mode.git"
:rev "1.0.1"
)
:delight ""
:demand t
:custom
(company-idle-delay 0.5 "Задержка вывода подсказки — полсекунды")
(company-minimum-prefix-length 2 "Минимум 2 знака, чтобы company начала работать")
(company-show-quick-access t "Показывать номера возле потенциальных кандидатов")
(company-tooltip-align-annotations t "Выровнять текст подсказки по правому краю")
(company-tooltip-limit 15 "Ограничение на число подсказок")
:hook
((css-mode
dockerfile-mode
emacs-lisp-mode
html-mode
latex-mode
lisp-data-mode
minibufer-mode
nxml-mode
org-mode
python-mode
rst-mode
ruby-mode
web-mode
) . company-mode)
:bind
(:map company-active-map
("TAB" . company-complete-common-or-cycle)
("M-/" . company-complete)
("M-." . company-show-location)))


Только у вас это не будет работать, пока не обновите use-package до версии 2.4.6, а также если в вашем Emacs нет пакета package-vc-install. Кажется, его в версии 29 добавили? Но вы можете при определённых условиях обновить даже встроенные пакеты. Нужно всего лишь на время задать для переменной package-install-upgrade-built-in значение t:

(customize-set-variable 'package-install-upgrade-built-in t)


Теперь package-lisp-packages "увидит" обновления для встроенных пакетов.

UPDATE: уже вышел релиз 1.0.2. WTF?
Не помню уже, чем мне в прошлый раз не угодил swiper, но было так: я его установил, включил, какое-то время попользовался, а потом удалил. После этого я набрёл на проект anzu, который делает то же самое, что и swiper, только уже давно не развивается.
Вот мой код для swiper:

;; 📦 SWIPER
;; https://elpa.gnu.org/packages/swiper.html
;; Умный поиск и отличная замена `isearch-forward' и
;; `isearch-backward'.
(use-package swiper
:ensure t
:bind (:map global-map
("C-s" . swiper-isearch)))


Это такой isearch-forward + isearch-backward, только он показывает все вхождения сразу, если они есть.
🔥1
Зачем задавать значение переменной source-directory? В Emacs не все переменные описаны в .el-файлах: его основной код написан на C, и очень часто, при вызове xref-find-definitions, Emacs открывает не какой-нибудь simple.el.gz, а, например, editfns.c.
Разумеется, исходный код Emacs не устанавливается вместе с самим Emacs. Чтобы получить доступ к описаниям переменных C, нужно сделать несколько дополнительных шагов:

1. Загрузить архив с кодом с сайта GNU.
2. Распаковать архив в какой-нибудь каталог. В Debian Linux для этого лучше всего подходит /usr/share/emacs/<версия>/src/.
3. Задать для переменной source-directory значение, указывающее на путь к каталогу с исходным кодом.

(customize-set-variable 'source-directory "/usr/share/emacs/29.4/src/")


Кстати, из исходного кода на C можно узнать много интересного. Вот вам цитата:

  DEFVAR_LISP ("menu-bar-mode", Vmenu_bar_mode,
doc: /* Non-nil if Menu-Bar mode is enabled.
See the command `menu-bar-mode' for a description of this minor mode.
Setting this variable directly does not take effect;
either customize it (see the info node `Easy Customization')
or call the function `menu-bar-mode'. */);
Vmenu_bar_mode = Qt;


Это очередное напоминание: нельзя использовать setq! Нужно использовать customize-set-variable и custom-set-variables для изменения настроек!
Проект GNU взял под крыло пакет indent-bars . Он используется для отображения линеек отступов. Многим из нас будет полезен, особенно тем, кто много работает с Markdown и ReStructured Text:

;; 📦 INDENT-BARS
;; https://github.com/jdtsmith/indent-bars
;; Красивая подсветка отступов
(use-package indent-bars
:ensure t
:hook ((emacs-lisp-mode
makefile-mode
markdown-mode
python-mode
rst-mode
yaml-mode
) . indent-bars-mode))
👍2
Раньше клавиши в Emacs привязывались с помощью функции global-set-key:

(global-set-key (kbd "последовательность") 'функция)


При этом внутри неё, как видите, ещё и дополнительный вызов функции kbd, которая по человекочитаемому описанию вычисляет код, используемый внутри Emacs. Например, последовательность [C-x C-c] внутри Emacs имеет ID ^X^C. То есть, чтобы правильно привязать сочетание клавиш, нужно было делать что-то такое:

(global-set-key (kbd "C-z") 'undo)


Сейчас функция global-set-key и родственная ей local-set-key отмечены как устаревшие, и вместо них нужно использовать keymap-global-set и keymap-local-set соответственно:

(keymap-global-set "последовательность" 'функция)
(keymap-local-set "последовательность" 'функция)


Как видите, вызов kbd стал не нужен, а привязать [C-z] к undo стало чуть проще:

(keymap-global-set "C-z" 'undo)


#клавиши
5👍1
Какая функция привязана к сочетанию `[C-z]` по умолчанию?
Anonymous Quiz
11%
`undo`
2%
`undo-redo`
13%
`kill`
74%
`suspend-frame`
Ещё одна бесячая привязка по умолчанию — [C-x C-p] к функции mark-page. Про страницы надо как-нибудь отдельно рассказать, а пока скажу лишь, что я пользуюсь Projectile, и там команды имеют префикс [C-x p]. И у меня часто бывает такое:
1. Хочешь запустить компиляцию проекта — [C-x p c].
2. На самом деле нажимаешь [C-x C-p c]: стираешь содержимое буфера и вставляешь символ c (или с 😊).

Решение: отвязать функцию mark-page от последовательности [C-x C-p]:

(keymap-global-unset "C-x C-p")
Здравствуйте, дорогие читатели!
На Boosty доступна версия книги 24.10, и теперь сразу в двух редакциях — обычной и Monokai. Отличий в содержимом нет, только в теме оформления. Сейчас покажу, как это выглядит.
Про мизинец, который в английском "pinki".

На клавиатурах для LISP-машин клавиша [Ctrl] размещалась там, где сейчас [Alt]. А там, где сейчас [Ctrl], находилась клавиша [Meta]. Поэтому сочетания для Emacs были там весьма удобны: зажимаешь большим пальцем [Ctrl], потом нужную клавишу. Сейчас [Ctrl] приходится нажимать мизинцем, и это породило целый мем среди пользователей редактора: "pinki problem".

Есть разные способы решения этой проблемы, но основных два:
- повесить Ctrl на CapsLock и нажимать его ребром ладони;
- на уровне системы поменять поведение Ctrl и Alt, превратив их по сути в Meta и Ctrl.

Мне оба способа не нравятся, и я пользуюсь обычными сочетаниями. Мизинец не болит.

Если у вас болит — посмотрите пакет ergoemacs-mode.
👍2
В канале Любители AsciiDoc спросили, как быстро перемещаться между разделами в больших AsciiDoc-файлах в Sublime Text.
У пользователей Emacs несколько вариантов:

1. occur с регулярным выражением "^=* " (обратите внимание на пробел после =).
2. isearch. Классика.
3. minimap. Помните такой? Он всё ещё жив, но у меня работает как-то глючно, поэтому не пользуюсь.
4. breadcrumb-mode. У него есть команда breadcrumb-jump, которая как occur, только по заголовкам. Правда, есть большой вопрос: "А что она считает заголовком?" Я её потестировал на исходном коде книги, и увидел дублирование некоторых пунктов в результатах поиска.
В связи с новостью о блокировке действующих лицензий JetBrains процитирую с незначительными изменениями часть известной копипасты:

"Мы останавливаем действие лицензий для пользователей из России!" — раздался пронзительный голос со стороны JetBrains.
Но пользователи GNU Emacs, VIM и Neovim, как всегда, не обратили внимания на это визгливое кукареканье. Пусть кукарекают, что с них взять?
👍4