So fügen Sie gerissenen Text in die Vim-Befehlszeile ein

Antworten:

1157

Ja. Hit Ctrl- Rdann ". Wenn Sie wörtliche Steuerzeichen in dem haben, was Sie gezogen haben, verwenden Sie Ctrl- R, Ctrl- O, ".

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

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

  • 0(Yank-Register: Wenn Sie yim normalen Modus ohne Angabe eines Registers verwenden, wird der Yank-Text dorthin und auch zum Standardregister geleitet.)
  • 1zu 9(Verschieben von Löschregistern, wenn Sie Befehle wie coder verwenden d, geht das, was gelöscht wurde, in Register 1, was in Register 1 war, geht in Register 2 usw. ),
  • "(Standardregister, auch als unbenanntes Register bezeichnet. Hier kommt das "herein Ctrl- R, "),
  • aum zfür den eigenen Gebrauch (kapitalisiert Azu Zentsprechenden Register werden zum Anhängen).
  • _(verhält sich wie /dev/null(Unix) oder NUL(Windows), Sie können darauf schreiben, aber es wird verworfen und wenn Sie daraus lesen, ist es immer leer),
  • - (kleines Löschregister),
  • /(Suchmusterregister, aktualisiert , wenn Sie nach Text suchen mit /, ?, *oder #zum Beispiel, können Sie auch darauf schreiben , um dynamisch das Suchmuster zu ändern),
  • :(speichert den letzten von VimL eingegebenen Befehl über Qoder :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 registersfür die vollständige Referenz.

Sie können jederzeit :registersden Inhalt aller Register anzeigen. Synonyme und Kürzel für diesen Befehl sind :display, :regund :di.

Im Einfüge- oder Befehlszeilenmodus fügt Ctrl- Rplus einen Registernamen den Inhalt dieses Registers ein. Wenn Sie sie wörtlich einfügen möchten (kein automatisches Einrücken, keine Konvertierung von Steuerzeichen wie 0x08Rücktaste usw.), können Sie den Registernamen Ctrl- R, Ctrl- Overwenden. Weitere :help i_CTRL-RInformationen finden Sie in den folgenden Absätzen.

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

  • Im normalen Modus drücken ":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 Doppelpunkt - Register (Speicherung letzten Befehls). Ist pdann ein Befehl, den Sie bereits kennen, fügt er den Inhalt des Registers ein.

    vgl. :help ",:help quote_:

  • Sie bearbeiten eine VimL-Datei (zum Beispiel Ihre .vimrc) und möchten jetzt einige aufeinanderfolgende Zeilen ausführen : yj:@"Enter.
    Hier werden yjdie aktuelle und die nächste Zeile (dies liegt daran, dass j eine zeilenweise Bewegung ist, dies jedoch außerhalb des Bereichs dieser Antwort liegt) in das Standardregister (auch als unbenanntes Register bezeichnet) gezogen. Dann spielt der :@Ex-Befehl Ex-Befehle ab, die in dem als Argument angegebenen Register gespeichert sind, und "verweist auf das unbenannte Register. Siehe auch den Anfang dieser Antwort, die verwandt ist.

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

    vgl. :help :@und:help quote_quote

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

    vgl. :help quote_/,help i_CTRL-R

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

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

    vgl. :help :put

    Du hättest es auch tun können: :call setreg('"', @", 'V')dann p. Die setregFunktion legt das Register fest, dessen Name als erstes Argument angegeben wird (als Zeichenfolge), initialisiert es mit dem Inhalt des zweiten Arguments (und Sie können Register als Variablen mit dem Namen verwenden, @xwobei xder Registername in VimL ist) und verwandelt es in den im dritten Argument angegebenen Modus Vfür zeilenweise, nichts für zeichenweise und wörtlich ^Vfür blockweise.

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

  • Wenn Sie ein Makro mit qa... aufgenommen haben q, :echo @aerfahren Sie, was Sie eingegeben haben, und @aspielen das Makro erneut ab (wahrscheinlich haben Sie dieses Makro gekannt, sehr nützlich, um sich wiederholende Aufgaben zu vermeiden).

    vgl. :help q,help @

    Folgerung aus dem vorherigen Beispiel: Wenn Sie 8goin der Zwischenablage haben, @+wird der Inhalt der Zwischenablage als Makro abgespielt und somit zum 8. Byte Ihrer Datei gewechselt. Eigentlich funktioniert das mit fast jedem Register. Wenn sich Ihre zuletzt eingefügte Zeichenfolge ddim Einfügemodus befand, @.wird (da das .Register die zuletzt eingefügte Zeichenfolge enthält) eine Zeile gelöscht. (Vim - Dokumentation ist falsch in diesem Zusammenhang, da es heißt , dass die Register #, %, :und .funktioniert nur mit p, P, :putund Ctrl- R).

    vgl. :help @

    Nicht verwechseln :@(Befehl, der Vim-Befehle aus einem Register wiedergibt) und @(Befehl im normalen Modus, der Befehle im normalen Modus aus einem Register wiedergibt).

    Bemerkenswerte Ausnahme ist @:. Das Befehlsregister enthält weder den ersten Doppelpunkt noch den endgültigen Wagenrücklauf. Im normalen Modus @:wird jedoch das getan, was Sie erwarten, indem Sie das Register als Ex-Befehl interpretieren und nicht versuchen, es im normalen Modus abzuspielen. Also , wenn Ihr letzter Befehl war :e, enthält das Register eaber @:wird die Datei neu zu laden, geht nicht von Wort zu beenden.

    vgl. :help @:

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

    vgl. :help quote_=

    Folgerung: 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! VerwendenCtrl - R =getline(58) Enter. Danach kehren Sie zur Befehlszeilenbearbeitung zurück, der Inhalt der 58. Zeile wurde jedoch eingefügt.

  • Definieren Sie ein Suchmuster manuell: :let @/ = 'foo'

    vgl. :help :let

    Beachten Sie, dass Sie dabei nicht entkommen müssen / im Muster . Allerdings müssen Sie natürlich alle einfachen Anführungszeichen verdoppeln.

  • Kopieren Sie alle Zeilen beginnend mit foo, und danach alle Zeilen mit barin die Zwischenablage, Kette diese Befehle: qaq(setzt das ein Register ein leeres Makro darin zu speichern), :g/^foo/y A,:g/bar/y A , :let @+ = @a.

    Wenn Sie einen Großbuchstaben verwenden, funktioniert das Register im Anhänge-Modus

    Besser, wenn Qnicht von neu zugeordnet wurde mswin.vim, starten Sie den Ex-Modus mit Q, verketten Sie die „Doppelpunktbefehle“, die eigentlich besser als „Ex-Befehle“ bezeichnet werden, und kehren Sie durch Eingabe in den Normalmodus zurückvisual .

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

  • Platzieren Sie Ihre Datei doppelt : :g/^/put _. Dies setzt den Inhalt des Schwarzlochregisters (leer beim Lesen, aber beschreibbar, verhält sich wie /dev/null) nach jeder Zeile (weil jede Zeile einen Anfang hat!).

  • Fügen Sie foovor jeder Zeile eine Zeile hinzu : :g/^/-put ='foo'. Dies ist eine clevere Verwendung des Ausdrucksregisters. Hier -ist ein Synonym für .-1(vgl. :help :range). Da :putder Text nach der Zeile steht, müssen Sie ihn explizit anweisen, auf die vorherige Zeile 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 misrecorded haben, können Sie eingeben :let @a=' Ctrl- R =replace(@a,"'","''",'g') Enter 'und bearbeiten es. Dadurch wird der Inhalt des im Register gespeicherten Makros geändert. Hier wird agezeigt, wie Sie das Ausdrucksregister verwenden können, um dies zu tun.

  • Wenn Sie dies getan haben dddd, können Sie dies tun, uuum den Vorgang rückgängig zu machen. Mit pkönnte man die zuletzt gelöschte Zeile bekommen. Tatsächlich können Sie aber auch bis zu 9 Löschvorgänge mit den Registern @1durch wiederherstellen@9 .

    Wenn Sie dies tun "1P, wird .im Normalmodus noch besser abgespielt"2P 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 verwirrend sein kann:

  • :@ ist ein Befehlszeilenbefehl, der den Inhalt eines Registers als Vimscript interpretiert und als Quelle verwendet
  • @ im Normalmodus Befehl, der den Inhalt eines Registers als Tastenanschläge im Normalmodus interpretiert (außer wenn Sie :Register verwenden, das den zuletzt gespielten Befehl ohne den ersten Doppelpunkt enthält: In diesem Fall wird der Befehl so wiederholt, als hätten Sie auch den Doppelpunkt und neu eingegeben die letzte Eingabetaste).

  • " im normalen Modus Befehl, mit dem Sie ein Register für Ziehen, 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
Benoit
quelle
205
Gibt es nicht ein Abzeichen "100/1 Längenverhältnis zwischen Antwort und Frage"? :)
Benoit
8
Es ist eine großartige Antwort, aber es sind ungefähr 900 Wörter vor 1400. :)
19
Diese Antwort hat die Art und Weise, wie ich vim benutze, verändert. Vielen Dank Benoit
P. Myer Nore
11
Vergessen Sie nicht: reg, die alle Register zusammen mit ihrem Inhalt
auflistet
3
In neueren Versionen von vim werden Löschungen, die kleiner als eine Zeile sind, in das "Register für kleine Löschungen" eingegeben, anstatt in die nummerierten Register. Referenzen: Vi und Vim , Vi und Vim , Reddit
Christian Long
48

Zum Einfügen von etwas, das die System-Zwischenablage ist, können Sie einfach SHIFT- verwenden INS.

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

skeept
quelle
7
Ja, funktioniert auch unter Linux. Getestet unter GNOME in Vim und GVim.
Teoulas
3
Dadurch wird das Pasteboard tatsächlich als Tastatureingabe an Vim weitergeleitet. Wenn Sie sich also im normalen Modus befinden und einfügen :!rm -rf /<cr>, wird dies ausgeführt. Verwenden Sie stattdessen Register!
Lericson
4
@lericson Habe ich in meiner Antwort nicht gesagt, dass dies für etwas nützlich ist, das sich in der Systemtastatur befindet? Ich verstehe die Ablehnung nicht. Und für Sie zum Beispiel ernsthaft? Hast du das wirklich in der Zwischenablage? Und Sie denken nicht, dass das Tippen shift-inseinfacher ist als ctrl-R+*? Dies ist natürlich, wenn Sie in gvim sind. Wenn Sie im Terminal mit einem anderen Computer verbunden sind und etwas aus Ihrer Zwischenablage einfügen möchten, wissen Sie etwas besseres als shift-ins? weil die Register in dieser Situation nicht funktionieren. Denken Sie bitte nach, bevor Sie Kommentare abgeben und andere Dinge tun (z. B. Abstimmungen).
Skeept
Ich denke, es ist eine Fehlinformation und ich habe nach diesem Urteil gehandelt.
Lericson
1
Funktioniert bei mir nicht Ich bekomme nur '<S-Insert>' zu meiner Kommandozeile hinzugefügt. Vielleicht fehlt mir etwas. (Ubuntu 19.04 / 2: 8.1.0320-1ubuntu3.1).
Max Waterman
39

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

Obwohl die Antwort mit der höchsten Bewertung sehr vollständig ist, bevorzuge ich die Bearbeitung des Befehlsverlaufs.

Geben Sie im normalen Modus Folgendes ein: q: . Auf diese Weise 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 unten.

Für genau das, was der Artikel verlangt, fügen Sie eine gezogene Zeile (oder etwas anderes) in eine Befehlszeile ein, ziehen Sie Ihren Text und dann: q:p( Wechseln Sie in den Bearbeitungsmodus für den Befehlsverlauf und (p) verwenden Sie Ihren gezogenen Text in einen neuen Befehl Zeile. Nach Belieben bearbeiten,enter ausführen.

Um den Befehlsverlaufsmodus zu verlassen, ist das Gegenteil der Fall. Geben Sie im normalen Modus im Befehlsverlauf Folgendes ein: :q+enter

Wandspiegel
quelle
1
Wenn Sie bereits einen vorhandenen Befehl ändern und nicht 'q:' gedrückt haben, drücken Sie Strg + f, um den Befehlsverlauf zu bearbeiten.
Clay
14

Verwenden Sie Ctrl+, Rgefolgt von + , um etwas aus der System-Zwischenablage in die Vim-Befehlszeile einzufügen ("Befehlsmodus") +. Für mich, zumindest unter Ubuntu, funktioniert Shift+ Insnicht.

PS: Ich bin mir nicht sicher, warum Ctrl+ Rgefolgt von *, was theoretisch dasselbe ist wie Ctrl+ Rgefolgt von, +scheint nicht immer zu funktionieren. Ich habe die +Version gesucht und entdeckt und sie scheint immer zu funktionieren, zumindest auf meiner Box.

Proto
quelle
2
Der Unterschied zwischen Strg-r + und Strg-r * besteht darin, dass Ersteres die reguläre Zwischenablage ist. Unter Linux gibt es jedoch einen zweiten Typ von Zwischenablage namens "Primär", der den zuletzt ausgewählten Text darstellt (die mittlere Maustaste daraus). . Dies ist jedoch nicht in Windows oder MAC verfügbar
Matias Thayer
13

Es ist auch erwähnenswert, dass die Ruckregister die gleichen sind wie die Makropuffer. Mit anderen Worten, Sie können einfach Ihren gesamten Befehl in Ihr Dokument schreiben (einschließlich Ihres eingefügten Snippets), ihn dann "byin das bRegister ziehen und dann mit ausführen @b.

naught101
quelle
1

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

:call VimuxRunCommand("python")

Die Dokumente für dieses Plugin werden nur mit Zeichenfolgenliteralen angezeigt. Folgendes wird unterbrochen, wenn Sie versuchen, Text auszuwählen, der doppelte Anführungszeichen enthält:

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

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

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

Übergibt den Inhalt des unbenannten Registers und arbeitet mit meinen doppelten Anführungszeichen und mehrzeiligen Randfällen.

Conrad.Dean
quelle
Ich denke, Ihrem letzten Beispiel fehlt ein ". Vielleicht meinten Sie VimuxRunCommand (" @ ").
kd8azz
Das würde das @Zeichen an den Befehl vimux senden . Stellen Sie sich vor @, Sie entkommen dem folgenden doppelten Anführungszeichen und werden als Register und nicht als reguläres Zeichen behandelt. Das von vnoremapmir definierte ist im visuellen Modus aktiv, zieht also den ausgewählten Text und fügt ihn dann in den Befehl vimux ein und sendet ihn an einen laufenden Interpreter in einem angrenzenden Bereich. Wirklich großartig, um an einem Skript zu arbeiten und kleine Teile davon mit ein paar Tastenanschlägen zu testen.
Conrad.Dean
1

OS X.

Wenn Sie Vim unter Mac OS X verwenden, wird es leider mit einer älteren Version geliefert und entspricht nicht den Optionen für die Zwischenablage. Zum Glück Homebrew dieses Problem leicht lösen.

Installieren Sie Vim:

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

Installieren Sie die GUI-Version von Vim:

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

Starten Sie das Terminal neu, damit es wirksam wird.


Fügen Sie die folgende Zeile an ~/.vimrc
set clipboard=unnamed

Jetzt können Sie die Zeile in Vim mit kopieren yyund systemweit einfügen.

anonym
quelle
1

Für den Kontext stammen diese Informationen aus sofort einsatzbereiten, keinen Plugins und keinem .vimrc Vim 7.4-Verhalten in Linux Mint mit den Standardoptionen.

Sie können Text jederzeit mit der Maus auswählen (oder mit Voder vund die Auswahl in das Register "*" einfügen) und mit Shift+ Ctrl+ in die Befehlszeile einfügenv .

Wenn Sie Ctrl+ rin die Befehlszeile eingeben, werden Sie aufgefordert, einen Registernamen einzugeben. Wenn Sie also eingeben, :CTRL-r*wird das Inhaltsregister * in die Befehlszeile eingefügt. Es wird jedes Register eingefügt, nicht nur "*. Siehe :help c_CTRL-R.

Außerdem wird die mittlere Maustaste in die Befehlszeile eingefügt.

Sehen :help->quote-plus für eine Beschreibung der wie X Window mit der Auswahl beschäftigt. Selbst in einem einfachen, sofort einsatzbereiten Vim (ebenfalls in Vim 7.4 unter 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 in Vim ausgewählten Text in viele andere X Window-Anwendungen ein, auch in GUI-Anwendungen (z. B. Firefox und Thunderbird) ), und das Einfügen von Text in die Befehlszeile ist auch möglich, wenn der Text aus anderen Apps ausgewählt wurde .

Weitere Informationen finden Sie unter: help-> x11-Auswahl.

tl; dr

Versuchen Sie zuerst: STRG-r und verwenden Sie dann Shift+ Ctrl+ voder die mittlere Maustaste, wenn Sie etwas anderes benötigen.

Es wird eingeräumt, dass es verwirrend sein kann.

wmmso
quelle
0
  1. "[a-z]y: Kopieren Sie den Text in das Register [az]

  2. Verwenden Sie :!diese Option , um zum Bearbeitungsbefehl zu gelangen

  3. Ctrl+ R: Folgen Sie der Registeridentität, um einzufügen, was Sie kopieren.

Früher war es CentOS 7.

Yang
quelle
Was ist mit "Es war CentOS 7" gemeint . ?
Peter Mortensen
0

Wenn Sie zwei Werte in zwei verschiedene Register gezogen haben (z. B. Register aund Register b), können Sie einfach eine Variable festlegen cund die Operation darauf ausführen.

Zum Beispiel, :set c = str2float(@a) + str2float(@b)und dann können Sie den Inhalt von cüberall einfügen .

Zum Beispiel , während in INSERT - Modus, CTRL + Rgeben Sie dann =in das Ausdrucksregister eintragen und geben Sie einfach cnach dem Gleichheitszeichen ein und drücken Sie die Eingabetaste. Fertig sollten Sie jetzt die Summe von aund habenb Register haben.

All dies kann in einem Makro aufgezeichnet und wiederholt werden!

Die str2floatFunktion wird verwendet, wenn Sie mit Floats arbeiten. Wenn Sie dies nicht tun, erhalten Sie stattdessen Ganzzahlen.

Ich bin nicht sicher, ob dies idiomatisch ist, aber es hat in meinem Fall funktioniert, in dem ich 2 Zahlen hintereinander hinzufügen und für weitere 500 Zeilen wiederholen musste.

Rafael
quelle