Макрос Emacs для генерации последовательности?
Я читал эту статью о том, как создавать макросы vi:
макрос последовательности vi, и я увидел один полезный макрос для создания последовательности в буфере.
1.
2.
...
100.
В vi трюк заключается в том, что можно нажимать ctrl-a над числом, и он добавит его к нему, поэтому это упростит макрос. Я хочу иметь возможность делать то же самое в emacs.
Ответы
Ответ 1
Если вы используете Emacs 23 (и, возможно, 22?), используйте kmacro-insert-counter
, который по умолчанию привязан к C-x C-k TAB
. Итак, для вашего примера вы бы сделали:
C-x ( C-x C-k TAB . RET C-x )
Итак, запустите макрос, вставьте счетчик, за которым следует '.', newline, end macro. Затем 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
. Конечно, на данный момент нажатия клавиш становятся немного смешными, поэтому я обычно привязываю ключ к вставке, но не добавляю.
Ответ 2
Те, кто чувствуют, что слишком много трюков для запоминания, могут найти более выгодное приобретение elisp:
M-: (dotimes (i 20) (insert (format "%2d.\n" (1+ i))))
Ответ 3
Emacs 23 поддерживает вспомогательные фрагменты в заменяющем тексте replace-regexp.
Я часто определяю макросы клавиатуры, которые следуют этому шаблону:
- Скопируйте блок текста
- Перейдите к числу, которое я хочу увеличить в скопированном блоке текста с помощью isearch
- Активируйте метку и переместите точку, чтобы определить область, охватывающую номер
- M-x replace-regexp
- В приглашении "Заменить регулярное выражение" введите
\([0-9]+\)
, чтобы записать группу из одной или нескольких цифр
- В поле "Заменить regexp ([0-9] +) с помощью:" prompt "введите
\,(1+ \#1)
, где ,
указывает, что формуляр elisp для замены следует, 1+
является функцией приращения, а \#1
- первый захваченный текст соответствия, интерпретируемый как число.
По истечении минуты, чтобы определить макрос клавиатуры, это позволяет мне иметь почти удобство резки и вставки для создания большого количества блоков почти идентичного кода, например, для операторов case
.
Обратите внимание, что этот способ можно легко адаптировать, например, двойные числа (\,(* 2 \#1)
) или что угодно. Вы можете даже использовать его, чтобы подставить следующий элемент в произвольной последовательности, используя комбинацию 'position
и 'nth
, но я не буду вдаваться в это сейчас:).
Ответ 4
С момента выпуска 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"
Источник: Раздел Macro Counter в руководстве Emacs.
Ответ 5
Рядом с ответ scottfrazer, есть еще один способ создать последовательность чисел с режим CUA, которые могут помочь вам при редактировании существующего контента. См. Марк Mansour screencast в Редактировании столбцов Emacs с позиции 2:30.
Ответ 6
Если вы включите вспомогательный режим CUA (cua-mode
), вы можете выбрать столбец текста и затем заполнить его с помощью последовательности чисел, используя cua-sequence-rectangle
(привязано к M-n
по умолчанию).
Это то же самое, что упоминается в видео Török Gábor, к которому привязано, но теперь оно записано здесь, поэтому вам не нужно смотреть все видео, если вы этого не хотите. Это хорошее видео.
Ответ 7
Вот расширение, которое может помочь.
Ответ 8
Там также:
C-u M-! jot -s '.C-q C-j' 10
Это не чистый elisp, но имеет тот же эффект. Вы можете написать именованный макрос, чтобы запустить его для вас.
Ответ 9
Вы можете использовать shell-command-on-region
иначе:
C-u M-! seq 1 100|xargs -I{} echo {}"."
Ответ 10
Здесь простой defun для этого:
(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))))
)
)