vim: запускать несколько команд на основе одной команды:global

Извините, если это уже было опубликовано, потому что я не могу найти ответ, даже на вики-сайте vim.

Есть ли способ запустить несколько команд в режиме командной строки vim с одного :g поиск?

Например,

:%g/foo/ s/bar/\=@a/g | exe "norm /cat\<enter>\"ayiw"

Что (для того, что я намереваюсь сделать) должно при каждом совпадении строки fooзаменить bar с содержанием реестра a, а затем найти следующую итерацию cat (даже если впереди много строк), и поместите окружающее слово в регистр a,

Вместо этого этот конкретный синтаксис завершает команду subsitution, используя текущее содержимое исходного a зарегистрироваться, а затем выполняет команду обычного режима в одной строке (после завершения замены).

Этот пример не является моим конкретным вариантом использования, но показывает один случай, когда эта функциональность полезна. Я понимаю, что я мог бы положить все это в один exeт.е. %g/foo/exe "norm :s/bar/\\=@a/g\<enter>/cat\<enter>\"ayiw", но я хотел бы сделать это первым способом, так как я чувствую, что он более гибкий.


Я бы предпочел сделать это, используя vanilla vim, но если для этого существует плагин, это хорошая альтернатива. Кто-нибудь знает, есть ли синтаксис для такой вещи?

1 ответ

Хорошо "немного" грязно, но это работает для вас?

:let list = split(execute('g/cat/p'), '\n') | g/foo/ s/bar/\=matchstr(remove(list, 0), '\s\d\+\s\zs.*')/g

Сначала он читает все случаи cat сохранить их в списке. Затем замените первый bar с первой кошкой... и так далее.

Грязная часть matchstr команда. g//p также возвращает число для результата, поэтому список выглядит так:

 1 cat
 2 cat
 3 cat
 ...

вот почему мы должны немного убрать с фронта. Я хотел бы услышать, если кто-то знает чистое решение для этого (я также заинтересован в чистом решении vimscript, не должен быть oneliner).

Вы можете сделать это (по крайней мере для нескольких:s команд, примененных к одному:g). Пример:

" SHORT STORY TITLES to single word of CapitalizedWords within <h3>s
.,$g/^\L\+$/s/[^A-Z0-9 ]\+//ge|s/\u\+/\L&/ge|s/\<\l\+\>/\u&/ge|s/ \+//ge|s/.*/<h3>&<\/h3>/
Другие вопросы по тегам