У Emacs есть неприятная особенность при работе со ссылками.
1. Вы запустили Emacs и открыли ссылку.
2. Emacs запустил браузер и передал ссылку ему.
3. Браузер открыл ссылку, показал страницу.
4. Вы работаете дальше: пишете текст, смотрите задачи в трекере, читаете Habr, OpenNet или LOR, и так далее.
5. По какой-то причине вы решили завершить работу Emacs.
6. Браузер тоже завершил работу, хотя вы об этом не просили.
Поэтому лучше запускать браузер до того, как открывать какие-либо ссылки в Emacs. Тогда точно закрываться не будет.
1. Вы запустили Emacs и открыли ссылку.
2. Emacs запустил браузер и передал ссылку ему.
3. Браузер открыл ссылку, показал страницу.
4. Вы работаете дальше: пишете текст, смотрите задачи в трекере, читаете Habr, OpenNet или LOR, и так далее.
5. По какой-то причине вы решили завершить работу Emacs.
6. Браузер тоже завершил работу, хотя вы об этом не просили.
Поэтому лучше запускать браузер до того, как открывать какие-либо ссылки в Emacs. Тогда точно закрываться не будет.
👍1
Какие из указанных терминов не используется в Emacs?
Anonymous Quiz
11%
symbol
3%
word
5%
char
8%
paragraph
13%
sentence
8%
page
42%
footnote
11%
line
Поговорим о частях текста в Emacs.
Слово
Word — последовательность символов. Слова отделяются друг от друга разделителями — пробелами, точками, запятыми, подчёркиваниями. Для Emacs
Sentence это "предложение", то есть часть текста, в конце которой стоит точка, восклицательный или вопросительный знак. А как же переход на новую строку? А никак. В ReStructured Text, AsciiDoc и некоторых диалектах Markdown это всё — одно предложение. Вот вам пример в ReStructured Text:
При сборке получится такое:
Paragraph — этоабзац. Surprise, motherfucker! Абзацы отделяются друг от друга пустыми строками. Это значит, что вот это — один абзац , хотя тут 3 предложения:
Page — это страница. Тут ничего нового. Вы вряд ли их используете в повседневной работе с Emacs, но наверняка встречали. В тексте они выглядят как последовательность
Line — это просто строка. Они бывают видимые и логические. Логическая строка — это последовательность символов между символами начала и конца строки. Видимая строка — это часть логической строки, отображаемая в одну линию. Вы наверняка используете режим
А вот никаких footnote в Emacs нет. В Sphinx их можно добавить с помощью плагина, а в AsciiDoc они входят в спецификацию.
symbol
и char
на русский переводятся как "символ", но первое слово имеет значение "слово, имеющее строго определённое значение". Переменная — symbol, название класса — symbol
и так далее.Слово
char
уже ближе к тому, что мы обычно подразумеваем под этим: буква, цифра, дефис, тире, пробел и так далее. Т. е. неделимая часть текста.Word — последовательность символов. Слова отделяются друг от друга разделителями — пробелами, точками, запятыми, подчёркиваниями. Для Emacs
UserAccess
— одно слово, а User-Access
— два. User Access
— тоже два. Use apt-get
— три. Дефис играет роль разделителя.Sentence это "предложение", то есть часть текста, в конце которой стоит точка, восклицательный или вопросительный знак. А как же переход на новую строку? А никак. В ReStructured Text, AsciiDoc и некоторых диалектах Markdown это всё — одно предложение. Вот вам пример в ReStructured Text:
Мой дядя самых честных правил,
Когда не в шутку занемог,
Он уважать себя заставил
И лучше выдумать не мог.
При сборке получится такое:
Мой дядя самых честных правил, Когда не в шутку занемог, Он уважать себя заставил И лучше выдумать не мог.
Paragraph — это
Мое любимое и главное подразделение людей в то время, о котором я пишу, было на людей comme il faut и на comme il ne faut pas.
Второй род подразделялся еще на людей собственно не comme il faut и простой народ.
Людей comme il faut я уважал и считал достойными иметь со мной равные отношения; вторых — притворялся, что презираю, но, в сущности, ненавидел их, питая к ним какое-то оскорбленное чувство личности; третьи для меня не существовали — я их презирал совершенно.
Page — это страница. Тут ничего нового. Вы вряд ли их используете в повседневной работе с Emacs, но наверняка встречали. В тексте они выглядят как последовательность
^L
. Нужны они для постраничного просмотра текста. Не приходилось использовать, и в целом не вижу смысла в этой штуке, но она до сих пор поддерживается.Line — это просто строка. Они бывают видимые и логические. Логическая строка — это последовательность символов между символами начала и конца строки. Видимая строка — это часть логической строки, отображаемая в одну линию. Вы наверняка используете режим
visual-line-mode
. Это значит, что если строка не влезает в экран, то та часть, что не влезла, просто переносится на новую строку.А вот никаких footnote в Emacs нет. В Sphinx их можно добавить с помощью плагина, а в AsciiDoc они входят в спецификацию.
👍5🔥1
Хотите стресс-тест для своего Emacs? Удалите каталог
.emacs.d/elpa/
и запустите редактор. Уверен, что в 9 случаях из 10 у вас что-то сломается. Считайте это налогом на свободу.Пакет
Если по какой-то причине ваш Emacs более старый, чем 27.1, вам поможет не обновлявшийся много лет пакет
pulsar.el
обновился до версии 1.2.0. Что он делает? Он заставляет "вспыхивать" строки, на которых находится курсор. Допустим, вы переключились на другой буфер. Где сейчас находится курсор? Приходится искать или нажимать [C-l]. pulsar-mode
подсветит вам позицию курсора автоматически, при том не только при переключении буфера. Собственные события достаточно добавить в список pulsar-pulse-functions
.(use-package pulsar
:ensure t
:custom (pulsar-pulse t)
:hook
(after-init . pulsar-global-mode)
(next-error . pulsar-pulse-line)
:config
(add-to-list 'pulsar-pulse-functions 'ace-window)
(add-to-list 'pulsar-pulse-functions 'flycheck-next-error)
(add-to-list 'pulsar-pulse-functions 'flyspell-goto-next-error)
(add-to-list 'pulsar-pulse-functions 'recenter-top-bottom))
Если по какой-то причине ваш Emacs более старый, чем 27.1, вам поможет не обновлявшийся много лет пакет
beacon.el
. Он делает то же самое, только чуть-чуть иначе. Версия в GNU ELPA 1.3.4, обновлена 31 марта этого года, но я бы не стал сильно рассчитывать на то, что пакет и дальше будет развиваться. Переходите на Pulsar.👍4
Тем временем на Boosty вышла версия v24.12-15.
1. Добавлено описание
2. Прошлый пост про Pulsar и Beacon тоже добавлен в книгу, только в расширенном формате.
3. Добавлено описание
4. Добавлено описание ещё нескольких параметров Dired, и ещё для многих пока стоят TODO. Очень их много, а описания некоторых настроек странные.
5. Унаследованы изменения, сделанные ещё в версии v24.11-29, а именно изменён порядок следования глав, почти с нуля переписан раздел про базовые операции редактирования текста.
https://boosty.to/simple-emacs
1. Добавлено описание
diff-hl
. Кому-то git-gutter
милее, а мне он почему-то не зашёл. Причины уже не помню, поэтому остановился на diff-hl
.2. Прошлый пост про Pulsar и Beacon тоже добавлен в книгу, только в расширенном формате.
3. Добавлено описание
outline-mode
. Что это такое? На GitHub при просмотре кода видели справа панель "Symbols"? Вот точно такую же можно сделать в Emacs. Прыгать по символам при этом удобнее чем на GitHub, потому что клавиши.4. Добавлено описание ещё нескольких параметров Dired, и ещё для многих пока стоят TODO. Очень их много, а описания некоторых настроек странные.
5. Унаследованы изменения, сделанные ещё в версии v24.11-29, а именно изменён порядок следования глав, почти с нуля переписан раздел про базовые операции редактирования текста.
https://boosty.to/simple-emacs
boosty.to
Максим Дунаевский - GNU Emacs для технических писателей
Exclusive content from Максим Дунаевский, subscribe and be the first to access!
gnu-emacs-for-technical-writers-v24.09.pdf
3 MB
А вот версия 24.09. Да, на три месяца позже, чем её получили подписчики на Boosty. Но раз я как-то написал, что буду публиковать сюда старые релизы, вынужден держать слово.
Подписчикам отдельное спасибо за то, что поддерживают мой труд. Кстати, с этого дня новые версии на Boosty будут публиковаться не 2 раза в месяц, а по завершении каждой главы.
Подписчикам отдельное спасибо за то, что поддерживают мой труд. Кстати, с этого дня новые версии на Boosty будут публиковаться не 2 раза в месяц, а по завершении каждой главы.
👍7
display-fill-column-indicator-mode
— встроенный режим, который отображает в буфере линию, показывающую достижение строкой предельного значения. На многих проектах есть жёсткие требования к длине строк, например, 80 или 120 знаков. В этом случае порядок действий такой:1. Добавьте в
init.el
код активации display-fill-column-indicator-mode
в нужных режимах:(require 'display-fill-column-indicator)
(add-hook 'emacs-lisp-mode-hook 'display-fill-column-indicator-mode)
(add-hook 'yaml-mode-hook 'display-fill-column-indicator-mode)
2. Создайте в каталоге проекта файл
.dir-locals.el
, в котором укажите максимально допустимую длину строки:((emacs-lisp-mode . ((fill-column . 80))
(yaml-mode . ((fill-column . 120)))))
Да, вы можете сделать нужные настройки и в
init.el
, используя функцию setq-local
, но лучше всё-таки настраивать отдельно для каждого проекта.Если вдруг вы захотите изменить значение
fill-column
"на лету":1. Нажмите [C-x f].
2. Введите допустимую длину строки.
3. Нажмите [RET].
display-fill-column-indicator-mode
это именно что индикатор, а не жёсткий ограничитель. Emacs не будет дробить ваши слишком длинные строки автоматически. Но в целом — этот режим может быть весьма полезен. Сам пользуюсь при работе с YAML, init.el
ну и ещё в нескольких режимах, по необходимости.👍4❤1🔥1
Раньше мы настраивали
Сейчас всё стало немного проще, достаточно присвоить настройке
y
и n
вместо yes
и no
так:(defalias 'yes-or-no-p 'y-or-n-p)
Сейчас всё стало немного проще, достаточно присвоить настройке
use-short-answers
значение t
:(customize-set-variable 'use-short-answers t "y и n вместо yes и no")
👍3
Вы не просили, но я вам покажу начало своего
init.el
:
(custom-set-variables
'(compilation-scroll-output t "Автоматическая прокрутка буфера *compilation*")
'(create-lockfiles nil "Не создавать lock-файлы")
'(cursor-type 'bar "Курсор в виде вертикальной черты")
'(default-input-method "russian-computer" "Метод ввода по умолчанию")
'(default-transient-input-method "russian-computer")
'(delete-by-moving-to-trash t "Удалять файлы в Корзину")
'(gc-cons-threshold (* 50 1000 1000) "Увеличить размер памяти для сборщика мусора")
'(indent-tabs-mode nil "Отключить `indent-tabs-mode'.")
'(inhibit-startup-screen t "Не показывать приветственный экран")
'(initial-scratch-message nil "Пустой буфер *scratch*")
'(load-prefer-newer t "Если есть файл elc, но el новее, загрузить el-файл.")
'(read-file-name-completion-ignore-case t "Игнорировать регистр при вводе имён файлов")
'(ring-bell-function 'ignore "Отключить звуковое сопровождение событий")
'(save-place-forget-unreadable-files t "Если файл нельзя открыть, то и помнить о нём ничего не надо")
'(scroll-bar-mode nil "Отключить полосы прокрутки")
'(scroll-conservatively 101 "TODO: проверить что это такое")
'(scroll-margin 4 "Отступ от верхней и нижней границ буфера")
'(show-trailing-whitespace t "Подсветка висячих пробелов")
'(standard-indent 4 "Отступ по умолчанию")
'(tab-always-indent 'complete "Если можно — выровнять текст, иначе — автодополнение.")
'(truncate-lines 1 "Обрезать длинные строки")
'(use-dialog-box nil "Диалоговые окна ОС не нужны")
'(use-short-answers t "Краткие ответы вместо длинных")
'(user-full-name "Dunaevsky Maxim" "Имя пользователя")
'(user-mail-address "dunmaksim@yandex.ru" "Адрес электронной почты")
'(vc-follow-symlinks t "Переходить по ссылкам без лишних вопросов")
'(visible-bell t "Мигать буфером при переходе в него"))
👍2
Если вы используете Emacs в режиме сервера, то он может загрузиться как до SSH Agent, так и после (так называемое неопределённое поведение). В первом случае пакеты, использующие SSH, будут каждый раз требовать у вас пароли от приватных ключей. Ну, например, Magit будет просить ввести пароль ключа при каждом
1. Откройте файл
2. Приведите его к такому виду:
3. Перезапустите сервер Emacs:
С этой секунды Emacs и SSH Agent — друзья на век, и пароли от ключей у вас никто спрашивать не будет.
git push
(вы же работаете с репозиториями через SSH, верно?). Чтобы такого не было, нужно немного поменять параметры службы emacs.service
.1. Откройте файл
~/.config/systemd/user/emacs.service
.2. Приведите его к такому виду:
[Unit]
Description=Emacs text editor
Documentation=info:emacs man:emacs(1) https://gnu.org/software/emacs/
[Service]
Type=notify
ExecStart=/usr/bin/emacs --fg-daemon
ExecStop=/usr/bin/emacsclient --eval "(kill-emacs)"
# Emacs will exit with status 15 after having received SIGTERM, which
# is the default "KillSignal" value systemd uses to stop services.
SuccessExitStatus=15
# The location of the SSH auth socket varies by distribution, and some
# set it from PAM, so don't override by default.
Environment=SSH_AUTH_SOCK=%t/keyring/ssh
Restart=on-failure
TimeoutSec=600
[Install]
WantedBy=default.target
3. Перезапустите сервер Emacs:
systemctl --user restart emacs.service
С этой секунды Emacs и SSH Agent — друзья на век, и пароли от ключей у вас никто спрашивать не будет.
Как вы управляете проектами в Emacs?
Anonymous Poll
23%
project.el
23%
projectile.el
55%
Никак, но хотел бы узнать, как это делать.
Настройки в Emacs условно можно разделить на 2 уровня: настройки пакетов и настройки ядра. Отличие в том, что настройки пакетов, даже встроенных, описаны в файлах
1. [C-h v].
2. Введите название настройки.
3. [RET]. В открывшемся буфере будет описание.
Для некоторых настроек (настроек ядра) эта команда работать не будет, если Emacs не будет знать, где лежит его исходный код. В этом случае делайте так:
0. Выясните версию Emacs, которым пользуетесь: [M-x emacs-version RET].
1. Идите на сервер GNU.
2. Загрузите архив с исходным кодом используемой версии Emacs.
3. Распакуйте архив в нужный каталог. Если у вас DEB-based дистрибутив, рекомендую разместить исходный код в каталоге
4. Попробуйте получить описание настройки
Обратите внимание на то, что эта настройка хранится в файле с расширением
.el
. При необходимости можно обратиться к этим файлам и почитать описание "из первых рук". Также можно использовать команду describe-variable
:1. [C-h v].
2. Введите название настройки.
3. [RET]. В открывшемся буфере будет описание.
Для некоторых настроек (настроек ядра) эта команда работать не будет, если Emacs не будет знать, где лежит его исходный код. В этом случае делайте так:
0. Выясните версию Emacs, которым пользуетесь: [M-x emacs-version RET].
1. Идите на сервер GNU.
2. Загрузите архив с исходным кодом используемой версии Emacs.
3. Распакуйте архив в нужный каталог. Если у вас DEB-based дистрибутив, рекомендую разместить исходный код в каталоге
/usr/share/emacs/<версия>/src/
. По умолчанию Emacs ищет свой исходный код там. Если не найдёт — добавьте в init.el
код, задающий значение настройки source-directory
:
;; Определение пути к каталогу с исходным кодом
(when (string-equal system-type "gnu/linux")
(message "Используется ОС на базе GNU/Linux")
(defvar init-el-emacs-source-path "Путь к каталогу с исходным кодом Emacs")
(setq init-el-emacs-source-path
(format "/usr/share/emacs/%d.%d/src/"
emacs-major-version
emacs-minor-version))
(if (file-exists-p init-el-emacs-source-path)
;; Каталог существует
(if (directory-empty-p init-el-emacs-source-path)
;; Каталог пуст
(message (format "Каталог %s пуст." init-el-emacs-source-path))
;; Каталог не пуст
(progn
(customize-set-variable 'source-directory init-el-emacs-source-path)
(message (format "Исходный код обнаружен в каталоге %s" init-el-emacs-source-path))))
;; Каталог не существует
(message (format "Каталог %s не существует." init-el-emacs-source-path))))
4. Попробуйте получить описание настройки
use-short-answers
. Теперь вместо сообщения о том, что исходный код не найден, Emacs выведет красивую справку:use-short-answers is a variable defined in ‘src/fns.c’.
Its value is t
Original value was nil
Non-nil means ‘yes-or-no-p’ uses shorter answers "y" or "n".
When non-nil, ‘yes-or-no-p’ will use ‘y-or-n-p’ to read the answer.
We recommend against setting this variable non-nil, because ‘yes-or-no-p’
is intended to be used when users are expected not to respond too
quickly, but to take their time and perhaps think about the answer.
The same variable also affects the function ‘read-answer’.
This variable was introduced, or its default value was changed, in
version 28.1 of Emacs.
You can customize this variable.
[back]
Обратите внимание на то, что эта настройка хранится в файле с расширением
.c
, а не .el
, то есть является частью ядра.🔥1
Как часто вы используете регулярные выражения?
Anonymous Poll
21%
Каждый день
15%
1-2 раза в неделю
36%
1-2 раза в месяц
27%
Каво?
gnu-emacs-for-technical-writers-v24.10.pdf
3.3 MB
Вот старая версия книги. А в новой, которая скоро будет выложена на Boosty, добавлю раздел про регулярные выражения.
👍6
Загадка на эти выходные: что делают эти две команды?
1.
2.
Вместо
1.
find ./ -name "*.<ext>" -exec grep -e "[A-Za-z][А-Яа-яЁё]" {} \;
2.
find ./ -name "*.<ext>" -exec grep -e "[А-Яа-яЁё][A-Za-z]" {} \;
Вместо
<ext>
подставьте расширение файлов, в которых хранится код ваших проектов: md
для Markdown, rst
для ReStructured Text, adoc
для AsciiDoc, tex
для LaTeX и так далее.👍1
Теперь ответ на приведённую выше задачу.
Утилита
Найденные файлы передаются в утилиту
При желании можно объединить эти две команды в одну, подправив регулярное выражение. Однако, при этом пострадает простота понимания. Регулярные выражения сложны сами по себе, поэтому не усложняйте их без веской причины.
Утилита
find
используется для поиска файлов. В данном случае выполняется поиск по части имени.Найденные файлы передаются в утилиту
grep
, которая выполняет поиск нужной строки. Только вместо строки у нас регулярное выражение, которое в первом случае означает "Найди места, где после символов латиницы идут символы кириллицы", а во втором случае — наоборот, "Найди места, где сначала идёт кириллица, а потом латиница".При желании можно объединить эти две команды в одну, подправив регулярное выражение. Однако, при этом пострадает простота понимания. Регулярные выражения сложны сами по себе, поэтому не усложняйте их без веской причины.
👍1
Команда
Эта запись означает следующее: искать только файлы (не каталоги и не символические ссылки), начиная с текущего каталога, а найденное передавать в
Что там разбирает
#find #grep #поиск
find-grep
в Emacs запускает утилиту find
, её вывод перенаправляет в grep
, а его вывод отображает в буфере. По умолчанию команда find
запускается с такими аргументами:find . -type f -exec grep
Эта запись означает следующее: искать только файлы (не каталоги и не символические ссылки), начиная с текущего каталога, а найденное передавать в
grep
.Что там разбирает
grep
пока опустим. Лучше подкрутим аргументы find
. Вряд ли вы хотите, чтобы утилита искала совпадения во всех файлах проекта, поэтому давайте добавим аргумент -name
, например:find . -type f -name "*.rst" -exec grep
#find #grep #поиск
👍4
На выходных поработал с интерпретатором Python в интерактивном режиме. VIM опять никому не нужен, а вот сочетания Emacs вполне себе работают: [C-a], [C-e], [M-f], [M-b], [C-f], [C-b] и ещё некоторые. Возможно, даже стоит написать статью на Хабр, где рассказать, что сочетания из Emacs можно использовать в Python и GNOME Terminal, а сочетания из VIM только в самом VIM.
👍1
По мотивам поста про бесячий автокомплит просто выложу свой код настройки
Теперь описание.
1. Если пакет не установлен,
2. В строке состояния ничего не выводится. Для этого я использую Delight. Код установки и инициализации в моём
3. Пакет
4. Настройки — самое интересное. То, о чём написано в ОП-посте, решается через правку
5. Всё остальное уже вкусовщина, настраивайте по своему усмотрению.
company-mode
:;; 📦 COMPANY-MODE
;; https://company-mode.github.io/
;; Автодополнение
(use-package company
:ensure t
:init
(unless (package-installed-p 'company)
(package-vc-install '(company
:url "https://github.com/company-mode/company-mode.git"
:branch "1.0.2")))
: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 ((adoc-mode
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)))
Теперь описание.
1. Если пакет не установлен,
package-vc-install
сделает это, при чём поставит фиксированную версию 1.0.2, а не нестабильную из MELPA.2. В строке состояния ничего не выводится. Для этого я использую Delight. Код установки и инициализации в моём
init.el
размещается выше.3. Пакет
company
загружается не сразу, а в фоне. Прямо после запуска он мне не нужен, поэтому :demand t
.4. Настройки — самое интересное. То, о чём написано в ОП-посте, решается через правку
company-idle-delay
и, при необходимости, company-minimum-prefix-length
.5. Всё остальное уже вкусовщина, настраивайте по своему усмотрению.
Telegram
Стой под стрелой
Бесит, когда автокомплит включен во время набора. Сидишь, никого не трогаешь, пишешь себе «pri», а оно радостно: «privet»? «pribor»? «prihod»? И твой же код рядом заслоняет. А ты, может, на него смотрел, может, в соседней строчке, которую заслонили, ответ…
👍1🔥1