Pull to refresh

Comments 8

Дополнения:

1) Если мы записывали макрос в регистр a, закончили запись нажатием q и поняли, что сделали ошибку, забыв в конце, например, переход на новую строку с помощью j, в этом случае, чтобы не переписывать макрос (иногда они получаются очень большими), можно нажать qA (регистр a заглавная буква) и дописать недостающие команды.

2) Иногда полезно запускать выполнение макроса не последовательно, а параллельно (этот трюк я подсмотрел в Vim Edit Text at the Speed of Thought). Например, если нам надо обработать 100 строк, вместо того, чтобы записывать макрос с переходом на следующую строку j и затем указывать количество раз выполнения макроса, например, как в статье 100@a, можно выделить последовательность строк с помощью V, нажать : и затем в командном режиме вызвать макрос через normal. Команда будет выглядеть так :'<,'>normal @a. Плюс этого подхода в том, что макрос выполнится на всех строках, даже если какая-то строка могла нарушить ход выполнения последовательности макросов, при обычном подходе.
1) Почему при этом произойдёт дописывание в регистр a, а не переписывание регистра A? Какие условия должны быть выполнены, чтобы писать всё-таки в A?
Исправил в топике, ошибочно было указано, что a и code>A — разные регистры, на самом деле один и тот же, а при использовании дозаписи нужно брать тот, который в верхнем регистре, работает это как с [y]ank, так и с записью [q].
Вместо «макросов в vimrc» лучше иметь привязки. Привязки тоже можно вызывать рекурсивно и они тоже остановятся на провалившемся поиске.
Хотя лучше всё же освоить регулярные выражения и другие конструкции VimL и не добавлять в vimrc то, что зависит от привязок — и макросы, и привязки без nore обладают таким нехорошим свойством, потому их у меня в vimrc практически нет (редко, но иногда мне всё же нужна именно зависимость от других привязок). А макросов так вообще — их слишком легко перезаписать — хотя использую я макросы часто.

Суть в том, что работоспособность того, что у меня есть в vimrc, должна быть максимально независима. Иначе с некоторого момента вам придётся начать думать «а могу ли я добавить эту привязку/макрос/изменить эту настройку? Не сделает ли это прошлогоднюю, но используемую привязку/макрос, неработоспособной?»
Вот что бы в этой статье не помешало — так это список реальных задач, для решения которых удобнее всего использовать макросы. Желательно с учётом того, что регулярные выражения мы всё-таки знаем, любим, и запятые на нули обычно меняем именно с их помощью.

Я использую Vim примерно лет 13, активно настраиваю, пишу плагины, регулярно стараюсь изучать новые возможности, экспериментировать с трюками из сборников всяких полезностей — иными словами я не застыл на каком-то, давно изученном, минимуме возможностей Vim, а регулярно стараюсь пробовать что-то новенькое. Так вот, при всём желании найти хоть какое-то применение макросам, у меня это пока не получилось.

Обычно, если возникает достаточно сложная, и в то же время повторяющаяся задача, которую нельзя решить регуляркой s/// — макросами она тоже не решается т.к. изменения требуется вносить хоть и однообразные, но мелкие детали зависят от конкретного места, так что с одной стороны описать эту логику макросом займёт больше времени, чем сделать всё вручную (ну, относительно — обычно это «вручную» подразумевает ручное выделение блока и применение к нему пары вручную выбранных регулярок из нескольких вариантов похожих регулярок в истории). Тем более, что задача обычно уникальна, и писать макрос «на будущее» точно нет смысла.
Я обычно рефакторю код с помощью макросов, хотя да — регулярка тоже сработает, но кому то проще макросами
Я часто использую макросы для массового добавления кавычек, скобочек, запятых в конце строки, в общем, переформатирвоание списков — очень удобно,
отформатировал первую строчку, а дальше 100@q…
Еще приходиться переформатировать копипастнутый hmtl с однотипными элементами (вложенными) — в таких случаях на придумывание регулярки ушло бы гораздо больше времени, чем на макрос.
Регулярно использую макросы, чтобы добавить в файл DNS зоны энное число записей вида «server01 IN A 1.2.3.1» с последовательно идущей нумерацией хостов и айпишников, очень удобно — qa C-a $ C-a yy p q и наяривай сколько угодно.
Sign up to leave a comment.

Articles