Im Einfügemodus einfügen?


385

Ist es möglich, im Einfügemodus in Vim einzufügen?

Antworten:


465

Im Einfügemodus drücken CTRL-R {register}

Beispiele:

  • CTRL-R * wird in den Inhalt der Zwischenablage eingefügt
  • CTRL-R " (das unbenannte Register) fügt das letzte Löschen oder Ziehen ein.

Um dies in der Hilfe von vim zu finden, geben Sie ein :h i_ctrl-r


13
Ja, ich habe erst kürzlich von STRG-R erfahren und es ist äußerst nützlich.
Dan

16
CTRL-R *Funktioniert nur in GVIM oder in Versionen, die für die Interaktion mit x kompiliert wurden. Tippe vim --versionund suche +xterm_clipboard. Wenn Sie das nicht haben, benötigen Sie eine andere Version von vim. ( vim.wikia.com/wiki/Accessing_the_system_clipboard )
Conrad.Dean

10
Sie brauchen eigentlich nur +clipboard, aber wenn Sie haben +xterm_clipboard, sollten Sie das trotzdem haben. Auf einigen Betriebssystemen xterm_clipboardist nicht anwendbar.
Andrew Marshall

1
Hmm, ich verwende C-r + zum Einfügen aus der System-Zwischenablage unter Windows (mit GVim Portable)? Noch nie von * register gehört.
Kitsu.eb

6
@ kitsu.eb Auf X-Systemen kann das *Register mit einem mittleren Mausklick eingefügt werden, während +das herkömmliche Kopieren / Einfügen erfolgt. standards.freedesktop.org/clipboards-spec/clipboards-latest.txt
amc

235

Wenn Sie nicht möchten, dass Vim die Formatierung in eingehendem eingefügtem Text beeinträchtigt, sollten Sie auch Folgendes in Betracht ziehen : :set paste. Dadurch wird verhindert, dass Vim Ihren Code erneut abruft. Wenn Sie mit dem Einfügen fertig sind, :set nopastekehren Sie zum normalen Verhalten zurück.

Es ist auch möglich, den Modus mit einer einzigen Taste set pastetoggle=<F2>umzuschalten , indem Sie etwas zu Ihrer .vimrc hinzufügen. Weitere Details zum Umschalten des automatischen Einrückens finden Sie hier .


47
:set nopastewird den Einfügemodus deaktivieren
James Snyder

24
@JamesSnyder Ein besserer Weg ist :set paste!wahrscheinlich, dass das Einfügen in Ihrem Befehlsverlauf sehr eng ist. Sie können also einfach ':' drücken, dann mit dem Pfeil nach oben und ein '!' Hinzufügen.
Rafael Barbosa

6
Nur neugierig - was ist besser oder anders an :set paste! Danke :)
Michael Durrant

33
Das !am Ende des Befehls in vimschaltet den Befehl ein und aus. Auf diese Weise müssen Sie nicht eingeben, :set nopastesondern können durch Ihren Verlauf scrollen und denselben Befehl ( :set paste!) erneut ausführen .
바 바

3
@blockloop Du solltest es beim Einfügen aktivieren und gleich danach deaktivieren.
NieDzejkob

125

Nein, nicht direkt. Was Sie jedoch tun können, ist, den Einfügemodus für einen einzelnen Normalmodus schnell zu verlassen Ctrl-Ound von dort aus einzufügen, wodurch Sie wieder in den Einfügemodus versetzt werden.

Tastenkombination: Ctrl-O p

EDIT: Interessant. Es scheint, dass es einen Weg gibt, den mehrere andere Personen aufgelistet haben.


2
ctrl-r "funktioniert bei mir nicht (os x, vi in ​​einem Terminal). ctrl-o p hat es getan.
Bob

4
Dies ist der schnellste und einfachste Weg, sich zu erinnern.
Pocken

Was ist mit esc + p?
Sitilge

2
Definitiv schneller als esc + p + iund definitiv einfacher zu tippen alsCTRL-R + "
lucidbrot

Eigentlich verhält sich das manchmal anders als CTRL-R ". Obwohl die vimrc-Einstellungen dies ändern können, wird beim Einfügen einer neuen Zeile mit CTRL-O pdie Einrückung nicht mehr angezeigt .
Noname

30

Im Einfügemodus können Sie Folgendes verwenden Ctrl-R {register}: Register kann sein:

  • + für die Zwischenablage,
  • * für die X-Zwischenablage (zuletzt ausgewählter Text in X)
  • " für das unbenannte Register (letztes Löschen oder Ziehen in Vim),
  • oder eine Reihe anderer (siehe :h registers).

Ctrl-R {register} fügt den Text so ein, als wäre er eingegeben worden.

Ctrl-R Ctrl-O {register} fügt den Text mit dem ursprünglichen Einzug ein.

Ctrl-R Ctrl-P {register} Fügt den Text ein und rückt ihn automatisch ein.

Ctrl-Okann verwendet werden, um einen beliebigen normalen Modusbefehl auszuführen, bevor zum Einfügemodus zurückgekehrt wird,
Ctrl-O "+pkann also beispielsweise auch verwendet werden.

Weitere Informationen finden Sie in der Dokumentation mit :h i_ctrl-r


4
Diese Antwort scheint die umfassendste zu sein. Es ist sehr klar und meiner Meinung nach am hilfreichsten. Es beantwortet die Frage des OP und noch einige, kurz und bündig.
Devvyn

26

Sie können dies verwenden, um aus der Zwischenablage einzufügen mit Ctrlv:

set pastetoggle=<F10>
inoremap <C-v> <F10><C-r>+<F10>

Und dies, um die visuelle Auswahl in die Zwischenablage zu ziehen Ctrlc:

vnoremap <C-c> "+y

Wenn Sie im normalen Modus standardmäßig auch die Zwischenablage für das klassische Vim-Ziehen / Einfügen ( y/ p) verwenden möchten , finden Sie hier eine Konfigurationsoption, die dies ausführt :

set clipboard=unnamedplus

Mit diesen Konfigurationen können Sie zB zuerst im normalen Modus ziehen und dann mit einfügen Ctrlv im Einfügemodus einfügen. Sie können auch Text aus verschiedenen vim-Instanzen und verschiedenen Anwendungen einfügen.

Eine weitere Option ist:

set clipboard=unnamed

Dann können Sie einfach etwas auswählen, indem Sie mit der Maus in Ihre X-Umgebung ziehen und es anschließend in vim einfügen. Aber (aus irgendeinem Grund) werden Sie yin Vim und nicht in der Lage sein, etwas ( ) zu ziehenshiftinsert danach irgendwo anders zu ziehen, was wahrscheinlich ziemlich einschränkend ist.

Vim-Dokumente dazu: http://vim.wikia.com/wiki/Accessing_the_system_clipboard

Zum Einfügen aus benutzerdefinierten Registern können Sie den anderen Antworten folgen :). Bei dieser Antwort geht es hauptsächlich um die Integration von Vim in die Zwischenablage Ihres Systems.


Beachten Sie, dass Sie für set clipboard=unnamedplusund set clipboard=unnamedzum Arbeiten gvim oder vimx ( vim-X11) verwenden müssen: Diese werden mit kompiliert +xterm_clipboard. Sie können dies optional in Ihren .bashrcAlias ​​einfügen vimmit vimx:

if [ -e /usr/bin/vimx ]; then
    alias vim='/usr/bin/vimx'; # vim with +xterm_clipboard
fi

Sie können herausfinden, ob Ihr vim die +xterm_clipboardin den von bereitgestellten Informationen hat oder nicht vim --version.


7
Genau das habe ich gesucht. Dies ist auch hier die einzig vernünftige Antwort. So erwartet man, dass die Dinge funktionieren. Weiß jemand, warum das Standardverhalten von :set pasteund das Byzantinische <leader><leader> * yauch nur aus der Ferne wünschenswert ist? Um nicht zu engagiert zu klingen, bin ich wirklich neugierig, welche Vim-Philosophie dies widerspiegelt oder ob es nur ein historisches Unglück ist.
Aischylos

Ihre Antwort erlaubte mir, Shift + Insert in Gvim auch mit zu verwenden inoremap <S-Insert> <F12><C-r>+<F12> (ich benutze F12 als Pastetoggle). Vielen Dank.
Sromero

20

Wenn Sie Vim so einstellen, dass es die Systemzwischenablage ( :set clipboard=unnamed) verwendet, kann jeder Text, den Sie in Vim kopieren, mit eingefügt werdenShift +Insert . Shift+ Insertist einfach eine betriebssystemweite Einfügetastenkombination ( Ctrl+ Insertist die entsprechende 'Kopie').


1
Wusste

Funktioniert das umgekehrt? Wird pder Text in die Zwischenablage eingefügt?
Zaz

Bevor Shift + Insertwir den Text einfügen können, müssen wir uns im Einfügemodus befinden.
JDHAO

18

Sie können auch die mittlere Maustaste verwenden, um im Einfügemodus einzufügen (nur Linux).


106
Von was für einer Maus sprichst du?
Jim Mitchener

19
Von welchen Nicht-Linux-Betriebssystemen sprechen Sie?
Bruno Bronosky

-1: Diese Antwort hängt stark von den Hardware- und Terminaleinstellungen ab. Letztendlich senden die Maustasten eine voreingestellte Zeichenfolge an das Terminal, und das Terminal analysiert diese Zeichenfolge, um einen bestimmten Befehl auszuführen. Das Problem ist, dass dies abhängig von den Terminaleinstellungen stark variieren kann. Um diese Antwort zu verbessern, geben Sie uns bitte mindestens die Version des Terminals, das Betriebssystem sowie die Version und das Modell der Maus an, die Sie verwenden.
Melvynkim

Das Einfügen der mittleren Maustaste ist in allen Linux-Anwendungen weit verbreitet, nicht beschränkt auf Terminal- oder Betriebssystemversionen.
lcltj

Funktioniert nicht in Arch Linux + urxvt. Es wird nur eine neue Zeile hinzugefügt.
Zygimantus

5

Sie können den -- INSERT (past) --Modus aufrufen über:

  • Tastaturkombination: y p

oder

  • :set pasteund Aufrufen des Einfügemodus ( :set nopastezum Deaktivieren)

-- INSERT (past) --Verwenden Sie im Modus einfach die Einfügefunktion Ihres Systems (z. B. CtrlShiftvunter Linux,Cmdv Mac OS).

Diese Strategie ist sehr nützlich, wenn Sie vim über ssh verwenden.


4

Ja. In Windows Ctrl+V und Linux werden beide Maustasten fast gleichzeitig gedrückt.

Unter Windows denke ich, dass diese Zeile in meinem _vimrc es wahrscheinlich tut:

source $VIMRUNTIME/mswin.vim

Unter Linux kann ich mich nicht erinnern, wie ich es gemacht habe. Es sieht so aus, als hätte ich wahrscheinlich eine Zeile aus der Standard-VIMRC-Datei gelöscht.


Kann ich mehr als einmal upvoten? Ich möchte nur einfügen, wenn ich aus einem anderen Fenster komme - also bin ich immer auf der Maus. Brillant!
Dave

Unter Linux fügen Sie mit der mittleren Maustaste ein. Wenn Sie eine Maus mit zwei Tasten haben und sowohl die linke als auch die rechte Taste drücken, benötigt sie "Emulate3Buttons" oder ähnliches, um auf diese Weise zu funktionieren.
Cougar

0

Einfügen im Einfügemodus

In diesem Fall erscheint eine benutzerdefinierte Karte angemessen. Dies ist, was ich verwende, um zerrissene Elemente im Einfügemodus einzufügen:

inoremap <Leader>p <ESC>pa

Mein LeaderSchlüssel hier ist \; Dies bedeutet, dass \pbeim Einfügen im Einfügemodus die zuvor gezogenen Elemente / Zeilen eingefügt werden.


0

Fügen Sie einfach eine Karte hinzu:

" ~/.vimrc
inoremap <c-p> <c-r>*

Starten Sie vim neu und wenn Sie Crtl+pim Einfügemodus drücken , wird kopierter Text eingefügt

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.