it-swarm.com.de

Wie füge ich den gerippten Text in die Vim-Befehlszeile ein?

Ich möchte den gerippten Text in die Vim-Befehlszeile einfügen. Ist es möglich?

548
dan

Ja. Schlagen Ctrl-R dann ". Wenn Sie in dem, was Sie gezerrt haben, buchstäbliche Steuerzeichen haben, verwenden Sie Ctrl-RCtrl-O".

Hier finden Sie eine Erklärung, was Sie mit Registern tun können. Was Sie mit Registern machen können, ist außergewöhnlich, und wenn Sie erst einmal wissen, wie man sie benutzt, können Sie nicht mehr ohne sie leben.

Register sind im Grunde Speicherorte für Zeichenfolgen. Vim hat viele Register, die auf unterschiedliche Weise funktionieren:

  • 0 (Yank-Register: Wenn Sie y im normalen Modus ohne Angabe eines Registers verwenden, wird der Text mit einem Ruck dorthin und auch in das Standardregister verschoben.)
  • 1 zu 9 (Verschieben von Löschregistern, wenn Sie Befehle wie c oder d verwenden, geht das Gelöschte zu Register 1, das, was in Register 1 war, geht zu Register 2, etc.),
  • " (Standardregister, auch als unbenanntes Register bezeichnet. Hier befindet sich das " kommt herein Ctrl-R"),
  • a bis z für Ihren eigenen Gebrauch (großgeschriebene A bis Z werden an entsprechende Register angehängt).
  • _ (verhält sich wie /dev/null (Unix) oder NUL (Windows), Sie können darauf schreiben, aber es wird verworfen und beim Lesen ist es immer leer.)
  • - (kleines Löschregister),
  • / (Suchmusterregister, aktualisiert, wenn Sie mit /, ?, * oder # nach Text suchen; Sie können auch schreiben, um das Suchmuster dynamisch zu ändern),
  • : (speichert den letzten von VimL eingegebenen Befehl über Q oder :, schreibgeschützt),
  • + und * (System-Zwischenablage-Register, in die Sie schreiben können, um die Zwischenablage festzulegen und den Inhalt der Zwischenablage daraus 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 Ctrl-R plus einen Registernamen, fügt den Inhalt dieses Registers ein. Wenn Sie sie wörtlich einfügen möchten (kein automatisches Einrücken, keine Konvertierung von Steuerzeichen wie 0x08 in die Rücktaste usw.), können Sie verwenden Ctrl-RCtrl-O, registriere den Namen. Weitere Informationen finden Sie unter :help i_CTRL-R und in den folgenden Abschnitten.

Sie können aber auch Folgendes tun (und ich habe wahrscheinlich viele Verwendungen für Register vergessen).

  • Im normalen Modus drücken Sie ":p. Der letzte Befehl, den Sie in vim verwendet haben, wird in Ihren Puffer eingefügt.
    Zerlegen wir: " ist ein Befehl im Normalmodus, mit dem Sie auswählen können, welches Register beim nächsten Ziehen, Löschen oder Einfügen verwendet werden soll. So ": Wählt das Doppelpunktregister aus (speichert den letzten Befehl). Dann p Ist ein Befehl, den Sie bereits kennen, fügt er den Inhalt des Registers ein.

    vgl. :help ", :help quote_:

  • Sie bearbeiten eine VimL-Datei (z. B. Ihren .vimrc) und möchten gerade ein paar aufeinanderfolgende Zeilen ausführen: yj:@"Enter.
    Hier, yj Die aktuelle und die nächste Zeile werden in das Standardregister (auch als unbenanntes Register bezeichnet) verschoben (dies liegt daran, dass j eine Bewegung in Zeilenrichtung ist, dies jedoch außerhalb des Bereichs dieser Antwort liegt). Dann spielt der :@ Ex-Befehl Ex-Befehle ab, die in dem als Argument angegebenen Register gespeichert sind, und mit " verweisen Sie auf das unbenannte Register. Siehe auch den Anfang dieser Antwort, die verwandt ist.

    Verwechseln Sie hier verwendetes " (das ist ein Registername) nicht mit dem " aus dem vorherigen Beispiel, das ein Befehl im Normalmodus war.

    vgl. :help :@ und :help quote_quote

  • Fügen Sie das letzte Suchmuster im Einfügemodus oder in der Befehlszeile mit in Ihre Datei ein Ctrl-R/.

    vgl. :help quote_/, help i_CTRL-R

    Fazit: Behalten Sie Ihr Suchmuster bei, aber fügen Sie eine Alternative hinzu: / Ctrl-R/ \|alternative.

  • Sie haben zwei Wörter in der Mitte einer Zeile im visuellen Modus ausgewählt und sie mit y gezerrt. Sie befinden sich im unbenannten Register. Jetzt möchten Sie eine neue Zeile direkt unter Ihrer Position mit den folgenden beiden Wörtern öffnen: :pu. Dies ist die Abkürzung für :put ". Der Befehl :put funktioniert wie viele Ex-Befehle nur zeilenweise.

    vgl. :help :put

    Sie hätten auch Folgendes tun können: :call setreg('"', @", 'V') dann p. Die Funktion setreg legt das Register fest, dessen Name als erstes Argument (als Zeichenfolge) angegeben wird, initialisiert es mit dem Inhalt des zweiten Arguments (und Sie können Register als Variablen mit dem Namen @x verwenden, wobei x der Registername in VimL ist ), und verwandelt es in den Modus, der im dritten Argument angegeben ist: V für zeilenweise, nothing für zeichenweise und literal ^V für blockweise.

    vgl. :help setreg(). Die umgekehrten Funktionen sind getreg() und getregtype().

  • Wenn Sie ein Makro mit qa...q aufgezeichnet haben, teilt Ihnen :echo @a mit, was Sie eingegeben haben, und @a gibt das Makro wieder (wahrscheinlich haben Sie das gewusst, was sehr nützlich ist, um sich wiederholende Aufgaben zu vermeiden).

    vgl. :help q, help @

    Folgerung aus dem vorherigen Beispiel: Wenn Sie 8go in der Zwischenablage haben, spielt @+ den Inhalt der Zwischenablage als Makro ab und springt so zum achten Byte Ihrer Datei. Eigentlich funktioniert das mit fast jedem Register. Wenn Ihre zuletzt eingefügte Zeichenfolge im Einfügemodus dd lautete, löscht @. (da das Register . die zuletzt eingefügte Zeichenfolge enthält) eine Zeile. (Vim-Dokumentation ist in dieser Hinsicht falsch, da angegeben wird, dass die Register #, %, : und . nur mit p, P, :put und :help @ funktionieren Ctrl-R).

    vgl. :@

    Verwechseln Sie nicht @ (Befehl, der Vim-Befehle aus einem Register abspielt) und @: (Befehl im Normalmodus, der Befehle im Normalmodus aus einem Register abspielt).

    Bemerkenswerte Ausnahme ist @:. Das Befehlsregister enthält weder den anfänglichen Doppelpunkt noch den letzten Wagenrücklauf. Im normalen Modus wird :e jedoch das tun, was Sie erwarten, und das Register als Ex-Befehl interpretieren, ohne zu versuchen, es im normalen Modus abzuspielen. Wenn Ihr letzter Befehl also @: lautete, enthält das Register e, aber :help @: lädt die Datei neu, nicht bis zum Ende von Word.

    vgl. @='dd'

  • Zeigen Sie, was Sie im normalen Modus tun, bevor Sie ihn ausführen: = Enter. Sobald Sie die Taste = drücken, wechselt Vim zur Ausdrucksauswertung: Wenn Sie einen Ausdruck eingeben und drücken Enter, Vim berechnet es und das Ergebnis fungiert als Registerinhalt. Natürlich ist das Register :help quote_= schreibgeschützt und einmalig. Jedes Mal, wenn Sie es verwenden, müssen Sie einen neuen Ausdruck eingeben.

    vgl. :let @/ = 'foo'

    Fazit: Wenn Sie einen Befehl bearbeiten und feststellen, dass Sie eine Zeile aus Ihrem aktuellen Puffer in Ihre Befehlszeile einfügen müssen: Drücken Sie nicht Esc! Benutzen Ctrl-R =getline(58) Enter. Danach kehren Sie zur Befehlszeilenbearbeitung zurück, aber der Inhalt der 58. Zeile wurde eingefügt.

  • Definieren Sie ein Suchmuster manuell: :help :let

    vgl. /

    Beachten Sie, dass Sie dabei :g/^foo/y A im Muster nicht entkoppeln müssen. Natürlich müssen Sie jedoch alle einfachen Anführungszeichen verdoppeln.

  • Kopieren Sie alle Zeilen, die mit foo beginnen, und anschließend alle Zeilen, die bar enthalten, in die Zwischenablage. Verketten Sie die folgenden Befehle: qaq (setzt das a -Register zurück, in dem ein leeres Makro gespeichert ist), :g/bar/y A, :let @+ = @a.

    Die Verwendung eines Großbuchnamens bewirkt, dass das Register im Anhänge-Modus arbeitet

    Wenn Q von mswin.vim nicht neu zugeordnet wurde, starten Sie den Ex-Modus mit Q, verketten Sie die "Doppelpunktbefehle", die eigentlich besser als "Ex-Befehle" bezeichnet werden, und kehren Sie zum normalen Modus zurück, indem Sie visual eingeben.

    vgl. :help :g, :help :y, :help Q

  • Doppeltes Leerzeichen für Ihre Datei: :g/^/put _. Dadurch wird der Inhalt des Black-Hole-Registers (beim Lesen leer, aber schreibbar, wie bei /dev/null) nach jeder Zeile zeilenweise eingefügt (da jede Zeile einen Anfang hat!).

  • Fügen Sie vor jeder Zeile eine Zeile hinzu, die foo enthält: :g/^/-put ='foo'. Dies ist eine clevere Verwendung des Ausdrucksregisters. Hier ist - ein Synonym für .-1 (vgl. :help :range). Da :put den Text nach der Zeile setzt, müssen Sie ihn explizit anweisen, auf die vorherige zu reagieren.

  • Kopieren Sie den gesamten Puffer in die Systemzwischenablage: :%y+.

    vgl. :help :range (für den Teil %) und :help :y.

  • Wenn Sie ein Makro falsch aufgezeichnet haben, können Sie :let @a=' eingeben. Ctrl-R =replace(@a,"'","''",'g') Enter ' und bearbeite es. Dies ändert den Inhalt des Makros, das im Register a gespeichert ist, und es wird hier gezeigt, wie Sie das Ausdrucksregister verwenden können, um dies zu tun.

  • Wenn Sie dddd ausgeführt haben, können Sie uu ausführen, um den Vorgang rückgängig zu machen. Mit p können Sie die letzte gelöschte Zeile erhalten. Tatsächlich können Sie mit den Registern @1 bis @9 aber auch bis zu 9 Löschvorgänge wiederherstellen.

    Wenn Sie "1P ausführen, wird . im normalen Modus "2P wiedergegeben, und so weiter.

    vgl. :help . und :help quote_number

  • Wenn Sie das aktuelle Datum im Einfügemodus einfügen möchten: Ctrl-R=strftime('%y%m%d')Enter.

    vgl. :help strftime()

Noch einmal, was kann verwirrend sein:

  • :@ ist ein Befehlszeilenbefehl, der den Inhalt eines Registers als Vimscript interpretiert und als Quelle verwendet
  • @ im Normalmodus-Befehl, der den Inhalt eines Registers als Tastatureingaben im Normalmodus interpretiert (außer bei Verwendung des Registers :, 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 Befehl erneut eingegeben hätten Doppelpunkt und die letzte Eingabetaste).

  • " im normalen Modus, mit dem Sie ein Register für Ruckeln, Einfügen, Löschen, Korrigieren usw. auswählen können.

  • " ist auch ein gültiger Registername (das Standardregister oder das unbenannte Register) und kann daher als Argument für Befehle übergeben werden, die Registernamen erwarten
1086
Benoit

Zum Einfügen von etwas, das die Systemzwischenablage ist, können Sie nur verwenden SHIFT - INS.

Es funktioniert unter Windows, aber ich vermute, es funktioniert auch unter Linux.

45
skeept

"Ich möchte Text in die Vim-Befehlszeile einfügen."

Obwohl die Antwort mit den meisten Stimmen sehr vollständig ist, bevorzuge ich die Bearbeitung des Befehlsverlaufs.

Geben Sie im normalen Modus Folgendes ein: q:. Dadurch erhalten Sie eine Liste der zuletzt verwendeten Befehle, die mit normalen vim-Befehlen bearbeitet und durchsucht werden können. Sie beginnen mit einer leeren Befehlszeile am unteren Rand.

Genau das, was der Artikel verlangt, indem er eine gezerrte Zeile (oder etwas anderes) in eine Befehlszeile einfügt, den Text zerrt und dann: q:p (in den Bearbeitungsmodus für den Befehlsverlauf wechseln und dann den gezerrten Text in einen neuen Text (p) einfügt Befehlszeile. Bearbeiten Sie nach Belieben, enter ausführen.

Um den Befehlsverlaufsmodus zu verlassen, ist es umgekehrt. Geben Sie im normalen Modus im Befehlsverlauf Folgendes ein: :qenter

35
Wandspiegel

Verwenden Sie zum Einfügen von Elementen aus der Systemzwischenablage in die vim-Befehlszeile ("Befehlsmodus") Ctrl+R gefolgt von +. Für mich zumindest auf Ubuntu, Shift+Ins funktioniert nicht.

PS: Ich weiß nicht warum Ctrl+R gefolgt von *, das ist theoretisch das gleiche wie Ctrl+R gefolgt von + scheint nicht immer zu funktionieren. Ich suchte und entdeckte die + version und es scheint immer zu funktionieren, zumindest auf meiner box.

14
Proto

Es ist auch erwähnenswert, dass die Ruckregister den Makro-Puffern entsprechen. Mit anderen Worten, Sie können einfach Ihren gesamten Befehl in Ihrem Dokument ausschreiben (einschließlich Ihres eingefügten Snippets), dann "by in das b-Register ziehen und ihn dann mit @b ausführen.

13
naught101

diese Frage ist ziemlich alt, aber da sie so oft angesehen wurde, scheint sie beliebt zu sein - ich werde sie hier für die Nachwelt stellen. Für den Kontext stammen diese Informationen von der Standardeinstellung, ohne Plugins, ohne Verhalten von .vimrc vim 7.4 in Linux mint mit den Standardoptionen.

sie können Text immer mit der Maus auswählen (oder mit V oder v und Platzieren der Auswahl in das Register "*") und mit SHIFT-CTL-v in die Befehlszeile einfügen. 

wenn Sie in der Befehlszeile CTL-r eingeben, wird eine Eingabeaufforderung für einen Registernamen angezeigt. Geben Sie also Folgendes ein: CTL-r * fügt das Inhaltsregister * in die Befehlszeile ein. es wird jedes Register einfügen, nicht nur "*. siehe: help c_CTRL-R.

außerdem wird die mittlere Maustaste in die Befehlszeile eingefügt Siehe: help-> quote-plus, um zu erfahren, wie x11 mit der Auswahl umgeht. selbst in einem einfachen vta aus der Box (jedenfalls in vim 7.4 in Linux Mint) kann jede mit der linken Maustaste getroffene Auswahl mit der mittleren Maustaste in die Befehlszeile eingefügt werden. 

darüber hinaus fügt die mittlere Maustaste den in vim ausgewählten Text in vielen anderen x11-Anwendungen ein, auch in Gui-Anwendungen (z. B. Firefox, Thunderbird). Das Einfügen von Text in die Befehlszeile ist auch möglich, wenn der Text aus anderen Apps ausgewählt wurde. 

siehe: Hilfe-> X11-Auswahl für Addl-Info.

tl; dr

probieren Sie zunächst den Ansatz: CTL-r aus, und verwenden Sie dann SHIFT-CTL-v oder die mittlere Maustaste, wenn Sie etwas anderes benötigen.

es wird zugegeben, dass es verwirrend sein kann.

1
wmmso

Ich hatte ein ähnliches Problem. Ich wollte, dass der ausgewählte Text in einem Befehl landet, aber nicht darauf, ihn einzufügen. Hier ist der Befehl, für den ich ein Mapping schreiben wollte:

:call VimuxRunCommand("python")

Die Dokumente für dieses Plugin werden nur mit String-Literalen angezeigt. Wenn Sie versuchen, Text auszuwählen, der doppelte Anführungszeichen enthält, wird Folgendes abgebrochen:

vnoremap y:call VimuxRunCommand("<c-r>"")<cr>

Um dies zu umgehen, referenzieren Sie einfach den Inhalt des Makros mit @:

vnoremap y:call VimuxRunCommand(@")<cr>

Übergibt den Inhalt des unbenannten Registers und arbeitet mit meinem doppelten Anführungszeichen und mehrzeiligen Edgecases.

1
Conrad.Dean

OSX

Wenn Sie vim in MAC OSX verwenden, wird es leider mit einer älteren Version geliefert, und die Zwischenablageoptionen wurden nicht eingehalten. Glücklicherweise kann Homebrew dieses Problem leicht lösen.

vim installieren:

brew install vim --with-lua --with-override-system-vi

installieren Sie eine Version von vim:

brew install macvim --with-lua --with-override-system-vi

starten Sie das Terminal neu, um wirksam zu werden. 


füge die folgende Zeile an ~/.vimrc
set clipboard=unnamed

jetzt können Sie die Zeile in vim mit yy kopieren und systemweit einfügen.

1
anonymous
  1. "[a-z]y Text in das [a-z] -Register kopieren;

  2. verwenden Sie :!go, um den Befehl zu bearbeiten.

  3. CTRL+R folgt der Registeridentität, um das kopierte Dokument einzufügen.

Früher war es CentOS7.

0
yang