Как я могу сделать это, не выбирая каждый, а затем повторять S`?
Это действительно то, что лучше всего работает в Vim. С небольшой помощью макросов:
Интерактивная версия:
/(.\{-})<CR>
qqysa)`nnq
@q
@@
@@
... до тех пор, пока вы не сделаете их все и не вернетесь к тому, с чего начали.
Неинтерактивная версия "просто сделай это":
:set nows<CR>
gg
/(.\{-})<CR>
qqqqqysa)`nn@qq@q
Возможно, вы захотите вернуться к :set ns
впоследствии.
Конечно, если вы знаете, что нет вложенных скобок,тогда самый простой ответ использует :s
, как предложил другой ответчик.
РЕДАКТИРОВАТЬ с объяснением макроса:
qqqqq...@qq@q
- это цикл. Вот как это работает:
qq
, а затем q
очищает регистр q
. Это будет важно позже. qq
начинает запись макроса. ysa)
окружает круглые скобки с `
. nn
идет кследующий матч. Мы должны сделать это дважды, потому что окружение переходит к предшествующему, и n
снова будет соответствовать тем же скобкам. @q
вызывает макрос q
. Это пусто, так что это ничего не делает ... сейчас. Однако, читайте дальше ... q
останавливает запись макроса и сохраняет его в регистре q
. - Теперь, когда
q
больше не пусто, мы можемвыполнить его с @q
. Однако во время выполнения q
будет по-прежнему не пустым, поэтому, когда мы дойдем до точки в макросе, которая ничего не делала во время записи, макрос перезапустится, давая нам примитив, но функционирующий,Цикл рекурсии. - Цикл останавливается, когда что-то прерывается: например, невозможность перейти к следующему совпадению. Обычно вы просто меняете все совпадения, чтобы больше не осталось совпадений;однако редактирование этого макроса не приводит к сбою сопоставления, поэтому мы должны полагаться на
:set nows
, чтобы не допустить бесконечного добавления обратных скобок ко всем скобкам.
Через некоторое времяМы можем переписать шаблон так, чтобы :set nows
(и дополнительные n
) не были нужны:
/`\@<!(.\{-})<CR>
qqqqqysa)`n@qq@q
Это соответствует паре скобок, которым не предшествует обратный удар, так что после всехсовпадения были рассмотрены, для n
совпадений нет, что естественно нарушает цикл.
Если кто-то считает, что это сложно ... обратите внимание, что большинство редакторов просто не могут этого сделать (так как это учитываетправильная вложенность скобок, тогда как я еще не видел редактора с достаточной надежностью поиска-замены, чтобы можно было его осуществить).