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