предположите, что у меня есть текстовый список в emacs как это:
a
b
c
...
d
Существует ли способ присвоить номера тем объектам в Emacs путем выбора региона? Конечные результаты должны быть похожими:
1. a
2. b
3. c
j. ...
n. d
Спасибо.
(defun number-region (start end)
(interactive "r")
(let* ((count 1)
(indent-region-function (lambda (start end)
(save-excursion
(setq end (copy-marker end))
(goto-char start)
(while (< (point) end)
(or (and (bolp) (eolp))
(insert (format "%d. " count))
(setq count (1+ count)))
(forward-line 1))
(move-marker end nil)))))
(indent-region start end)))
Я делаю это, что может быть не оптимальным, - использовать поиск и замену по регулярным выражениям. Это, конечно, требует, чтобы вы могли определить регулярное выражение, которое соответствовало бы началу строк, в которых вам нужны числа. Взяв ваш пример, я бы использовал следующее регулярное выражение поиска:
\([a-z]\)
обратите внимание на скобки захвата, нам скоро понадобится эта первая буква. И регулярное выражение replace, подобное этому:
\#. \1
где:
\ #
- это специальная форма, которая заменяется Emacs правильным числом (хотя см. Предупреждение ниже):
.
записывает остановку; и
\ 1
записывает пробел и захваченную группу.
ПРЕДУПРЕЖДЕНИЕ: Emacs пронумерует ваши элементы 0, 1, 2, ...
. Пока кто-нибудь не напишет нам, как начать с 1, я всегда вставляю фиктивный 0-й элемент перед редактированием, а затем удаляю его.
Вы можете использовать счетчик макросов клавиатуры Emacs .
Поместите курсор на одну строку НАД вашим списком.
Запустить макрос: F3
Вставить значение счетчика: C-x C-k C-i
. Появится 0
Вставьте точку и пробел: .
Переместите курсор на следующую строку
Остановите макрос: F4
Выберите свой список
Mx apply-macro-to-region-lines
Вы можете удалить 0, который вы добавили вверху и наслаждайтесь :)
ПРИМЕЧАНИЕ: Это создаст нумерованный список. Он не будет использовать буквы.
Вот некоторый код elisp для этого; его можно легко доработать, если вам нравится возиться.
Это пронумерует текущий регион (если он еще не пронумерован), а также последняя строка привязывается к клавишам M-n. При необходимости можно использовать функциональную клавишу "[F6]".
Изменено, чтобы принимать строку формата для использования. По умолчанию это 1. но вы можете сделать что-то вроде %d), чтобы получить скобку вместо . и так далее.
(defun number-region(fmt)
(interactive "sFormat : ")
(if (or (null fmt) (= 0 (length fmt)))
(setf fmt "%d. "))
(save-excursion
(save-restriction
(narrow-to-region (point) (mark))
(goto-char (point-min))
(let ((num 1))
(while (> (point-max) (point))
(if (null (number-at-point))
(insert (format fmt num)))
(incf num)
(forward-line))))))
(global-set-key "\M-n" 'number-region)
Не прямой ответ на ваш вопрос, но если вы обнаружите, что часто манипулируете нумерованными списками, вы можете изучить org-mode . В частности, раздел в простых списках .
Намного более простой способ - использовать расширенные команды редактирования прямоугольника библиотеки CUA . CUA включен в Emacs (по крайней мере, 23.1, я думаю, что он есть и в более ранних версиях), поэтому нового кода нет.
Вы можете использовать cua-set-rectangle-mark
(по умолчанию привязан к C-Return), чтобы начать прямоугольник, а затем использовать cua-sequence-rectangle
, чтобы вставить увеличивающийся ценности. Это также дает вам контроль над форматом и начальным значением, что обеспечивает большую гибкость.
Кроме того, CUA в первую очередь разработан для того, чтобы заставить Emacs работать как стандартные текстовые редакторы (с C-c для копирования, C-v для вставки и т. Д.), Но он также включает в себя некоторые несвязанные тонкости, такие как редактирование прямоугольника. Не спрашивайте почему :). Если вы хотите использовать редактирование прямоугольника без включения привязок клавиш CUA (что я и делаю), установите для cua-enable-cua-keys
значение nil
, что можно сделать с помощью настройки .