Vim - как увеличить каждое число в визуальном блоке?

Vim - как увеличить каждое число в визуальном блоке?

У меня есть следующий SQL-код:

update am.PERMISSIONS set PRM_ORDER = 35 PRM_VISIBLE = b'1' where PRM_ID = 3;
update am.PERMISSIONS set PRM_ORDER = [35] PRM_VISIBLE = b'1' where PRM_ID = 7;
update am.PERMISSIONS set PRM_ORDER = [40] PRM_VISIBLE = b'1' where PRM_ID = 10;
update am.PERMISSIONS set PRM_ORDER = [45] PRM_VISIBLE = b'1' where PRM_ID = 11;
...

С помощью квадратных скобок я выделяю визуальный блок, в котором хочу увеличить каждое число на 5. Как это сделать?

решение1

Визуально выделите текст в скобках:

Ctr+ V2жл

Увеличьте каждое число на пять:

:norm 5Ctr+ V Ctr+ A Пояснение:

:normвыполняет всю команду в обычном режиме. Ctr+ Vнеобходим, иначе курсор переместится обратно в начало строки. Ctr+ Aувеличивает число на 1, и это делается 5 раз. Визуальный диапазон вставляется автоматически после нажатия двоеточия.

РЕДАКТИРОВАТЬ: Как правильно заметил Стефан, предыдущий код увеличивает первое число, найденное в любой строке. Вот лучшее решение:

%s/\[\zs\d\+\ze\]/\=(submatch(0)+5)

Он добавляет пять ко всем целым числам в скобках. \zsИ \zeиспользуются для исключения скобок из сопоставления и submatchвозвращает сопоставленное число.

решение2

Вам не нужно выходить из визуального режима, чтобы увеличить числа, просто используйтеg

5 g Ctrl-a

5 ......... 5 times
g ......... globally
Ctrl-a .... increase numbers

На самом деле я научился этому трюку ввимгольфиспытание.

решение3

Эти две команды идентичны и увеличивают все числа.в пределах визуальное выделение (даже в прямоугольнике!).

:'<,'>s/\%V\d\+\%V/\=submatch(0)+1/g

:s/\%V\d\+\%V/\=submatch(0)+1/g

нарубленный::s / \%V \d\+ \%V / \=submatch(0)+1 / g

Это \%Vсопоставитель нулевой ширины, который соответствует любому месту внутри текущего (или последнего) выделения.

Из справки vim:

\%V     Match inside the Visual area.  When Visual mode has already been
        stopped match in the area that gv would reselect.
        This is a /zero-width match.  To make sure the whole pattern is
        inside the Visual area put it at the start and just before the end of
        the pattern, e.g.:
                /\%Vfoo.*ba\%Vr
        This also works if only "foo bar" was Visually selected. This:
                /\%Vfoo.*bar\%V
        would match "foo bar" if the Visual selection continues after the "r".
        Only works for the current buffer.

К сожалению, это не так умно, ctrl-aпоскольку не понимает отрицательных чисел.

Связанный контент