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+ V2jl

将每个数字增加 5:

:norm 5Ctr+ V Ctr+A 解释:

:norm在正常模式下执行整个命令。 +CtrV必需的,否则光标将跳回行首。 Ctr+A将数字加 1,共进行 5 次。按冒号后会自动插入可视范围。

编辑: 正如 Stephane 正确指出的那样,前面的代码会递增在任何行上找到的第一个数字。这是一个更好的解决方案:

%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因为它不理解负数。

相关内容