Wie zwinge ich [count] <Cx>, führende Nullen zu hinterlassen?

8

Kontext

Ich verwende vifmals Dateimanager (das ist hier kein Thema, ich weiß, aber lese weiter), mit dem ich Dateinamen in einem vimPuffer bearbeiten kann .

Ein Problem, über das ich mich geärgert habe, sind nummerierte Dateien, in denen ich führende Nullen behalten möchte (z movie0001.webm. B. ). Ich kann vim nicht dazu bringen, sie richtig zu formatieren.

Die Frage

Ich habe einen vimPuffer mit:

mov70.webm
mov71.webm
mov72.webm
mov73.webm
mov74.webm
mov75.webm
mov76.webm
mov77.webm
mov78.webm
mov79.webm

Und mein Cursor beginnt min der ersten Zeile. Ich mache dann alles VGzu markieren und es 69<C-x>zu verwandeln in:

mov1.webm
mov2.webm
mov3.webm
mov4.webm
mov5.webm
mov6.webm
mov7.webm
mov8.webm
mov9.webm
mov10.webm

Aber ich würde das wirklich gerne erreichen:

mov01.webm
mov02.webm
mov03.webm
mov04.webm
mov05.webm
mov06.webm
mov07.webm
mov08.webm
mov09.webm
mov10.webm

Was ich versucht habe

Das Problem mit Zahlen mit führenden Nullen ist, dass sie vimso behandelt werden octal, dass ich nrformatszu einer leeren Zeichenfolge gewechselt habe:

:set nrformats=

Das hat aber nicht geholfen. Ich habe mich umgesehen, :h nrformatsohne etwas Nützliches zu finden.

gro♀
quelle
3
Klingt eher nach einem Job für :subsitute+printf
muru

Antworten:

6

Dies kann in zwei relativ einfachen Schritten erfolgen:

  1. Dekrementieren Sie die Zeilen mit ctrl-x
  2. Führen Sie eine Substitution in den geänderten Zeilen aus, um die führenden Nullen hinzuzufügen: '[,']s/\d\@<!\d\>/0\0/

Sie können daraus einen Befehl / eine Funktion machen, wenn Sie der Meinung sind, dass Sie dies häufig tun müssen.

Eine andere Möglichkeit besteht darin, wie in Muru erwähnt zu tun und substitute+ zu verwenden printf, wodurch die Zeichenfolgenlänge der ersetzten Ziffern erhalten bleibt:

'<,'>s/\d\+/\=printf('%0*d', len(submatch(0)), submatch(0) - 69)

Dies könnte auch in einen wiederverwendbaren Befehl umgewandelt werden:

command! -nargs=1 -range Decr <line1>,<line2>s/\d\+/\=printf('%0*d', len(submatch(0)), submatch(0) - <args>)

Womit Sie laufen können, :'<,'>Decr 69um die visuellen Linien um 69 zu verringern.

Tommy A.
quelle
Ich lerne noch, viscriptaber es len(submatch(0))ist ein großartiger Trick. Fügte es zu meinem vimrchinzu und fügte auch einen IncrBefehl hinzu .
Gro♀
7

Während ich definitiv mit :s+ printffür komplexe Ersetzungen gehen würde, kann ich den gewünschten Effekt erzielen, wenn ich anfange 00und habe set nrformats-=octal. Das ist:

  1. Wählen Sie die Zahlen in einem visuellen Block aus:

    Geben Sie hier die Bildbeschreibung ein

    Beachten Sie, dass ich hinzugefügt habe mov76.webm- Sie haben tatsächlich keine zehn Dateien in Ihrer Beispielliste.

  2. Durch Nullen ersetzen und denselben Bereich erneut auswählen: r0gv

    Geben Sie hier die Bildbeschreibung ein

  3. Verwendung g<c-a>:

    Geben Sie hier die Bildbeschreibung ein

Ohne set nrformats-=octal, werden Sie sehen 010, 011etc.

muru
quelle
Deine 0sehen aus wie Augen. Gruselig.
Romainl
Hoppla, das war ein Fehler mit dem mov76.webm, ich habe ein schlechtes Verzeichnis verwendet. Ich habe die Frage bearbeitet. Ja, für die andale Schrift.
Gro♀
@gro♀ Das ist die Ubuntu Mono-Schriftart. : D
Muru
@romainl und jetzt kann ich es nicht mehr sehen.
Muru