Auswahl in eine separate Datei verschieben

11

Wie kann ich mit vim einen Text in eine neue Datei verschieben? Im Moment mache ich das:

  • wähle den Text aus
  • benutzen :w new_file
  • Wählen Sie den Text erneut aus
  • Löschen Sie den Text

Gibt es einen effizienteren Weg, dies zu tun?

Vor

a.txt

sometext
some other text
some other other text
end

Nach dem

a.txt

sometext
end

b.txt

some other text
some other other text
greg0ire
quelle

Antworten:

4

Wie wäre es mit diesen benutzerdefinierten Befehlen:

:command! -bang -range -nargs=1 -complete=file MoveWrite  <line1>,<line2>write<bang> <args> | <line1>,<line2>delete _
:command! -bang -range -nargs=1 -complete=file MoveAppend <line1>,<line2>write<bang> >> <args> | <line1>,<line2>delete _
Ingo Karkat
quelle
1
Das ist sehr hässlich, aber hey, es scheint in einem Schritt genau das zu tun, wonach ich gefragt habe (ich habe es versucht). +1 und akzeptiert. Ich habe nach einer einheimischen Methode gesucht, um dies schnell zu tun, aber da es keine zu geben scheint, wird Ihre Methode gut funktionieren. Vielen Dank!
Greg0ire
Schönheit liegt im Auge des Betrachters. Ich finde das ziemlich elegant; Sie müssen es nur einmal eingeben (in Ihre .vimrc).
Ingo Karkat
Sie haben Recht, "sehr hässlich" sollte "sehr ungewohnt" gewesen sein. Ihr Befehl ist sehr praktisch, und ich denke, ich werde ihn definitiv in meine .vimrc
greg0ire 23.01.13
7

Unter "Verschieben eines Textstücks in eine neue Datei" wird angenommen, dass Sie dieses Textstück aus der aktuellen Datei ausschneiden und eine neue Datei erstellen, die nur diesen Text enthält.

Verschiedene Beispiele:

  • :1,1 w new_file um eine neue Datei zu erstellen, die nur den Text aus Zeile 1 enthält
  • :5,50 w newfile um eine neue Datei zu erstellen, die den Text von Zeile 5 bis Zeile 50 enthält
  • :'a,'b w newfileum eine neue Datei zu erstellen, die den Text von Marke azu Marke enthältb
    • setzen sie ihre marken mit maund mbwo immer sie wollen

Das Obige kopiert nur den Text und erstellt eine neue Datei, die diesen Text enthält. Anschließend müssen Sie löschen.

Dies kann mit demselben Bereich und dem folgenden dBefehl erfolgen:

  • :5,50 d um den Text von Zeile 5 bis Zeile 50 zu löschen
  • :'a,'b dum den Text von Markierung azu Markierung zu löschenb

Oder durch Verwendung ddfür den einzeiligen Fall.

Wenn Sie stattdessen den Text im visuellen Modus auswählen und dann drücken, :während der Text ausgewählt ist, wird in der Befehlszeile Folgendes angezeigt:

:'<,'>

Welches zeigt den ausgewählten Text. Sie können den Befehl dann wie folgt erweitern:

:'<,'>w >> old_file

Womit der Text an eine vorhandene Datei angehängt wird . Dann wie oben löschen.


Einzeiler:

:2,3 d | new +put! "

Die Panne:

  • :2,3 d - Löschen Sie die Zeilen 2 bis 3
  • | - Technisch gesehen leitet dies die Ausgabe des ersten Befehls an den zweiten Befehl weiter, aber da der erste Befehl nichts ausgibt, verketten wir nur die Befehle
  • new - öffnet einen neuen Puffer
  • +put! "- den Inhalt des unbenannten Registers ( ") in den Puffer legen
    • Das bang ( !) ist da, damit der Inhalt vor der aktuellen Zeile steht. Dies führt zu einer Leerzeile am Ende der Datei. Ohne es gibt es eine leere Zeile oben in der Datei.
embedded.kyle
quelle
Ihre Annahme ist richtig. Das sieht gut aus, ich werde testen. Können Sie 2. etwas mehr erklären? Ich bin nicht sehr vertraut mit Bereichen. BEARBEITEN: Wenn ich dies in der zweiten Zeile versuche, schreibt es die erste Zeile in die andere Datei, nicht die zweite Zeile.
Greg0ire
@ greg0ire Ich habe das ein bisschen rückständig, ich werde es bearbeiten, um es besser zu erklären
embedded.kyle
Ich habe ein Beispiel hinzugefügt, um meine Frage klarer zu machen.
Greg0ire
@ greg0ire Ich habe meine Antwort korrigiert. Es sind noch zwei Schritte. Der erste kopiert und schreibt. Der zweite löscht.
embedded.kyle
Okay, wenn ich das richtig verstehe, besteht der Trick darin, Bereiche zu verwenden, um denselben Befehl auszuwählen und zu schreiben. Das ist sehr ähnlich zu dem, was ich getan habe. +1 für die detaillierte Erklärung, aber ich denke nicht, dass dies effizienter ist, da der Trick mit dem Schlagen von ':' das ist, was ich im Moment tue.
Greg0ire
1

Basierend auf der Antwort von @ embedded.kyle und diesen Fragen und Antworten endete ich mit dieser Zeile, um eine Auswahl an eine Datei anzuhängen und aus der aktuellen Datei zu löschen. Nachdem Sie einige Zeilen mit ausgewählt haben Shift+V, drücken Sie :und führen Sie Folgendes aus:

'<,'>w >> test | normal gvd 

Im ersten Teil werden ausgewählte Zeilen angehängt. Der zweite Befehl wechselt in den normalen Modus und wird ausgeführt gvd, um die letzte Auswahl auszuwählen und dann zu löschen.

jtpereyda
quelle
0

Wählen Sie den Text im visuellen Modus aus und drücken Sie y, um ihn in den Puffer zu "ziehen" (kopieren) oder dum ihn in den Puffer zu "löschen" (ausschneiden).

Dann können Sie :split <new file name>Ihr vim-Fenster aufteilen und drücken, pum den zerrissenen Text einzufügen. Schreiben Sie die Datei wie gewohnt.

Um den Split wieder zu schließen, übergeben Sie den Split, den Sie schließen möchten :q.

Xyon
quelle
1
Ich habe im Moment 4 Schritte: auswählen, schreiben, auswählen, löschen. Mit Ihrer Methode habe ich 6 Schritte: auswählen, löschen, teilen, einfügen, schreiben, schließen. Ich habe nach etwas Effizienterem gefragt: P
greg0ire 23.01.13
Wenn Sie :xstattdessen die Teilung bestehen , können Sie das Schreiben und Schließen in einem Schritt kombinieren und es in fünf Schritten durchführen. : P
Xyon
Das ist besser, aber 5 immer noch> 4: P
greg0ire