Vim – como aumentar cada número no bloco visual?

Vim – como aumentar cada número no bloco visual?

Eu tenho o seguinte 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;
...

com colchetes seleciono o bloco visual, onde quero aumentar cada número em 5. Como faço isso?

Responder1

Destaque visualmente o texto entre colchetes:

Ctr+ V2jl

Aumente cada número em cinco:

:norm 5Ctr+ V Ctr+ A Explicação:

:normexecuta todo o comando no modo normal. O Ctr+ Vé necessário, caso contrário o cursor voltaria ao início da linha. Ctr+ Aaumenta um número em 1 e isso é feito 5 vezes. O alcance visual é inserido automaticamente depois que você pressiona os dois pontos.

EDITAR: Como Stephane apontou corretamente, o código anterior incrementa o primeiro número encontrado em qualquer linha. Aqui está uma solução melhor:

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

Ele adiciona cinco a todos os números inteiros entre colchetes. Os \zse \zesão usados ​​para excluir os colchetes da correspondência e submatchretornar o número correspondente.

Responder2

Você não precisa sair do modo visual para aumentar os números, basta usarg

5 g Ctrl-a

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

Na verdade, aprendi esse truque em umvimgolfdesafio.

Responder3

Esses dois comandos são idênticos e irão incrementar todos os númerosdentro de uma seleção visual (mesmo em um retângulo!).

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

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

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

O \%Vé um matcher de largura zero que corresponde a qualquer lugar dentro da seleção atual (ou última).

Da ajuda do 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.

Infelizmente, isso não é tão inteligente, ctrl-apois não entende números negativos.

informação relacionada