Я нахожусь в процессе украшения некоторого исходного кода, используя vim. {1}
Я создал пару макросов vim, которые выполняют отдельные шаги: удаление конечного пространства, удаление пустых строк после {
, удаление пустых строк до {
, и тому подобное.
Теперь я хочу создать макрос, который последовательно выполняет все отдельные макросы. Однако, как только первый рекурсивный макрос завершает свою работу (поскольку он больше не может найти совпадений -> ошибка соответствия), мой макрос-оболочка также завершается.
Есть ли способ заставить макрос vim продолжить после того, как submacro сгенерировал ошибку?
{1} Я знаю об автоматических переформаторах. Я мог бы даже использовать их в моей текущей проблеме. Я просто упомянул источник переформатирования для примера. Не размещайте никаких ответов об этом источнике красоты или что. Вопрос не в переформатировании кода как таковом , а в макросах vim.
Пример:
- Макрос 1 - обрезка замыкающего пробела -
qw/\s\+$d$@wq
- Макрос 2 - удаление пустых строк перед} -
qe/\n\n *}dd@eq
- Wrapper Macro - retabbing, Макрос 1, Макрос 2 -
qr:retab@w@eq
Когда я @r
запускаю обертку - она будет перезагружена, затем выполнит Макро 1, пока не будет найдено больше конечных пробелов, а затем завершится ( без выполнения Макро 2).
Разъяснение:
Что я ищу, так это как вызвать submacro, чтобы, когда этот submacro завершается, вызывающий макрос продолжается?
Если неудачная команда является заменой, которая не находит свой шаблон, например,
когда
foo
в буфере не существует, вы можете добавитьe
флаг, чтобы игнорировать эту ошибку, например,Видеть
Вы можете сказать Vim игнорировать ошибки некоторых команд: ex, предшествуя им с помощью
:silent!
. ВидетьИзменить после добавления примера к вопросу
Макрос 1 и Макрос 2 оба рекурсивны, и ни один из них не имеет какого-либо явного механизма завершения рекурсии. Я предполагаю, что запускается один из внутренних тестов Vim на неограниченную рекурсию, который выдает ошибку. Если макрос 1 генерирует такую ошибку, то эта ошибка сразу же прекратит выполнение макроса Wrapper
@w
.Я бы предложил ограничить число выполнений ваших макросов, переписав их как: ex команды и ограничив диапазон строк, в которых они выполняются. Например:
где
^M
означает ввод вашей клавиши ввода или возврата. Я не проверял их вместе в вашем макросе Wrapper, но думаю, вы сможете исправить любые ошибки, которые я мог допустить.источник
/foo
). Хотя:silent!
рекурсивный субмакро и не прерывал макрос-обертку, он действительно не завершался, теперь субмакро-файл вообще не завершается ... и я подозреваю, что повторное его выполнение каким-либо образом завершится снова, и макрос-обертка тоже снова завершится. Похоже, я застрял. : - \Для меня сработала комбинация ответов @Peter Rincker и @garyjohn. Отдельно я продолжал получать странные проблемы.
Я думаю, что
silent!
в и<leader>rt
, и символы канала междуendtry
иw
были ключами - просто разрыв строки послеendtry
неудачного завершения . Ониtry
работали, когда я просто вводил их, но при запуске в качестве макроса ошибка о поисковом тексте не была найдена.источник
Я обычно создаю макросы на лету, когда мне нужно выполнить повторяющуюся задачу среди множества файлов. В моем случае в VIM установлено NERDtree ( http://www.vim.org/scripts/script.php?script_id=1658 ), которое создает
vsplit
окно, а слева у меня есть список всех файлов в текущий каталог. В одном примере мне нужно найти первый экземпляр строкиMY_TEST
в файле, а затем удалить, если он есть, префикс, помеченный какCUSTOM_PREFIX-
из этой строки, сохранить файл, а затем перейти к следующему.Вот как у меня работает этот макрос на 2000 файлов в текущем каталоге. Я мог бы написать скрипт bash для этого, но в моем случае это быстрее в VIM. Эти
+
клавиши означает нажат сеанс одновременнойq,a
CTRL+ W,←
↓
ENTER
q
1000 @,a
Надеюсь это поможет!
источник