Vim – wie erhöht man jede Zahl im visuellen Block?

Vim – wie erhöht man jede Zahl im visuellen Block?

Ich habe folgendes 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;
...

Mit eckigen Klammern wähle ich den visuellen Block aus, in dem ich jede Zahl um 5 erhöhen möchte. Wie mache ich das?

Antwort1

Markieren Sie den Text in Klammern optisch:

Ctr+ V2jl

Erhöhen Sie jede Zahl um fünf:

:norm 5Ctr+ V Ctr+ A Erläuterung:

:normführt den gesamten Befehl im Normalmodus aus. Das Ctr+ Vist notwendig, da der Cursor sonst an den Zeilenanfang zurückspringen würde. Ctr+ Aerhöht eine Zahl um 1, und das wird 5 mal gemacht. Der sichtbare Bereich wird automatisch eingefügt, nachdem Sie den Doppelpunkt gedrückt haben.

BEARBEITEN: Wie Stephane richtig bemerkte, erhöht der vorherige Code die erste Zahl, die in einer beliebigen Zeile gefunden wird. Hier ist eine bessere Lösung:

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

Es addiert fünf zu allen Ganzzahlen in Klammern. Die \zsund \zewerden verwendet, um die Klammern von der Übereinstimmung auszuschließen und submatchdie übereinstimmende Zahl zurückzugeben.

Antwort2

Sie müssen den visuellen Modus nicht verlassen, um Zahlen zu erhöhen. Verwenden Sie einfachg

5 g Ctrl-a

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

Eigentlich habe ich diesen Trick in einemAbonnierenHerausforderung.

Antwort3

Diese beiden Befehle sind identisch und erhöhen alle Zahleninnerhalb eine visuelle Auswahl (sogar in einem Rechteck!).

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

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

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

Dies \%Vist ein Matcher mit der Breite Null, der überall innerhalb der aktuellen (oder letzten) Auswahl passt.

Aus der Vim-Hilfe:

\%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.

Leider ist dies nicht so intelligent, ctrl-ada es negative Zahlen nicht versteht.

verwandte Informationen