Da dies mein erster Beitrag hier ist, möchte ich nur sagen, dass VIM ein großartiges Tool ist und das Forum hier sehr hilfreich ist, um Antworten auf Fragen zu finden, und viele hilfreiche Leute zur Verfügung stehen unschätzbare Hilfe. Ich bin noch sehr neu in VIM, so ziemlich alles, was ich darüber gelernt habe, ist von hier gekommen.
Meine Frage ist: Ich weiß, wie man ALLE Zeilen in einer Datei umkehrt (: g / ^ / m0 unter anderem), aber gibt es eine Möglichkeit, alle 4 Zeilen in einer Datei umzukehren, so dass
line1
line2
line3
line4
line5
line6
line7
line8
...
wird
line4
line3
line2
line1
line8
line7
line6
line5
...
Sie können davon ausgehen, dass solche Dateien immer ein genaues Vielfaches von 4 Zeilen enthalten.
Antworten:
Der
:Reverse
im Vim Wiki erläuterte Befehl kann dazu verwendet werden (Sie können ihn in Ihren Befehl aufnehmen ,.vimrc
um ihn dauerhaft zu machen):Anschließend können Sie ein Makro aufzeichnen, um den Befehl alle vier Zeilen auszuführen:
Erläuterung:
qm
: 'q' im normalen Modus startet (und stoppt) die Aufzeichnung eines Makros in einem bestimmten Register (Register 'm', in diesem Fall kann es sich jedoch auch um einen anderen Buchstaben handeln)V
: Ruft den visuellen Modus auf und wählt die aktuelle Zeile aus3j
: Erweitern Sie die visuelle Auswahl auf die nächsten 3 Zeilen:Reverse<cr>
: Führen Sie den Befehl Umkehren in den ausgewählten Zeilen aus (<cr>
hier steht für den enterSchlüssel)4j
: gehe zu den nächsten unveränderten Zeilenq
: Stoppt die Aufzeichnung des Makros1000@m
: Führen Sie das im Register 'm' aufgezeichnete Makro 1000 Mal aus (Sie können diese Zahl erhöhen, wenn Ihre Datei größer als 4000 Zeilen ist).Bearbeiten:
Wie in den Kommentaren erwähnt, können Sie anstelle einer Zählung auch ein rekursives Makro verwenden:
qM
: Wenn das angegebene Registerq
in Großbuchstaben geschrieben ist, wird das Makro an das Register angehängt. Dies ist auch hilfreich, wenn Sie feststellen, dass Sie die letzten Schritte eines komplexen Makros verpasst haben.@m
: Führe das Makro im Register ausm
q
: Hänge das Makro nicht mehr anObwohl es als Makro erstellt wurde, können Sie einen Befehl dafür erstellen, wenn dies eine häufige Aufgabe in Ihrem Workflow ist:
function! Reverse4()
/endfunction
: Definiert eine neue Funktionlet reg_m = @m
: speichert den aktuellen Inhalt des Registersm
let @m = "<c-r><c-r>m"
: Bitte geben Sie den Makro in dem Registerm
- beachten Sie, dass<c-r>
die vim Notation für ist Ctrl+ rund dass Sie geben diese, kopieren Sie nicht / einfügen, so dass Ihre Linie zu ähnlich sein wird ,let @m = 'V3j:Reverse^M4j@m'
und es wird ein enthaltenes Sonderzeichen (^ M)normal! @m
: Der normale Befehl führt sein Argument so aus, wie es im normalen Modus eingegeben wurde, und führt das rekursive Makro auslet @m = reg_m
: stellt den Inhalt des Registers wieder herm
, sodass Sie sich nicht daran erinnern müssen, dass dieses Register für diese Funktion verwendet wird, und vermeiden, es zu verwendencommand! Reverse4 call Reverse4()
: Erstellt einen neuen Befehl für diese FunktionAbhängig von Ihren Anforderungen können Sie es erweitern, z. B .: Übergeben Sie ein Argument an den Befehl und die Funktion, damit es für eine beliebige Anzahl von Zeilen funktioniert, anstatt in Gruppen von 4 Zeilen festgelegt zu werden.
quelle
1000@q
Hack, können Sie auch eine rekursive Makro verwenden:qmqqm ... @mq@m
.command! -bar -range=% Reverse <line1>,<line2>g/^/m<line1>-1|nohl
irgendwo in Ihren vimrc.Wie bei allen sich wiederholenden Aktionen können Sie auch bei grundlegenden Bearbeitungsvorgängen einige Vorgänge problemlos ausführen, indem Sie ein Makro aufzeichnen.
(In diesem Fall verwende ich ein rekursives Makro, aber Sie können einfach ein nicht rekursives Makro aufzeichnen und es durch Hämmern
@@
oder Verwenden einer Zählung mehrmals wiedergeben .)Heruntergebrochen
gg
: Zum Anfang der Datei gehen.qqq
: Register löschenq
. Wir werden in Schritt 5 sehen, warum dies notwendig ist.qq
: Starten Sie die Aufzeichnung eines Makros, um q zu registrierenddjjpkddkkPjddpjj
: Eine Reihe von Vorgängen, bei denen die ersten vier Zeilen einfach durch manuelles Löschen und Einfügen neu angeordnet werden. (Dies könnte auf den ersten Blick kompliziert, aber nicht täuschen Diese sehr grundlegende Dinge ist , dass Sie in den ersten 5 Minuten oder so von gelernt haben würde.vimtutor
:j
,k
,dd
,p
,P
)@q
: Rufe das Makro auf! Zu diesem Zeitpunktq
enthält das Register noch nichts (da wir es in Schritt 2 gelöscht haben), sodass nichts passiert.q
: Beenden Sie die Aufzeichnung des Makros.@q
: Wiederholen Sie das rekursive Makro so oft wie nötig.Hinweis: Das oben Genannte führt nicht zu den gewünschten Ergebnissen, wenn die Datei eine Anzahl von Zeilen enthält, die nicht genau durch vier teilbar sind. Um das Makro vorzeitig zu stoppen, wenn keine vier Zeilen mehr vorhanden sind, müssen Sie einen Vim-Befehl im Normalmodus ausführen, der fehlschlägt, bevor Sie die Änderungen in Schritt 4 anwenden. Versuchen Sie dazu, nach unten zu springen eine Zeile dreimal (und dann wieder hoch), bevor wir beginnen, Zeilen zu verschieben:
jjj3k
Somit:
quelle
q
muss der Inhalt des Registers beim ersten Aufruf leer sein, da er sonst Ihre Ausgaben durcheinander bringt.qqqggqqjjjkddkkPjddjpkddkkPjjjj@qq@q
where I can just use the one-line custom command each time I need to do this
- Beachten Sie, dass Sie das Makro nicht jedes Mal neu erstellen müssen, wenn Sie es verwenden möchten, da es auf Ihrem vimrc als Funktion / Befehl gespeichert werden kann.Sie können dies auch mit einem
Ex
Befehl tun , dersed
als externen Filter verwendet wird:Diese Version ignoriert (löscht) alle zusätzlichen Zeilen, die ein Vielfaches von 4 überschreiten. Um den letzten Satz von weniger als 4 Zeilen (umgekehrt) beizubehalten, verwenden Sie:
Das
%
hier bedeutet "Jede Zeile im Puffer".Der
!
Befehl bedeutet "Führen Sie den folgenden Befehl mit den angegebenen Zeilen als Eingabe aus und ersetzen Sie die angegebenen Zeilen durch die Ausgabe des Befehls." (Es wird als Filter bezeichnet. Sehr praktisch, wenn Sie beispielsweise sortieren, um beispielsweise:%!sort
alle Zeilen in Ihrer Datei zu:2,8!sort
sortieren, oder um die Zeilen 2 bis 8 usw. zu sortieren.)sed
ist das Stream-Editor- Tool und ist auf allen Unix-ähnlichen Systemen zu finden. Die wichtigsten hier verwendeten Konzeptesed
sind der "Musterbereich" (der standardmäßig nur die einzelnen Zeilen der Eingabe enthält) und der "Haltebereich" (in dem Sie zusätzlichen Textsed
einfügen können, während Sie ihn speichern, während Sie andere verarbeiten) Eingabezeilen).-n
ist eine Option für densed
Befehl, um seine Standardaktionen zum Drucken des Musterbereichs zu unterdrücken (da wir in diesem Fall nur drucken möchten, wenn wir dies ausdrücklich sagen.)$p
imsed
Befehl bedeutet "Wenn Sie in der letzten Zeile dersed
Eingabe sind, drucken Sie (das Muster Leerzeichen)."h
bedeutet "den aktuellen Inhalt des 'Pattern Space' in den 'Hold Space' stecken und überschreiben, was auch immer da ist."n
bedeutet "Ersetzen Sie den Inhalt des 'Musterraums' durch die nächste Zeile der Eingabe."G
bedeutet "an den 'Musterraum' anhängen: eine neue Zeile, gefolgt vom Inhalt des 'Halteraums'."Insgesamt
sed
speichert der Befehl vier Ausgabezeilen, kehrt sie beim Speichern um und druckt sie dann aus. Die$p
in der zweiten Version hinzugefügten Befehle stellen sicher, dass die Zeilen weiterhin gedruckt werden, wenn die letzte Zeile der Datei anders als in einem Vielfachen von 4 Zeilen erreicht wird.Für einen alternativen, interaktiven Ansatz, bei dem noch keine Vim-spezifischen Funktionen und auch kein externer Filter verwendet werden:
in die vierte Zeile gehen.
Um die vorherigen vier Zeilen (1-4) umzukehren und den Cursor in Zeile 8 zu lassen.
.m -4
Verschiebt die aktuelle Zeile um vier Zeilen nach der Zeile zurück (wobei der Cursor auf der verschobenen Zeile verbleibt).+3m .
Verschiebt die Zeile, die 3 Zeilen nach der aktuellen Zeile liegt, direkt nach der aktuellen Zeile, wobei der Cursor auf der verschobenen Zeile verbleibt.+2m .
funktioniert natürlich genauso.+5
Platziert den Cursor fünf Zeilen nach unten.Wiederholen Sie diesen Vorgang wie gewünscht.
In Vim können Sie den gesamten Befehl mit
@:
und anschließend mit wiederholen@@
. In POSIXvi
oder müssenex
Sie als Textzeile einfügen:.m -4 | +3m . | +2m . | +5
, löschen Sie es in einen benannten Puffer (Register) und führen Sie dann diesen benannten Puffer (Register) aus.Im
ex
Modus können Sie also Zeilen interaktiv umkehren, indem Sie nur von POSIX angegebene Features verwenden und mit 17 Textzeilen beginnen:Weitere Lektüre:
ex
vi
quelle
4G:.m -4 | +3m . | +2m . | +5<Enter>@:
Dann@@
wiederholen, bis Ihre Datei vollständig verarbeitet ist. Ich empfehle jedoch die Installation von MobaXterm. :)Plain English: Verschieben Sie für jede Zeile die aktuelle Zeile nach oben
lnum % 4
, es sei dennlnum % 4 == 0
, in diesem Fall wird die aktuelle Zeile nach oben verschoben4
.n
Um alle Zeilen umzukehren , ersetzen Sie die4
im obigen Befehl angegebenen durchn
.quelle