Подтвердить что ты не робот

Макрос Emacs для генерации последовательности?

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

1.
2.
...
100.

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

4b9b3361

Ответ 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.

Ответ 6

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

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

Ответ 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))))
  )
)