Макрос Emacs для генерации последовательности? - PullRequest
40 голосов
/ 02 октября 2009

Я читал эту статью о том, как создавать макросы vi: макрос последовательности vi и я увидел один полезный макрос для создания последовательности в буфере.

1
2.
...
100.

В vi хитрость в том, что можно нажать ctrl-a над числом, и он добавит к нему единицу, так что это упростило макрос. Я хочу быть в состоянии сделать то же самое в emacs.

Ответы [ 10 ]

60 голосов
/ 02 октября 2009

Если вы используете Emacs 23 (а может и 22?), Используйте kmacro-insert-counter, который по умолчанию связан с C-x C-k TAB. Итак, для вашего примера, вы должны сделать:

C-x ( C-x C-k TAB . RET C-x )

Итак, запустите макрос, вставьте счетчик, а затем «.», Перевод строки, конец макроса. Затем C-x e e e e e e e и т. Д. Или M-1 0 0 C-x e, чтобы получить 100 из них.

EDIT:

Забыл упомянуть, что вы также можете установить счетчик на начальное значение. Например, чтобы начать с 1 вместо 0, сделайте M-1 C-x C-k C-c.

И если вы не хотите, чтобы счетчик увеличивался в определенной точке, добавьте к нему префикс C-u. Конечно, нажатия клавиш становятся немного нелепыми, поэтому я обычно привязываю ключ к операции вставки, но не увеличения.

54 голосов
/ 03 октября 2009

Те, кто считает, что слишком много уловок для запоминания, могут найти приобретение элиспа более выгодным:

M-: (dotimes (i 20) (insert (format "%2d.\n" (1+ i))))
18 голосов
/ 02 октября 2009

Emacs 23 поддерживает фрагменты elisp в тексте замены replace-regexp.

Я часто определяю клавиатурные макросы, которые следуют этому шаблону:

  • Копировать блок текста
  • Перейдите к номеру, который я хочу увеличить в скопированном блоке текста с помощью isearch
  • Активируйте отметку и переместите точку, чтобы определить область, включающую число
  • M-x replace-regexp
  • В приглашении «Заменить регулярное выражение» введите \([0-9]+\), чтобы получить группу из одной или нескольких цифр
  • В приглашении «Заменить регулярное выражение ([0-9] +) на:») введите \,(1+ \#1), где , указывает, что следует заменить форму elisp, 1+ - это функция приращения, а \#1 - первый захваченный текст совпадения, интерпретируемый как число.

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

Обратите внимание, что эту технику можно легко адаптировать, например, к двойные числа (\,(* 2 \#1)) или что угодно. Вы даже можете использовать его для замены следующего элемента в произвольной последовательности, используя комбинацию 'position и 'nth, но сейчас я не буду вдаваться в подробности:).

10 голосов
/ 16 августа 2014

Начиная с выпуска 24.3 Emacs (я полагаю, что на самом деле, начиная с выпуска 24.0), последовательность нажатий клавиш была упрощена:

<F3> <F3> . <ENTER> <F4>

Затем повторяющаяся клавиша <F4> повторяет макрос.

Хитрость в том, что после запуска макроса с <F3> второе нажатие клавиши <F3> вставит текущее значение счетчика макроса клавиатуры в буфер и увеличит счетчик на 1.

Другие хитрости:

  • <F3> C-u 2 <F3> . <ENTER> <F4> будет увеличиваться с +2 (вместо +1)
  • C-u 100 <F3> <F3> . <ENTER> C-u 50 <F4> начнется в 100 и закончится в 149
  • C-x C-k C-f %03d <ENTER> <F3> <F3> . <ENTER> <F4> будет дополняться нулями как "000"

Источник: Раздел макросов клавиатуры в руководстве по Emacs.

7 голосов
/ 02 октября 2009

Кроме ответа scottfrazer , есть другой способ создать последовательность чисел с режимом CUA , которая может вам очень помочь при редактировании существующего контента. Смотрите скринкаст Марка Мансура о редактировании столбца Emacs с позиции 2: 30.

3 голосов
/ 28 января 2014

Если вы включите вспомогательный режим CUA (cua-mode), вы можете выбрать столбец текста и затем заполнить его последовательностью чисел, используя cua-sequence-rectangle (по умолчанию M-n).

Это то же самое, что упоминалось в видео, на которое ссылается Török Gábor, но теперь оно записано здесь, поэтому вам не нужно смотреть все видео, если вы этого не хотите. Это хорошее видео.

1 голос
/ 10 января 2015

Вы можете использовать shell-command-on-region в противном случае:

C-u M-! seq 1 100|xargs -I{} echo {}"."
1 голос
/ 02 октября 2009

Также есть:

<b>C-u M-!</b> jot -s '.<b>C-q C-j</b>' 10

Это не чистый elisp, но имеет тот же эффект. Вы можете написать именованный макрос, чтобы запустить его для вас.

1 голос
/ 02 октября 2009

Вот расширение , которое может помочь.

0 голосов
/ 16 февраля 2015

Вот простое определение для этого:

(defun insert-range (START END &optional STEP FORMAT)
  "Inserts a range of integers from START to END with STEP (default to 1)
in a given format (default to \"\\n%d\")"
  (interactive
   (list (read-number "Start: " 1)
         (read-number "End: "  10)
         (read-number "Step: "  1)
         (read-string "Format (default to \"\\n%d\"): " nil nil "\n%d") ))
  (dotimes (i (1+ (/ (- END START) STEP)))
    (insert (format FORMAT (+ START (* i STEP))))
  )
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...