воспроизвести макрос vim до конца буфера

85

Я хочу запустить макрос, который я только что записал в регистре " x", на каждой отдельной строке открытого буфера, от курсора до конца буфера в vim. Как я могу это сделать?

Я знаю, что могу воспроизвести макрос n раз:

15@x

... или просто удерживайте, @пока не дойду до последней строки, но я хочу просто нажать несколько клавиш и покончить с этим.

Заранее спасибо.

Кевин
источник
15 @ x не работает в Windows gVIM
Mingjiang Shi

Ответы:

102

Лично я бы сделал

VG:normal @x

Изменить: изменил регистр на тот, который вы указали.

Рэнди Моррис
источник
Хороший. Мне нравится, что это решение действует только на выбранной области.
Кевин
Я сопоставил это с nnoremap <C - @> VG: norm @ q <CR>
PAS
Я попробовал это с помощью макроса «1z =] s», но он исправляет только первое слово каждой строки, пропуская остальные.
elig
@elig вы, вероятно, захотите создать рекурсивный макрос, который будет искать пропущенные слова во всех строках.
raman
67

Вы можете сделать (в командном режиме)

:%normal @x
ryan_s
источник
Мне нравится это решение, но il будет выполнять макрос на каждой строке буфера, OP запрашивал только от его курсора до конца.
Porunga
24

сделать рекурсивный макрос:

qa@aq

пример:

qa0gUwj@aq

Это будет UPCASE первое слово от текущей строки до конца файла с одним @a. Но убедитесь, что «регистр пуст:

let @a=""
Максим Ким
источник
3
Превосходно. Этот подход более полезен, чем %:normalподход, поскольку он учитывает любые перемещения строк в макросе, поэтому полезен там, где строки не идентичны по форме. Мне проще создать макрос «a» для определения действия, а затем сделать так, чтобы макрос «b» выполнял рекурсивный бит, то есть qb @ a @ bq.
Paul Ruane
3
Избегайте этого, если ваш макрос включает поиск, так как он будет продолжаться сверху. ctrl-cостановиться, если это произойдет!
Iain Ballard
3
@IainBallard, :set nowrapscanприводит к сбою и остановке при достижении конца файла.
ericbn
1
чтобы очистить зарегистрировать, просто сделать qaqдо макро: qaqqa0gUwj@aq. Кроме того, если вы забыли поставить @qв конце, вы всегда qAможете начать добавлять регистр, а затем сделать @q. Я обычно записываю в reg q по какой-то причине, потому что это просто (особенно для рекурсивных макросов) и обычно заканчивается qqqqqgUiwj@qqвместо двух макросов. Первые три qs clear reg q, вторые два qs начинают запись. См. Vim.wikia.com/wiki/Record_a_recursive_macro
dylnmc
Я думаю, что очистить aрегистр можно было просто qaq
набрав
12

999999@x, если у вас нет очень большого буфера ...

Питер
источник
6
почему не просто %:normal @xили 1,$:normal @x?
Натан Феллман
3
это определенно более элегантное решение - я думаю, 99999@xэто просто естественная вещь, которую вы придумаете, когда торопитесь :)
Питер
2
Не будет ли 9999999 @ x запускать его много раз на последней строке, если у вас нет ровно 999999 строк?
Дэвид Онейл
2
Просто попробовал. Зависает сеанс. Вероятно, продолжит запускать его миллион раз, не останавливаясь в конце строки.
CDR
1
По крайней мере, в некоторых случаях это будет вести себя не так, как ожидалось. Подумайте о том, чтобы в нем был макрос с find next / find prev . Таким образом, как только повтор макроса достигает конца файла, он будет продолжаться с начала. vim doc по этой теме . Чтобы предотвратить перенос поиска, можно использовать : set nowrapscan . Это пример, который я мог бы придумать, но это не значит, что их больше нет. :% normal @x - это способ пойти, как @ryan_s предложил в своем ответе выше.
Сергей Маркелов
-1

Из vim wiki сокращенная версия: qqqqq для записи макроса @qq для завершения записи @q для его выполнения (и будет выполняться до конца файла)

пользователь3499436
источник
1
Пожалуйста, можно добавить ссылку на документацию?
aturegano
2
@aturegano Я думаю, что автор хотел использовать рекурсивный макрос. Для получения дополнительной информации см . Vim Wiki: запись рекурсивного макроса .
dylnmc