Vim: ¿cómo aumentar cada número en el bloque visual?

Vim: ¿cómo aumentar cada número en el bloque visual?

Tengo el siguiente 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;
...

entre corchetes selecciono el bloque visual, donde quiero aumentar cada número en 5. ¿Cómo hago esto?

Respuesta1

Resalte visualmente el texto entre paréntesis:

Ctr+ V2jl

Incrementa cada número en cinco:

:norm 5Ctr+ V Ctr+ A Explicación:

:normejecuta todo el comando en modo normal. El Ctr+ Ves necesario, de lo contrario el cursor volvería al principio de la línea. Ctr+ Aaumenta un número en 1 y esto se hace 5 veces. El rango visual se inserta automáticamente después de presionar los dos puntos.

EDITAR: Como señaló correctamente Stéphane, el código anterior incrementa el primer número encontrado en cualquier línea. Aquí hay una mejor solución:

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

Suma cinco a todos los números enteros entre paréntesis. Los \zsy \zese utilizan para excluir los corchetes de la coincidencia y submatchdevuelven el número coincidente.

Respuesta2

No es necesario salir del modo visual para aumentar los números, solo useg

5 g Ctrl-a

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

En realidad he aprendido este truco en unvimgolfdesafío.

Respuesta3

Estos dos comandos son idénticos e incrementarán todos los números.dentro una selección visual (¡incluso en un rectá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

Es \%Vun comparador de ancho cero que coincide en cualquier lugar dentro de la selección actual (o última).

De la ayuda de 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.

Desafortunadamente, esto no es tan inteligente ctrl-aporque no comprende los números negativos.

información relacionada