Nehmen wir an, ich habe eine Datei mit:
xxx
yyy
zzz
und eine andere Datei:
kkk
qqq
ppp
Ich möchte erhalten:
xxxkkk
yyyqqq
zzzppp
Ist das in Vim mit einem Befehl möglich? (Ich habe versucht, VISUAL BLOCK zu verwenden, aber ohne Erfolg).
In meinem speziellen Fall habe ich zwei große Dateien mit vielen Zeilen zum Einfügen, sodass die Antwort auch ein Shell-Befehl sein könnte, aber ich würde gerne wissen, ob es eine Möglichkeit gibt, dies auch innerhalb derselben Datei zu tun.
paste -d '' ...
funktioniert das auch. Interessanterweise scheinen die Manpage und die Infoseiten von coreutils nicht '\ 0' zu dokumentieren, obwohl dies in der Single Unix Spec angegeben ist.Sie können direkt beim Bearbeiten tun
file1
. Geben Sie ein:
, zu dem Siecommand mode
in vim wechseln möchten. Geben Sie dann Folgendes ein:quelle
Hier ist eine Möglichkeit, dies in derselben Datei mit nur Vim zu tun.
Es beinhaltet einige Schlüsselzuordnungen. Ich habe mir das einmal ausgedacht, als ich mehrere Listen in einfachem Text in tabellenartigen Strukturen anordnen wollte.
Dies hängt von der Taste } (rechte geschweifte Klammer) ab, um Absatzgrenzen zu überspringen. (Die geschweiften Klammern werden gespiegelt, übrigens: { springt zum Anfang der Datei und } zum Ende.)
Also ... nehmen wir an, Sie haben eine Datendatei wie diese (dies setzt voraus, dass die Zeilennummern aktiviert sind mit : set nu ):
Es ist wichtig, dass Zeile 4 eine leere Zeile ist (kein Leerzeichen). Ich werde gleich erklären, warum.
Führen Sie die folgende Karte Befehl:
: map q mw} jdd'wpkJj
Dadurch wird die Taste "q" an ein 12-stelliges Programm gebunden, auf das ich weiter unten näher eingehen werde.
Wenn Sie "q" drücken, wird das Programm ausgeführt. Beachten Sie, dass sich Ihr Cursor, der in Zeile 1 gestartet wurde, jetzt in der nächsten Zeile befindet und bereit ist, erneut "q" zu drücken. Möglicherweise haben Sie bemerkt, dass zwischen "xxx kkk" ein Leerzeichen steht. Wenn Sie das nicht möchten, lesen Sie "Was ist mit dem zusätzlichen Leerzeichen?" unten, gegen Ende.
Hier ist eine Aufschlüsselung der Zuordnung:
Der Doppelpunkt versetzt Sie in den Befehlsmodus, sodass wir den Befehl "map" ausgeben können.
map q bindet q mit der folgenden Zeichenfolge. Beachten Sie, dass "q" nur meine übliche "Map to" -Taste ist. Sie können andere Schlüssel verwenden. Standardmäßig wird q in Kleinbuchstaben zugeordnet, um die Makroaufzeichnung zu starten. da ich selten (nie?) benutze, finde ich "q" hilfreich für einmalige Utility-Makros. Sie können auch Großbuchstaben Q (z. B. Map Q) oder einen Fnct-Schlüssel usw. verwenden.
Wenn Sie jetzt "q" drücken (im Navigationsmodus), führt vim diese Reihe von Tastenanschlägen aus:
Was natürlich wie totaler Kauderwelsch aussieht, also werde ich es Aktion für Aktion aufschlüsseln (mit ^^ unten), um es einfacher zu machen, zu verfolgen, was passiert.
Die mw Markiert eine benannte Stelle, der Name ist hier ‚w‘. Ich verwende standardmäßig 'w' (ich betrachte das als meinen 'Arbeitsort'. Jeder benannte Ort von az würde funktionieren, solange Sie konsistent sind.
Das 'w' wird in Kürze wieder angezeigt, wenn wir möchte den Cursor auf diese Zeile zurücksetzen.
Hier haben wir die rechtsgerichtete }, die den Cursor zur nächsten Absatzgrenze nach unten springt; Mit anderen Worten, dies bewegt den Cursor zur nächsten leeren Zeile, in unserem Beispiel Zeile 4. (Aus diesem Grund sollte Zeile 4 eine leere Zeile sein; sonst kein Leerzeichen, } wird sie nicht als Grenze betrachtet.)
Das j geht eine Zeile nach unten; Dies ist die vi "hjkl" -Navigation der alten Schule. Sie könnten hier wahrscheinlich auch einen Abwärtspfeil verwenden. Ich finde "j" etwas einfacher zu lesen und einfacher zu verwenden (da die Pfeiltasten nicht immer an der gleichen Stelle zwischen verschiedenen Marken von Laptop- und Desktop-Tastaturen stehen, sondern "hjkl" "ist garantiert immer auf der rechten Seite der Startzeile einer QWERTZ-Tastatur (was meine Schreibgeschwindigkeit verbessert)).
Jedenfalls befindet sich der Cursor zu diesem Zeitpunkt in Zeile 5.
Das dd ist der Bearbeitungsbefehl "Zeile löschen", daher wird die aktuelle Zeile gelöscht, die Zeile 5 mit dem "kkk" ist. Wenn Sie die Zeile löschen, wird sie auch in den Standard-Einfügepuffer verschoben, den wir mit Exploit verwenden, um "kkk" wieder an die gewünschte Stelle in Zeile 1 neben "xxx" zu bringen.
Die Sequenz 'w (einfaches Anführungszeichen w) springt den Cursor zurück zu unserem Lesezeichen für "w", wodurch der Cursor auf Zeile 1 gesetzt wird.
Das Kleinbuchstaben "p" setzt den aktuellen Standardpuffer (mit "kkk", wie Sie sich erinnern werden) nach dem Cursor frei. Da der Puffer die Zeile 5 enthält, sieht unsere Datei jetzt kurz so aus:
Beachten Sie, wie aus "kkk" Zeile 2 geworden ist. (Ich kann nicht leicht veranschaulichen, wohin der Cursor dorthin geht ... er sollte wirklich am Anfang von Zeile 2 stehen).
Wir sind nah dran, aber noch nicht ganz da ...
Das Kleinbuchstaben k bewegt den Cursor bis zur ersten Zeile ("hjkl" -Navigation erneut), und der Großbuchstabe J verbindet die nächste Zeile mit der aktuellen Zeile, sodass unsere Datei so aussieht (der Cursor befindet sich immer noch in Zeile 1 dazwischen die x und die k):
Das letzte j ist noch einmal die "hjkl" -Navigation, die den Cursor nach unten auf Zeile 2 bewegt, was praktisch ist, da dies die nächste Zeile ist, auf die wir q anwenden möchten .
Wie auch immer, es wird so aussehen:
Wenn Sie erneut "q" drücken, sieht es so aus (beachten Sie, dass sich der Cursor in Zeile 3 befindet).
Spülen und nach Bedarf wiederholen. Ich finde das praktisch für längere Listen, weil ich damit (ziemlich) schmerzlos Spalten aufbauen kann.
Hier ist ein längeres Beispiel. Durch Hinzufügen einer Leerzeile in Zeile 7 wird "ggg" zuerst in der nächsten Spalte gestapelt. Nachdem Sie zu "lll" zurückgekehrt sind, springen Sie mit dem Cursor zurück in Zeile 1 (links lockig, {, funktioniert gut dafür) und fahren Sie mit "mmm" fort. Wenn Sie feststellen, dass Ihnen die Art und Weise, wie sie angeordnet ist, nicht ganz gefällt, halten Sie u (Rückgängig) ein wenig gedrückt und optimieren Sie die Stelle, an der sich Ihre "Grenzlinie" befindet, und beginnen Sie von vorne.
Dies ist eines der Dinge, die viel einfacher funktionieren, als es mühsam zu erklären ist. Obwohl ich nicht glaube, dass ich es zum Verbinden von Tausenden von Zeilen verwenden würde, finde ich es praktisch für Dutzende und gelegentlich Hunderte.
Was ist mit dem Extra Space Charakter?
Ein Teil des Verhaltens des Join-Befehls besteht darin, dass zwischen den zu verbindenden Zeilen ein Leerzeichen eingefügt wird.
Wenn Sie nicht wollen , um einen Raum zwischen „xxx kkk“ können Sie
einen Lösch-Befehl (x) mit dem String:
Das "join + x" beendet das Leerzeichen, indem das x direkt nach dem Zusammenfügen der beiden Linien verwendet wird. x löscht im Navigationsmodus das Zeichen, auf dem sich der Cursor gerade befindet. In diesem Fall war dies das fehlerhafte Leerzeichen.
Das "Join w / comma" ersetzt das Leerzeichen durch ein Komma. Das ist meistens das gleiche, aber wir werden den letzten Teil durchgehen, der sich nur ein bisschen vom vorherigen Beispiel unterscheidet.
Das R versetzt uns in den Bearbeitungsmodus (insbesondere in den Ersetzungsmodus, in dem alle Zeichen mit dem, was wir eingeben, überschrieben werden).
Das gibt buchstäblich ein Komma ein, das den fehlerhaften Raum an dieser Stelle überschreibt.
Und dann signalisiert ^ [ ein Escape-Zeichen, das den Bearbeitungsmodus verlässt und uns wieder in den Navigationsmodus versetzt.
Jetzt sind wir bereit für das letzte j , um uns zur nächsten Zeile zu bringen.
Um ein Escape-Zeichen zuzuordnen, müssen Sie ^ Q (Windows) oder ^ V (Linux & Unix) drücken und dann die Esc-Taste drücken (wenn Sie dies nicht tun, bricht das Esc-Zeichen den Befehl ab und Ihre linke Seite fragt sich, warum Ihre möglicherweise komplexe Map Definition gerade verschwunden). Hier ist die Sequenz, die Sie eingeben müssen, um sie unter Windows in Vim zu integrieren:
Damit. Es gibt wahrscheinlich Dutzende von Möglichkeiten, um so etwas zu tun, Vim.
Wenn "Feld" -Trennzeichen wichtig sind, setze ich normalerweise eine einfache eindeutige Sequenz am Ende jeder Zeile mit globaler Suche und Ersetzung ein, füge die Spalten nach meinen Wünschen zusammen und ersetze dann alle, um die gewünschten Trennzeichen zu erhalten .
Auf jeden Fall ist dies nur ein Beispiel. Ich hoffe du fandest es interessant.
quelle