(пере) нумерованные списки в Emacs (Muse) - PullRequest
7 голосов
/ 09 апреля 2010

предположим, у меня есть текстовый список в Emacs, например:

a
b
c
...
d

Есть ли способ присвоить номера этим элементам в Emacs, выбрав регион? Конечные результаты должны выглядеть примерно так:

1. a
2. b
3. c
j. ...
n. d

Спасибо.

Ответы [ 6 ]

10 голосов
/ 09 апреля 2010

Способ, которым я делаю это, что может быть не оптимальным, - использовать поиск и замену регулярных выражений. Это, конечно, требует, чтобы вы были в состоянии определить регулярное выражение, соответствующее началу строк, на которых вы хотите числа. Если взять твой пример, я бы использовал поисковое регулярное выражение вроде этого:

\([a-z]\)

обратите внимание на квадратные скобки, скоро нам понадобится первая буква. И заменить регулярное выражение, как это:

\#. \1

где:

\# - это специальная форма, которую Emacs заменяет на правильный номер (хотя см. Предупреждение ниже);

. пишет остановку; и

\1 записывает пробел и захваченную группу.

ВНИМАНИЕ: Emacs будет нумеровать ваши элементы 0, 1, 2, .... Пока кто-нибудь не напишет нам, как начать с 1, я всегда вставляю фиктивный 0-й элемент перед редактированием, а затем удаляю его.

6 голосов
/ 09 апреля 2010

Вы можете использовать счетчик макросов клавиатуры Emacs .

  • Поставьте курсор на одну строку над вашим списком.

  • Запуск макроса: F3

  • Введите значение счетчика: C-x C-k C-i. Появится 0

  • Введите точку и пробел: .

  • Переместить курсор на следующую строку

  • Остановить макрос: F4

  • Выберите ваш список

  • M-x apply-macro-to-region-lines

  • Вы можете удалить 0, который вы добавили сверху и наслаждаться:)

ПРИМЕЧАНИЕ: Это создаст нумерованный список. Он не будет использовать буквы.

5 голосов
/ 17 апреля 2010

Намного проще использовать расширенные команды редактирования прямоугольника библиотеки 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, что можно сделать с помощью настройки.

3 голосов
/ 09 апреля 2010
(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)))
1 голос
/ 09 апреля 2010

Вот некоторый код elisp, чтобы сделать это; было бы легко настроить, если вы любите мастерить.

Это будет нумерация текущего региона (если он уже не пронумерован), а также последняя строка привязывается к клавишам M-n. Вы можете использовать функциональную клавишу "[F6]" по мере необходимости.

Изменено для использования строки формата. По умолчанию 1. но вы можете сделать что-то вроде% d), чтобы получить скобку вместо a. и т. д.

  (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)
0 голосов
/ 16 апреля 2010

Не является прямым ответом на ваш вопрос, но если вы часто манипулируете нумерованными списками, вы можете захотеть заглянуть в org-mode . В частности, раздел в простых списках .

...