Ich möchte den kopierten Text in die Vim-Befehlszeile einfügen. Ist das möglich?
Ja. Drücken Sie Strg-R dann ". Wenn Sie wörtliche Steuerzeichen in dem zu löschenden Text haben, verwenden Sie Ctrl-R, Ctrl-O, ". Hier wird erklärt, was man mit Registern machen kann. Was man mit Registern machen kann, ist außergewöhnlich, und wenn man einmal weiß, wie man sie benutzt, kann man nicht mehr ohne sie leben. Register sind im Grunde Speicherplätze für Zeichenketten. Vim hat viele Register, die auf unterschiedliche Weise funktionieren:
0
(Yankee-Register: wenn Sie y
im normalen Modus benutzen, ohne ein Register anzugeben, geht der Yankee-Text dorthin und auch in das Standardregister),1
bis 9
(Verschieben von Löschregistern, wenn Sie Befehle wie c
oder d
verwenden, geht das, was gelöscht wurde, in Register 1, was in Register 1 war, geht in Register 2, etc.),"
(Standardregister, auch bekannt als unbenanntes Register. Hier kommt das " ins Spiel Ctrl-R, "),a
bis z
für den eigenen Gebrauch (großgeschriebene A
bis Z
sind zum Anhängen an die entsprechenden Register)._
(verhält sich wie /dev/null
(Unix) oder NUL
(Windows), man kann darauf schreiben, aber es wird verworfen und wenn man daraus liest, ist es immer leer),-
(kleines Löschregister),/
(Suchmusterregister, das aktualisiert wird, wenn Sie nach Text suchen, der z.B. /
, ?
, *
oder #
enthält; Sie können auch in das Register schreiben, um das Suchmuster dynamisch zu ändern),:
(speichert den letzten mit Q
oder :
eingegebenen VimL-Befehl, schreibgeschützt),+
und *
(System-Zwischenablage-Register, Sie können in sie schreiben, um die Zwischenablage zu setzen und den Inhalt der Zwischenablage aus ihnen zu lesen)
Siehe :help registers
für die vollständige Referenz.
Sie können jederzeit :registers
verwenden, um den Inhalt aller Register anzuzeigen. Synonyme und Abkürzungen für diesen Befehl sind :display
, :reg
und :di
.
Im Einfüge- oder Befehlszeilenmodus wird mit Strg-R plus einem Registernamen der Inhalt dieses Registers eingefügt. Wenn Sie sie wortwörtlich einfügen wollen (keine automatische Einrückung, keine Umwandlung von Steuerzeichen wie 0x08
in Backspace, usw.), können Sie Ctrl-R, Ctrl-O, Registername verwenden.
Siehe :help i_CTRL-R
und die folgenden Abschnitte für weitere Hinweise.
Sie können aber auch folgendes tun (und ich habe wahrscheinlich viele Verwendungen von Registern vergessen)."
ist ein Normalmodus-Befehl, mit dem Sie auswählen können, welches Register bei der nächsten yank-, Lösch- oder Einfügeoperation verwendet werden soll. Also ": wählt das Doppelpunkt-Register (Speichern des letzten Befehls). Dann p ist ein Befehl, den Sie bereits kennen, er fügt den Inhalt des Registers ein.
vgl. :help "
, :help quote_:
.vimrc
) und möchten jetzt ein paar aufeinanderfolgende Zeilen ausführen: yj :@"Enter.:@
Ex-Befehle ab, die in dem als Argument angegebenen Register gespeichert sind, und "
ist die Art und Weise, wie Sie sich auf das unbenannte Register beziehen. Siehe auch den oberen Teil dieser Antwort, die damit zusammenhängt.
Verwechseln Sie das hier verwendete "
(das ein Registername ist) nicht mit dem "
aus dem vorherigen Beispiel, das ein Normalmodus-Befehl war.
vgl. :help :@
und :help quote_quote
:help quote_/
, help i_CTRL-R
Korollarisch: Behalten Sie Ihr Suchmuster bei, aber fügen Sie eine Alternative hinzu: /
Strg-R, / \|alternative
.y
herausgezogen, sie befinden sich im unbenannten Register. Nun wollen Sie eine neue Zeile direkt unter der aktuellen Zeile mit diesen beiden Wörtern öffnen: :pu
. Das ist die Abkürzung für :put "
. Der Befehl :put
funktioniert, wie viele Ex-Befehle, nur zeilenweise.
vgl. :help :put
Sie hätten auch so vorgehen können: :call setreg('"', @", 'V')
dann p
. Die Funktion setreg
setzt das Register, dessen Name als erstes Argument angegeben wird (als Zeichenkette), initialisiert es mit dem Inhalt des zweiten Arguments (und Sie können Register als Variablen mit dem Namen @x
benutzen, wobei x
der Registername in VimL ist), und versetzt es in den im dritten Argument angegebenen Modus, V
für zeilenweise, nichts für zeichenweise und literal ^V
für blockweise.
vgl. :help setreg()
. Die umgekehrten Funktionen sind getreg()
und getregtype()
.qa
...q
aufgezeichnet haben, dann sagt Ihnen :echo @a
, was Sie eingegeben haben, und @a
gibt das Makro wieder (wahrscheinlich kennen Sie das, sehr nützlich, um sich wiederholende Aufgaben zu vermeiden)
vgl. :help q
, help @
Konsequenz aus dem vorherigen Beispiel: Wenn Sie 8go
in der Zwischenablage haben, dann wird @+
den Inhalt der Zwischenablage als Makro abspielen und somit zum 8. Byte Ihrer Datei gehen. Eigentlich funktioniert das mit fast jedem Register. Wenn Ihre letzte eingefügte Zeichenkette dd
im Einfügemodus war, dann wird @.
(weil das .
Register die letzte eingefügte Zeichenkette enthält) eine Zeile löschen. (Die Vim-Dokumentation ist in dieser Hinsicht falsch, da sie besagt, dass die Register #
, %
, :
und .
nur mit p
, P
, :put
und Ctrl-R funktionieren).
vgl. :help @
Verwechseln Sie nicht :@
(Befehl, der Vim-Befehle aus einem Register abspielt) und @
(Normalmodus-Befehl, der Normalmodus-Befehle aus einem Register abspielt).
Eine bemerkenswerte Ausnahme ist @:
. Das Befehlsregister enthält weder den einleitenden Doppelpunkt noch den abschließenden Wagenrücklauf. Im Normalmodus wird @:
jedoch das tun, was Sie erwarten, nämlich das Register als Ex-Befehl interpretieren und nicht versuchen, es im Normalmodus abzuspielen. Wenn also Ihr letzter Befehl :e
war, enthält das Register e
, aber @:
wird die Datei neu laden und nicht zum Wortende gehen.
vgl. :help @:
@='dd'
Enter. Sobald Sie die =
Taste drücken, schaltet Vim auf Ausdrucksauswertung um: wenn Sie einen Ausdruck eingeben und Enter drücken, berechnet Vim ihn, und das Ergebnis fungiert als Registerinhalt. Natürlich ist das Register =" schreibgeschützt und einmalig. Jedes Mal, wenn Sie es benutzen, müssen Sie einen neuen Ausdruck eingeben. vgl.
:help quote_= Korollarisch: Wenn Sie einen Befehl bearbeiten und feststellen, dass Sie eine Zeile aus dem aktuellen Puffer in Ihre Befehlszeile einfügen müssen: Drücken Sie nicht <kbd>Esc</kbd>! Verwenden Sie <kbd>Strg</kbd>-<kbd>R</kbd>
=getline(58)` Enter. Danach kehren Sie zur Befehlszeilenbearbeitung zurück, aber es wird der Inhalt der 58.:let @/ = 'foo'
vgl. :help :let
Beachten Sie, dass Sie dabei /
im Suchmuster nicht zu escapen brauchen. Allerdings müssen Sie natürlich alle einfachen Anführungszeichen verdoppeln.foo
beginnen, und danach alle Zeilen, die bar
enthalten, in die Zwischenablage, und verketten Sie diese Befehle: qaq
(setzt das a-Register zurück und speichert ein leeres Makro darin), :g/^foo/y A
, :g/bar/y A
, :let @+ = @a
.
Die Verwendung eines großen Registernamens bewirkt, dass das Register im Append-Modus funktioniert
Besser ist es, wenn Q
nicht von mswin.vim
neu zugeordnet wurde, den Ex-Modus mit Q
zu starten, diese "Doppelpunkt-Befehle", die eigentlich besser "Ex-Befehle" genannt werden, zu verketten und durch Eingabe von visual
in den Normal-Modus zurückzukehren.
vgl. :help :g
, :help :y
, :help Q
:g/^/put _
. Dies setzt den Inhalt des schwarzen Loches (leer beim Lesen, aber beschreibbar, verhält sich wie /dev/null
) zeilenweise nach jeder Zeile (weil jede Zeile einen Anfang hat!).foo
vor jeder Zeile ein: :g/^/-put ='foo'
. Dies ist eine geschickte Verwendung des Ausdrucksregisters. Hier ist -
ein Synonym für .-1
(vgl. :help :range
). Da :put
den Text nach der Zeile einfügt, müssen Sie ihm explizit sagen, dass er auf die vorherige Zeile wirken soll.:%y+
.
vgl. :help :range
(für den %
Teil) und :help :y
.:let @a='
Strg-R =replace(@a,"'","''",'g')
Enter '
ein und bearbeiten es. Dadurch wird der Inhalt des in Register a
gespeicherten Makros geändert, und hier wird gezeigt, wie Sie das Ausdrucksregister dafür verwenden können.dddd
gemacht haben, könnten Sie uu
machen, um es rückgängig zu machen. Mit p
könnte man die letzte gelöschte Zeile erhalten. Aber eigentlich kann man auch bis zu 9 Löschungen mit den Registern @1
bis @9
wiederherstellen.
Noch besser, wenn Sie "1P
machen, dann spielt .
im Normalmodus "2P
, und so weiter.
vgl. :help .
und :help quote_number
=strftime('%y%m%d')
Enter.
vgl. :help strftime()
Noch einmal, was verwirrend sein kann::@
ist ein Kommandozeilenbefehl, der den Inhalt eines Registers als Vimscript interpretiert und ausgibt@
im normalen Modus ist ein Befehl, der den Inhalt eines Registers als normale Tastenanschläge interpretiert (außer wenn Sie das :
-Register benutzen, das den zuletzt gespielten Befehl ohne den anfänglichen Doppelpunkt enthält: in diesem Fall wird der Befehl so wiedergegeben, als ob Sie auch den Doppelpunkt und die abschließende Eingabetaste erneut eingegeben hätten)."
im normalen Modus ist ein Befehl, der Ihnen hilft, ein Register für Yank, Paste, Delete, Correct, etc. auszuwählen."
ist auch ein gültiger Registername (das Standard- oder unbenannte Register) und kann daher als Argument für Befehle übergeben werden, die Registernamen erwartenUm etwas einzufügen, das sich in der Systemzwischenablage befindet, können Sie einfach SHIFT - INS verwenden.
Das funktioniert unter Windows, aber ich nehme an, dass es auch unter Linux gut funktioniert.
Um etwas aus der Systemzwischenablage in die vim-Befehlszeile ("Befehlsmodus") einzufügen, verwenden Sie Strg+R gefolgt von +. Bei mir, zumindest unter Ubuntu, funktioniert Shift+Ins nicht.
PS: Bin mir nicht sicher, warum Strg+R gefolgt von *, was theoretisch dasselbe ist wie Ctrl+R gefolgt von + scheint aber nicht immer zu funktionieren. Ich habe gesucht und die Version + entdeckt, und sie scheint immer zu funktionieren, zumindest auf meinem Rechner.