Як я можу застосувати макрос до набору рядків у Vim?


222

У мене є файл з купою рядків. Я записав макрос, який виконує операцію в одному рядку. Я хочу повторити цей макрос у всіх рештках файла. Чи є швидкий спосіб зробити це?

Я спробував Ctrl + Q, виділив набір ліній і натиснув @@, але, здається, це не вийшло.


Офтопічне запитання: Я не знав макросів VIM (або не хотів знати про це: P) Чи є у вас мальовничі посилання на VIM-макроси на "ледачий читач"?
OscarRyz

Звичайно, це: oreillynet.com/mac/blog/2006/07/… підсумовує це досить добре.
Йордан Пармер

Ви також можете перевірити: він складний-повторити з внутрішнього vim
Сем

Відповіді:


354

Використовуйте звичайну команду в режимі Ex для виконання макросу в кількох / всіх рядках:

Виконайте макрос, що зберігається в регістрі а на рядках 5 - 10.

:5,10norm! @a

Виконайте макрос, що зберігається в регістрі а на рядках 5 до кінця файлу.

:5,$norm! @a

Виконайте макрос, що зберігається в регістрі а, у всіх рядках.

:%norm! @a

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

:g/pattern/norm! @a

Щоб виконати макрос у візуально вибраних лініях, натискайте V та j або k, поки не буде вибрано потрібну область. Потім введіть :norm! @aі дотримуйтесь того, що відображається наступний рядок введення.

:'<,'>norm! @a

Введіть : допоможіть normal in vim, щоб прочитати більше.


1
Так,: допоможіть нормально у vim чи щойно доданому посиланні.
Суддя Мейґарден

1
Що-небудь, щоб допомогти іншому користувачу, який не користується emacs!
Суддя Мейґарден

48
Приємно !! Порада для початківців: використовуйте V, потім j / k, щоб виділити потрібні лінії, а потім наберіть просто:norm! @a
Кевін Бурліон

7
Щоб додати дуже корисну пораду від @KevinBourrillion, натискаючи :після виділення рядків, рядок вводу Ex замість прочитає, :'<,'>до якого ви додасте решту того, що запропонував Кевін. Це дозволить зробити остаточні команди наступним чином: :'<,'>norm! @a.
Дейвін

3
@GabeMoothart Уникає повторного перезавантаження !ключів. Можливо, він вам не потрібен, але відповідь, яка працює для всіх, вимагає цього.
Суддя Мейґарден

60

Використовуйте глобальний, щоб запустити макрос "a" у всіх рядках, що містять "pattern"

:g/pattern/normal! @a

Для довідки, перевірте: :help global.


4
Тільки для уточнення для майбутніх користувачів: це глобальна команда Ex.
atp

39

Ви також можете зробити це:

У звичайному режимі:

[number of times to apply the macro] @ [register]

Наприклад:

1000@q

Додає макрос до регістру q до наступних 1000 рядків.

Оновлення: прийнята відповідь набагато краще

Оновлення: як зазначав @kevinliu, ви, ймовірно, захочете закінчити макрос символом a, jщоб перейти до наступного рядка.


4
Це зупиняється на останньому рядку і не виконує кілька разів на останньому рядку, чого я боявся.
Хубро

@Hubro, ці відповіді інших користувачів працювали на мене: :%norm! @aіvGG :norm! @a
Макс Хайбер

2
Чомусь це спрацювало приголомшливо, і прийнята відповідь не відповіла. Мій макрос передбачав вставлення нового рядка, виконання матеріалів та перехід до наступного рядка.
jasonszhao

@jasonszhao так само тут. але чи все-таки не потрібно сказати 1000, але всі рядки до кінця .. і все ж подбати про нову лінію, роблячи речі тощо
ihightower

2
Я думаю, що слід зазначити, що ваш макрос повинен закінчуватися jкомандою перейти до наступного рядка, інакше він спробує застосувати його до того ж рядка.
Кевін Лю

2

Також є плагін під назвою RangeMacro, робить саме те, що ви хочете! Для всіх, хто не може здогадатися за назвою, що це робить: він повторює записаний макрос для кожного рядка в заданому діапазоні, незалежно від того, чи візуальним виділенням чи через: 40,50 /: +10

Див. Http://www.vim.org/scripts/script.php?script_id=3271

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.