So fügen Sie einen visuellen Block ab einer anderen Zeile ein


10

Es hat sehr lange gedauert, bis mir klar wurde, dass das Einfügen (Einfügen) von etwas mit poder Pdas , mit dem der visuelle Block auswählt ctrl+vund zerrt (kopiert) y, die bisherige Art und Weise beibehält , so dass, wenn sich der kopierte Text in der Mitte von Zeilen befand, es wird dann nach Möglichkeit in die Mitte eines anderen Textes kopiert. Im Gegensatz dazu Vfügt select-line with die kopierte Zeile nicht in anderen Text ein, sondern beginnt in einer anderen Zeile.

Nehmen wir zum Beispiel an, ich habe inzwischen:

12/12: Avocado. Apple.
12/13: Bean.    Banana.
12/14: Cherry.  Citron.
12/15:
12/16:
12/17:

Wenn ich schneiden möchte Avocadound Beanund Cherry, durch Auswahl (Auswahl dargestellt als _)

12/12: ________ Apple.
12/13: ________ Banana.
12/14: ________ Citron.
12/15:
12/16:
12/17:

Drücken Sie yund bewegen Sie den Cursor in die folgende Zeile (Cursor dargestellt als _).

12/12: Avocado. Apple.
12/13: Bean.    Banana.
12/14: Cherry.  Citron.
_2/15:
12/16:
12/17:

und drücken P. Es ergibt:

12/12: Avocado. Apple.
12/13: Bean.    Banana.
12/14: Cherry.  Citron.
Avocado.12/15:
Bean.   12/16:
Cherry. 12/17:

Aber ich wünschte:

12/12: Avocado. Apple.
12/13: Bean.    Banana.
12/14: Cherry.  Citron.
Avocado.
Bean.   
Cherry. 
12/15:
12/16:
12/17:

Dies verwirrte mich jedes Mal, bis mir klar wurde, dass sie, weil sie in der Mitte der Zeile kopiert wurden, in der Mitte der Zeile eingefügt wurden und die Art und Weise nachahmten, wie sie waren.

Es scheint der beste Weg zu sein, etwas einzufügen, das in einer anderen Zeile beginnt, indem Sie den Cursor an den Anfang mit 0und 3 Zeilen nach unten an die neue Stelle bewegen . und Aufrufen des Einfügemodus mit iund dreimaliges Drücken <return>und Bewegen des Cursors 6 Zeilen zurück und rechts zurück an die ursprüngliche Stelle; und kopieren und wieder an den neuen Ort gehen und einfügen, wie ich es oben getan habe.

Kann ich ein paar Schläge sparen? Oder was machst du normalerweise?

(Bearbeiten: Was oben gesagt wurde, war, wie ich es verstanden habe, als ich das gefragt habe. Siehe diese Antworten für die richtige Erklärung :)

Antworten:


11

Wenn Sie Text kopieren, wird dieser in ein Register eingetragen. Der Text in einem Register hat einen Typen: characterwise, linewiseoder blockwise.

Dieser Typ bestimmt, auf welche Weise der Text eingefügt wird.

In Ihrem Beispiel haben Sie Text aus dem visuellen Blockmodus kopiert. Der Text hatte also den Typ blockwiseund wurde im unbenannten Register gespeichert ".
Aufgrund dieses Typs wird es als Block eingefügt, wenn Sie es wieder in Ihren Puffer einfügen.


Wenn Sie es als Zeilenfolge anstelle eines Blocks einfügen möchten, gibt es drei Möglichkeiten.

  1. Im Einfügemodus können Sie es durch Drücken einfügen C-r ".
    Es sollte den Inhalt des unbenannten Registers so einfügen, als ob sein Typ zeilenweise wäre.

  1. Über die Befehlszeile können Sie den :putBefehl verwenden.
    :putsollte den Text in ein Register einfügen, als ob sein Typ zeilenweise wäre, unabhängig von seinem ursprünglichen Typ. Beachten Sie, dass Sie den Namen eines Registers als Argument sowie eine Zeilenadresse übergeben können, um anzugeben, unter welcher Zeile das Register eingefügt werden soll.

Zum Beispiel:

:42put a

... sollte den Inhalt des Registers aunter die 42dritte Zeile setzen.

Ohne einen Registernamen geht Vim davon aus, dass Sie das unbenannte Register (oder das +Register, wenn Sie Änderungen vorgenommen haben 'clipboard') einfügen möchten .
Und ohne Adresse geht Vim davon aus, dass Sie sie unterhalb der aktuellen Zeile einfügen möchten.


  1. Über die Befehlszeile können Sie den Typ des unbenannten Registers mit der folgenden setreg()Funktion ändern :

    :call setreg('"', '', 'al')

Hier setreg()sollte eine leere Zeichenfolge an das unbenannte Register aangehängt werden (dank des als drittes Argument übergebenen Flags) und sein Typ in zeilenweise geändert werden (dank des lFlags).

Im normalen Modus sollten Sie dann in der Lage sein, das Register mit dem pnormalen Befehl so einzufügen, als ob sein Typ zeilenweise wäre.


Es ist nicht direkt mit Ihrem Problem verknüpft, aber wenn Sie Text kopieren, wird es auch in das 0Register eingetragen. Wenn Sie unnamedplusder Option den Wert vorangestellt haben 'clipboard', wird er auch in das +Register eingetragen.

Mit der folgenden getregtype()Funktion können Sie den Registertyp überprüfen :

:echo getregtype('"')

Wenn Kleinbuchstaben zurückgegeben werden v, bedeutet dies, dass der Typ zeichenweise ist.
Wenn ein Großbuchstabe zurückgegeben wird V, bedeutet dies, dass der Typ zeilenweise ist.
Wenn es zurückkehrt ^V{some number}, bedeutet dies, dass der Typ blockweise und die Breite des Blocks ist {some number}.


3

Ich musste Registerinhalte so oft in einen bestimmten Modus (zeichenweise / zeilenweise / blockweise) "umwandeln", dass ich das UnconditionalPaste-Plugin dafür schrieb . Es bietet gcp, glpetc. Alternativen zu dem eingebauten in Paste - Befehlen , die einen bestimmten Modus (und inzwischen mehr Variationen dieses Thema, wie durch Komma oder abgefragten Zeichen mit verbundenem einfügen) zu erzwingen.

Mit ihm können Sie einfach glp/ glPnach / vor der aktuellen Zeile einfügen (als neue Zeilen), unabhängig davon, wie Sie den Text gezogen haben.


Ich beneide Sie, dass Sie Zeit haben, so etwas zu schreiben. QQ Aber ich bin zufrieden mit :put. (Auch upvoted Sie)
Violapterin

@Aminopterin: Ich habe so oft geantwortet, dass ich tatsächlich ein snipMate-Snippet für den ersten Absatz habe. Also muss ich nur ein bisschen anpassen. Vielen Dank für die Anerkennung meiner Antwort und die positive Bewertung!
Ingo Karkat

Oh, ich sagte, ich beneide dich, dass du Zeit hast, ein Plugin im Alleingang zu schreiben, so wie es unbeschwert gemacht wird ... erst im letzten halben Jahr habe ich angefangen, ein C ++ - Projekt als Hobbyprojekt zu schreiben, um mich zum Erlernen des Programmierens zu zwingen. und habe ich angefangen, vim ~~
Violapterin

2
@Aminopterin Ah, das Plugin begann als kleines Snippet, das von Vimtips kopiert wurde, und wuchs im Laufe der Zeit langsam. Da es sich für mich als so nützlich erwiesen hat, habe ich es schrittweise stark verbessert. Viele kleine Schritte sind leistungsfähiger als eine große Anstrengung!
Ingo Karkat
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.