Как я могу записать вложенный макрос?

11

Я хочу записать макрос внутри макроса, вот так:

qa
    [ first macro ... ]
    qb
        [ second macro ... ]
    q
    [ some more stuff, involving @b ... ]
q

Однако второй qинтерпретируется как запрос на остановку первого макроса, а остальные интерпретируются как команды.

Есть ли способ начать запись второго макроса внутри макроса?

Если нет, есть ли другой способ добиться желаемого эффекта повторения определенной последовательности нажатий клавиш, когда он уже находится внутри макроса?

Дверная ручка
источник
1
Разве вы не можете сначала записать макрос, bа затем записать aвызов макроса @b?
statox
@statox Проблема в том, что это bимеет разрушительный эффект, поэтому я не могу сначала записать его (если я не хочу его записать, нажмите uнесколько раз, а затем начните запись a).
Дверная ручка
1
Я думаю, что это ваше лучшее решение. Обратите внимание, что вы также можете записать его в другой буфер ( enewзапись bd) или напрямую отредактировать bрегистр, записав в свой файл содержимое вашего макроса, а затем «записав» его, поместив символы в регистр с помощью "by.
statox

Ответы:

10

AFAIK, вы не можете записать два макроса за qx...qодин снимок. По вашему требованию вы должны создать макрос bк тому qb....qвремени qa...@bq.

Если вы не хотите , чтобы «запись» bвы можете сделать let @b='whatever'то @bповторит макрос. Например, let @b='ggdG'определите макрос bдля удаления всего содержимого вашего текущего буфера без «записи».

Существует трюк определения макроса, который может не соответствовать вашему вопросу. Это рекурсивный макрос, а не вложенный макрос. То есть вы можете сделать:

qa..whatever..@aq

это будет рекурсивно воспроизводить макрос a. Иногда полезно, когда мы не знаем, сколько раз мы хотим воспроизвести макрос. Потому что, когда происходит ошибка, воспроизведение макроса автоматически останавливается. Это экономит 999@aнапример.

Кент
источник
1

Запись нажатий клавиш в макрос @a - это то же самое, что набирать текст, соответствующий этим нажатиям клавиш, для регистрации a. Как только что-то сохранено в регистре, вы можете поместить его или воспроизвести как макрос / нажатие клавиш. Таким образом, вы можете начать запись макроса в @a через qa, а затем во время записи макроса восстановить текст, чтобы зарегистрировать b, возможно, используя что-то вроде "bye. Все, что делает, это вставляет текст в регистр, отличный от того, который был бы, если бы вы не указали регистр b. Теперь, когда в регистре b есть некоторый текст, вы можете воспроизвести этот текст как нажатия клавиш, нажав @b. Вы даже можете сделать это, пока макрос @a еще записывается. Это метакролитично!

Основным недостатком этого является, вероятно, было бы легче написать некоторую функцию vimscript, которая делает то, что вы хотите, а затем, возможно, вызвать ее во время записи макроса. Прелесть макросов в том, что во время записи вы можете видеть эффект от того, что вы записываете, но этот метод мета-макросъемки несколько убирает это.

still_dreaming_1
источник