Ich bemühe mich, Vim zu lernen.
Wenn ich Code aus der Zwischenablage in mein Dokument einfügen, werden am Anfang jeder neuen Zeile zusätzliche Leerzeichen angezeigt:
line
line
line
Ich weiß, dass Sie den automatischen Einzug deaktivieren können, aber ich kann ihn nicht zum Laufen bringen, da andere Einstellungen miteinander in Konflikt stehen oder etwas (was in meinem .vimrc ziemlich offensichtlich erscheint, aber scheinbar keine Rolle spielt, wenn ich sie herausnehme).
Wie schalte ich die automatische Einrückung aus, wenn ich Code einfüge, aber beim Schreiben von Code immer noch eine automatische Einrückung habe? Hier ist meine .vimrc
-Datei:
set expandtab
set tabstop=2
set shiftwidth=2
set autoindent
set smartindent
set bg=dark
set nowrap
Update: Bessere Antwort hier: https://stackoverflow.com/a/38258720/62202
Um die automatische Einfügung beim Einfügen von Code zu deaktivieren, gibt es einen speziellen Einfügemodus.
Art
:set paste
Dann fügen Sie Ihren Code ein. Beachten Sie, dass der Text in der QuickInfo jetzt -- INSERT (paste) --
lautet.
Nachdem Sie Ihren Code eingefügt haben, deaktivieren Sie den Einfügemodus, damit das automatische Einrücken bei der Eingabe wieder korrekt funktioniert.
:set nopaste
Das fand ich aber immer umständlich. Deshalb ordne ich <F3>
so zu, dass es beim Bearbeiten des Texts zwischen dem Einfüge- und dem Nopaste-Modus umschalten kann! Ich füge dies zu .vimrc
hinzu
set pastetoggle=<F3>
Um unerwünschte Effekte beim Einfügen zu vermeiden, muss eine Option festgelegt werden:
set paste
Ein nützlicher Befehl in Ihrem .vimrc ist set pastetoggle=<F10>
oder eine andere Schaltfläche, um leicht zwischen Einfügen und Nopaste zu wechseln.
Normalerweise verwende ich :r! cat
und füge dann ( shift + insert )
den Inhalt und CTRL+D
ein.
Keine Notwendigkeit, direkte Verwendung zu aktivieren und zu deaktivieren.
Wenn Sie lokal arbeiten, können Sie mit der Tastenkombination aus der Systemzwischenablage einfügen:
"+p
Dies ist ein richtiger vim-Befehl, so dass Sie sich keine Gedanken darüber machen müssen, ob Sie einen Einfügemodus starten oder Autoindent zuerst ausschalten.
Wenn Sie remote arbeiten (z. B. Konsole über SSH), funktioniert dies nicht und Sie sollten den :set noai
-, Einfügemodus ausführen, in die Konsole einfügen, den Einfügemodus und die :set ai
-Route verlassen, wie an anderer Stelle beschrieben.
Mac-Benutzer können die automatische Formatierung vermeiden, indem sie direkt vom Pasteboard lesen:
:r !pbpaste
Wenn der Einfügemodus mit paste/nopaste/pastetoggle
perfekt eingestellt ist, müssen Sie den Einfügemodus vor dem Einfügen manuell aktivieren und den Einfügemodus nach dem Einfügen deaktivieren. Da ich die faule Person bin, die ich bin, ist unten die beste Lösung, die ich bisher gefunden habe, die beim Einfügen automatisch den Einfügemodus umschaltet.
Hier ist ein kleiner Trick, der den eingeklammerten Einfügemodus von terminal zu .__ verwendet. Der Einfügemodus von Vim wird beim Einfügen automatisch festgelegt bzw. deaktiviert. Setze folgendes in deiner .vimrc:
let &t_SI .= "\<Esc>[?2004h" let &t_EI .= "\<Esc>[?2004l" inoremap <special> <expr> <Esc>[200~ XTermPasteBegin() function! XTermPasteBegin() set pastetoggle=<Esc>[201~ set paste return "" endfunction
Jetzt können Sie einfügen, ohne den Einfügemodus explizit ein- oder auszuschalten. Dies ist automatisch für Sie behandelt.
Quelle: Coderwall
Hinweis: Diese Lösung funktioniert nicht in WSL (Windows 10 Subsystem für Linux). Wenn jemand eine Lösung für WSL hat, aktualisieren Sie diese Antwort oder fügen Sie sie in die Kommentare ein.
Tmux Wenn Sie tmux verwenden, müssen die Deklarationen doppelt geschützt werden. Der Code dafür ist auch in Coderwall
Hier ist ein Beitrag von jemandem, der herausgefunden hat, wie er das Einfügeereignis neu zuordnen kann, um den Einfügemodus automatisch zu aktivieren und wieder zu deaktivieren. Funktioniert für mich in tmux/iTerm unter MacOSX.
Fügen Sie dies Ihrem ~/.vimrc
hinzu und Sie müssen nur F2 vor und nach dem Einfügen drücken:
set pastetoggle=<F2>
Wenn Sie in einem Terminal arbeiten, verarbeitet das vim-bracketed-paste vim-Plugin Pasten automatisch, ohne dass vor oder nach dem Einfügen ein Tastendruck erforderlich ist.
Es erkennt den geklammerten Einfügemodus , bei dem es sich um eine Escape-Sequenz handelt, die von "modernen" x-term-kompatiblen Terminals wie iTerm2, gnome-terminal und anderen Terminals mit libvte gesendet wird. Als zusätzlicher Bonus funktioniert es auch für TMux-Sitzungen. Ich verwende es erfolgreich mit iTerm2 auf einem Mac, der eine Verbindung zu einem Linux-Server herstellt und tmux verwendet.
Ich habe einfach set clipboard=unnamed
in meine .vimrc eingefügt. Dadurch wird der standardmäßige Einfügepuffer in die Zwischenablage von X übernommen.
Wenn ich also ein Stück Text in einem Terminal markiere, kann ich einfach p
drücken, um ihn in vim einzufügen. In ähnlicher Weise kann ich Dinge in vim ziehen (z. B. YY
, um die aktuelle Zeile in den Puffer zu ziehen) und dann mit der mittleren Maustaste in ein Fenster klicken, um sie einzufügen.
Keine Ahnung. Ich finde es super bequem.
Stecke dies in deine ~/.vimrc und sei glücklich:
" enables :Paste to just do what you want
command Paste execute 'set noai | insert | set ai'
Edit: Beim Nachdenken ist :r !cat
ein weitaus besserer Ansatz, da er kurz und semantisch ist und kein benutzerdefiniertes vimrc erfordert. Verwenden Sie das stattdessen!
Obwohl :pastetoggle
oder :paste
und :nopaste
gut funktionieren sollten (falls implementiert - sie sind nicht immer so, wie wir in der Diskussion sehen können), empfehle ich das Einfügen mit der direkten Methode "+p
oder "*p
und Lesen mit "+r
oder "*r
:
Vim hat Zugriff auf zehn Arten von Registern (:help registers
) und der Fragesteller interessiert sich für quotestar
und quoteplus
aus dem Abschnitt
- Auswahl- und Ablageregister
"*
,"+
und "~Verwenden Sie diese Register zum Speichern und Abrufen des ausgewählten Textes für die GUI . Siehe
quotestar
undquoteplus
. Wenn die Zwischenablage nicht verfügbar ist oder nicht funktioniert, wird stattdessen das unbenannte Register verwendet. Für Unix-Systeme die Zwischenablage ist nur verfügbar, wenn die Funktion + xterm_clipboard vorhanden ist. {nicht in Vi}Beachten Sie, dass bei X11-Systemen nur zwischen "*" und "+" unterschieden wird.
:help x11-selection
verdeutlicht den Unterschied zwischen *
und +
:
quoteplus quote+
Es gibt drei dokumentierte X-Auswahlen: PRIMARY (von dem erwartet wird, dass Die aktuelle visuelle Auswahl darstellt - wie im visuellen Modus von Vim), SECONDARY (was nicht genau definiert ist) und CLIPBOARD (wird voraussichtlich für Ausschneiden, Kopieren und Einfügen verwendet).
Von diesen drei verwendet Vim beim Lesen und Schreiben des "* register " PRIMARY (wenn also die X11-Auswahlmöglichkeiten verfügbar sind, setzt Vim einen Standardwert für "Zwischenablage" von "autoselect") und CLIPBOARD beim Lesen und Schreiben der "+ registrieren. Vim greift nicht auf die SECONDARY-Auswahl zu.
Beispiele: (unter Annahme der Standardoptionswerte)
Wählen Sie im visuellen Modus in Vim eine URL aus. Gehen Sie zu Ihrem Browser und klicken Sie auf mittlere Maustaste im URL-Textfeld. Der ausgewählte Text lautet eingefügt (hoffentlich!). Hinweis: In Firefox können Sie das .__ einstellen. middlemouse.contentLoadURL-Einstellung auf true in about: config und dann auf Die ausgewählte URL wird beim Drücken der mittleren Maustaste an den meisten Stellen des Fensters verwendet.
Wählen Sie in Ihrem Browser einen Text aus, indem Sie ihn mit der Maus ziehen. Gehe zu Vim und Drücken Sie die mittlere Maustaste: Der ausgewählte Text wird eingefügt.
- Markieren Sie Text in Vim und führen Sie "+ y" aus. Gehen Sie zu Ihrem Browser und wählen Sie Text in Ein Textfeld aus, indem Sie mit der Maus ziehen. Verwenden Sie nun die rechte Maustaste und Wählen Sie im Popup-Menü "Einfügen". Der ausgewählte Text wird durch den Text aus Vim ..__ überschrieben. Beachten Sie, dass der Text im "+" - Register verfügbar bleibt, wenn Sie ein Visual Erstellen. Auswahl, die anderen Text im "* -Register" zur Verfügung stellt. Dadurch kann ausgewählten Text überschreiben.
Dies funktioniert für mich (Fall für + register, was ich als Puffer zwischen Aps-Tauschern verwende):
imap <silent> <S-Insert> <C-O>:set noai<CR><C-R>+<C-O>:set ai<CR>
Wenn Sie mit einem Mac arbeiten, scheint MacVim gut damit umzugehen, ohne die Paste umschalten zu müssen.
installieren Sie macvim --override-system-vim
Native Paste/Bracketed Paste ist der beste und einfachste Weg seit vim 8
(veröffentlicht im Jahr 2016). Es funktioniert sogar über ssh! (Eingeklammertes Einfügen funktioniert unter Linux und Mac, aber nicht unter Windows Git Bash.)
Stellen Sie sicher, dass Sie vim 8+ haben (Sie benötigen nicht die Optionen +clipboard
oder +xterm_clipboard
).
vim --version | head -1
Verwenden Sie einfach den systemeigenen Befehl zum Einfügen (z. B. ctrl+shift+V
oder cmd+V
) im normalen Modus. Drücken Sie für den Einfügemodus nicht i
.
Test
Kopieren Sie (ctrl+shift+C
oder cmd+C
) die Ausgabe davon (2 Zeilen mit einem Tabulatoreinzug) in die System-Zwischenablage:
echo -e '\ta\n\tb'
Starte ein sauberes vim 8+ mit autoindent:
vim -u NONE --noplugin -c 'set autoindent'
Einfügen aus der System-Zwischenablage (ctrl+shift+V
oder cmd+V
) im normalen Modus. Drücken Sie für den Einfügemodus nicht i
. Die Zeichen a
und b
sollten an einem einzelnen Tabulatoreinzug ausgerichtet sein. Sie können dies sogar tun, während Sie auf eine Remote-Maschine senden (die Remote-Maschine benötigt vim 8+).
Probieren Sie nun die alte Methode aus, mit der die zweite Zeile automatisch mit einem zusätzlichen Tabulator versehen wird: Drücken Sie i
für den Einfügemodus. Fügen Sie dann mit ctrl+shift+V
oder cmd+V
ein. a
und b
sind jetzt falsch ausgerichtet.
Installieren von Vim 8
Ubuntu 18.04 - wird standardmäßig mit Vim 8 geliefert .
Ubuntu 16.04 - Installation von einem PPA .
Sudo add-apt-repository ppa:jonathonf/vim
Sudo apt update
Sudo apt install vim
brew install vim
Die schnellste Möglichkeit, schnell in den Einfüge-Modus für eine One-Shot-Paste zu wechseln, ist tpope unbeeinträchtigt , die yo
und yO
enthält, vermutlich "mnemonics for you you" ”. Sie sind nur in seinem vimdoc dokumentiert:
Es wurde kein Umschalter für "Einfügen" bereitgestellt, da der typische Anwendungsfall Das Umwickeln einer einzelnen Einlage ist so verschwenderisch: Sie wechseln zweimal, aber Sie fügen nur einmal ein (YOPO). Drücken Sie stattdessen yo oder yO, um o oder o mit .__ aufzurufen. 'Einfügen' ist bereits gesetzt. Wenn Sie den Einfügemodus verlassen, wird automatisch 'nopaste' eingestellt.
Bitte lesen Sie diesen Artikel: Automatische Einrückung für Code einfügen
Einige Leute mögen das visuelle Feedback, das in der Statuszeile durch die folgende Alternative für Ihre
vimrc
angezeigt wird:
nnoremap <F2> :set invpaste paste?<CR>
set pastetoggle=<F2>
set showmode
Von vim: ]p
Von außen: "*]p
oder "+]p
Eine andere Möglichkeit zum Einfügen besteht darin, den Inhalt des Registers (hier das globale Register) mit <CR>
Zu löschen. Siehe: :h i_ctrl-r
Und h i_CTRL-R_CTRL-O
.
Aus der vim-Hilfedokumentation:Insert the contents of a register literally and don't auto-indent. Does the same as pasting with the mouse<MiddleMouse>. Does not replace characters! The '.' register (last inserted text) is still inserted as typed.{not in Vi}
Um Inhalte ohne automatischen Einzug in vim einzufügen, verwenden Sie in den meisten Unix-Systemen <CR><CO>*
.
Hinweis: Dies funktioniert nur, wenn vim mit clipboard
kompiliert wurde.
Leider fand ich das erwähnte vim-Plugin nicht mit iTerm2 3.0.15 (um ehrlich zu sein, ich weiß nicht, ob es bei älteren Versionen kaputt gegangen ist) - aber ich fand diesen Hack stattdessen.
Ordnen Sie den Befehl p zum Einfügen und Verwenden der iTerm2-vim-Schlüssel zu. Das funktioniert natürlich nur für iTerm2.
Wie es funktioniert. Ich verwende "jk", um den Escape-Modus aufzurufen, so dass Sie auch Folgendes benötigen:
: inoremap jk
in deiner .vimrc.
Dann ruft es nur P auf, um den Einfügemodus zu aktivieren, "+ p zum Einfügen aus der Zwischenablage und dann P, um den Einfügemodus zu deaktivieren. Hth.
Eine andere Antwort, die ich bis jetzt nicht gesehen habe:
:se paste noai