воспроизвести макрос 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

Мне нравится это решение, но 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 для его выполнения (и будет выполняться до конца файла)


1
Пожалуйста, можно добавить ссылку на документацию?
aturegano

2
@aturegano Я думаю, что автор хотел использовать рекурсивный макрос. Для получения дополнительной информации см . Vim Wiki: запись рекурсивного макроса .
dylnmc
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.