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>/