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


85

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

Я знаю, що можу повторити макрос n разів:

15@x

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

Заздалегідь спасибі.


15 @ x не працює у Windows gVIM
Mingjiang Shi

Відповіді:


101

Особисто я б це зробив

VG:normal @x

Редагувати: змінено реєстр на вказаний вами.


Хороший. Мені подобається, що це рішення працює лише на вибраній області.
Кевін

Я наклав це на nnoremap <C - @> VG: norm @ q <CR>
PAS

Я спробував це з макросом "1z =] s", але він виправляє лише заклинання першого слова кожного рядка, пропускаючи решту.
elig

@elig ви, мабуть, хочете створити рекурсивний макрос, який буде знаходити відсутні слова у всіх рядках.
Раман

67

Ви можете зробити (у командному режимі)

:%normal @x

Мені подобається це рішення, але il буде виконувати макрос у кожному рядку буфера, - запитав ОП лише від курсору до кінця.
Порунга

24

зробити рекурсивний макрос:

qa@aq

напр .:

qa0gUwj@aq

Він ОБЕРЕЖИТ перше слово від поточного рядка до кінця файлу з одинарним @a. Але переконайтесь, що "реєстр порожній:

let @a=""

3
Відмінно. Цей підхід є більш корисним, ніж %:normalпідхід, оскільки він вшановує будь-які рухи рядків усередині макросу, тому є корисним, коли рядки не ідентичні за формою. Мені простіше створити макрос 'a' для визначення дії, а потім макрос 'b' зробити рекурсивний біт, тобто qb @ a @ bq.
Paul Ruane

3
Уникайте цього, якщо ваш макрос передбачає пошук, оскільки він триватиме згори. ctrl-cзупинитися, якщо це станеться!
Іен Баллард,

3
@IainBallard, :set nowrapscanробить його невдалим і зупиняється при досягненні кінця файлу.
ericbn

1
щоб очистити зареєструвати, просто зробити qaqдо макро: qaqqa0gUwj@aq. Крім того, якщо ви забудете поставити @qкінець, ви завжди можете зробити, qAщоб розпочати додавання реєстру, а потім зробити @q. Зазвичай я записую в reg q з якихось причин, тому що це легко (особливо для рекурсивних макросів), і, як правило, це робиться qqqqqgUiwj@qqзамість двох макросів. Перші три qs очищають reg q, другі два qпочинають запис. Дивіться vim.wikia.com/wiki/Record_a_recursive_macro
dylnmc

я думаю, що для очищення aреєстру можна було б простого типуqaq
Петер Перхач,

11

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, скорочена версія: qqqqq для запису макросу @qq, щоб закінчити запис @q для його виконання (і буде працювати до кінця файлу)


1
Будь ласка, можете ви додати посилання на документацію?
aturegano

2
@aturegano Я думаю, що автор мав намір використовувати рекурсивний макрос. Для отримання додаткової інформації див . Вікі-сторінку Vim: Запис рекурсивного макросу .
dylnmc
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.