Ich möchte zerrissenen Text in die Befehlszeile von Vim einfügen. Ist es möglich?
Ich möchte zerrissenen Text in die Befehlszeile von Vim einfügen. Ist es möglich?
Antworten:
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 y
im normalen Modus ohne Angabe eines Registers verwenden, wird der Yank-Text dorthin und auch zum Standardregister geleitet.)1
zu 9
(Verschieben von Löschregistern, wenn Sie Befehle wie c
oder 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, "),a
um z
für den eigenen Gebrauch (kapitalisiert A
zu Z
entsprechenden 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 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
den Inhalt aller Register anzeigen. Synonyme und Kürzel für diesen Befehl sind :display
, :reg
und :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 0x08
Rücktaste usw.), können Sie den Registernamen Ctrl- R, Ctrl- Overwenden. Weitere :help i_CTRL-R
Informationen 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 :put
Befehl funktioniert wie viele Ex-Befehle nur zeilenweise.
vgl. :help :put
Du hättest es auch tun können: :call setreg('"', @", 'V')
dann p
. Die setreg
Funktion 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, @x
wobei x
der Registername in VimL ist) und verwandelt es in den im dritten Argument angegebenen Modus V
für zeilenweise, nichts für zeichenweise und wörtlich ^V
für blockweise.
vgl. :help setreg()
. Die umgekehrten Funktionen sind getreg()
und getregtype()
.
Wenn Sie ein Makro mit qa
... aufgenommen haben q
, :echo @a
erfahren Sie, was Sie eingegeben haben, und @a
spielen 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 8go
in 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 dd
im 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
, :put
und 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 e
aber @:
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 bar
in 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 Q
nicht 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 foo
vor 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 :put
der 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 a
gezeigt, wie Sie das Ausdrucksregister verwenden können, um dies zu tun.
Wenn Sie dies getan haben dddd
, können Sie dies tun, uu
um den Vorgang rückgängig zu machen. Mit p
könnte man die zuletzt gelöschte Zeile bekommen. Tatsächlich können Sie aber auch bis zu 9 Löschvorgänge mit den Registern @1
durch 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 erwartenZum 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.
:!rm -rf /<cr>
, wird dies ausgeführt. Verwenden Sie stattdessen Register!
shift-ins
einfacher 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).
"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
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.
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 "by
in das b
Register ziehen und dann mit ausführen @b
.
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.
@
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 vnoremap
mir 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.
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 yy
und systemweit einfügen.
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.
"[a-z]y
: Kopieren Sie den Text in das Register [az]
Verwenden Sie :!
diese Option , um zum Bearbeitungsbefehl zu gelangen
Ctrl+ R: Folgen Sie der Registeridentität, um einzufügen, was Sie kopieren.
Früher war es CentOS 7.
Wenn Sie zwei Werte in zwei verschiedene Register gezogen haben (z. B. Register a
und Register b
), können Sie einfach eine Variable festlegen c
und 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 + R
geben Sie dann =
in das Ausdrucksregister eintragen und geben Sie einfach c
nach dem Gleichheitszeichen ein und drücken Sie die Eingabetaste. Fertig sollten Sie jetzt die Summe von a
und habenb
Register haben.
All dies kann in einem Makro aufgezeichnet und wiederholt werden!
Die str2float
Funktion 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.