Ich bemühe mich, Vim zu lernen.
Wenn ich Code aus der Zwischenablage in mein Dokument einfüge, 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, weil einige andere Einstellungen widersprüchlich sind oder so (die in meiner .vimrc ziemlich offensichtlich aussehen, aber keine Rolle zu spielen scheinen, wenn ich sie herausnehme).
Wie deaktiviere ich das automatische Einrücken, wenn ich Code einfüge, aber beim Schreiben von Code immer noch das automatische Einrücken von vim? Hier ist meine .vimrc
Datei:
set expandtab
set tabstop=2
set shiftwidth=2
set autoindent
set smartindent
set bg=dark
set nowrap
cat > mynewfile.txt
die Eingabetaste drücken , Ihren Text einfügen, erneut die Eingabetaste drücken und dann Strg + D drücken , um das Speichern zu vermeiden . Die Datei wird jetzt erstellt und Sie können sie mit bearbeitenvim mynewfile.txt
.Antworten:
Update: Bessere Antwort hier: https://stackoverflow.com/a/38258720/62202
Um die automatische Einrückung beim Einfügen von Code zu deaktivieren, gibt es einen speziellen Einfügemodus.
Art
Fügen Sie dann Ihren Code ein. Beachten Sie, dass der Text in der QuickInfo jetzt lautet
-- INSERT (paste) --
.Nachdem Sie Ihren Code eingefügt haben, deaktivieren Sie den Einfügemodus, damit das automatische Einrücken beim Eingeben wieder korrekt funktioniert.
Das fand ich jedoch immer umständlich. Deshalb
<F3>
ordne ich es so zu, dass es beim Bearbeiten des Textes zwischen dem Einfüge- und dem Nopaste-Modus wechseln kann ! Ich füge das hinzu.vimrc
quelle
:set noai
gefolgt von:set ai
. Der Vorschlag von:r! cat
ist kürzer.set paste
ist definitiv einfacher. Es ist viel semantischer alsnoai
oder sogarnoautoindent
, was wichtiger ist, wenn Sie "noai" und "paste" eingeben. Dies dauert ungefähr genauso wenig, wenn Sie als Touch-Typist kompetent genug sind.:set noai
funktioniert nicht immer, abhängig davon, wie die anderen einrückungsbezogenen Einstellungen gemäß OP konfiguriert sind.:set paste
scheint eine Abkürzung für mehrere Einstellungen gleichzeitig zu sein.set copyindent
kümmert sich aber nahtlos darum.:set paste
Deaktiviert auch andere Funktionen wie die Vervollständigung von Klammern, die auch beim Einfügen von Code nicht erwünscht sind.Um unerwünschte Effekte beim Einfügen zu vermeiden, muss eine Option festgelegt werden:
Ein nützlicher Befehl in Ihrer .vimrc-Datei ist
set pastetoggle=<F10>
eine andere Schaltfläche, mit der Sie einfach zwischen Einfügen und Nicht-Einfügen wechseln können.quelle
nmap <silent> <leader>p :set paste<CR>"*p:set nopaste<CR>
Normalerweise benutze ich den Inhalt und
:r! cat
füge ihn dann ein .( shift + insert )
CTRL+D
Keine Notwendigkeit, die direkte Verwendung zu aktivieren und zu deaktivieren.
quelle
:r! cat
funktioniert.:r
fügt den Inhalt einer Datei in das aktuelle Dokument ein.!cat
Wenn Sie cat ausführen, die im Wesentlichen stdin (* nix shells) öffnet,(shift + insert)
oder bei einigen Terminals, wird der Inhalt der Zwischenablage mit der rechten Maustaste in das TerminalCTRL+D
eingefügt, sodass die:r !cat
Sitzung beendet wird.paste
die ausschließlich für diesen Zweck gemacht wurde? @jvriesem Dies ist keine "direkte" Option, wenn das, was ich von Ihrem Verständnis dieses Wortes annehme, richtig ist.:r! cat
dannCTRL+SHIFT+V
im Terminal einfügen (dannCTRL+D
).Wenn Sie lokal arbeiten, können Sie aus der Systemzwischenablage Folgendes einfügen:
"+p
Dies ist ein richtiger vim-Befehl, sodass Sie sich nicht darum kümmern müssen, zuerst in einen Einfügemodus zu wechseln oder die automatische Einrückung auszuschalten.
Wenn Sie remote arbeiten (z. B. Konsole über SSH), funktioniert dies natürlich nicht. Sie sollten in den
:set noai
Einfügemodus wechseln, in die Konsole einfügen, den Einfügemodus verlassen und die:set ai
Route wie an anderer Stelle beschrieben ausführen .quelle
:set paste
und:set nopaste
stattdessen, weil es trotz der längeren Zeit leichter zu merken ist und ich es nicht jedes Mal nachschlagen muss!:set paste
ist dies nicht implementiert und:set noai
sollte stattdessen verwendet werden.<leader>p
.. sehr nützlich!Während das Einstellen des Einfügemodus mit
paste/nopaste/pastetoggle
vollkommen in Ordnung ist, müssen Sie den Einfügemodus vor dem Einfügen manuell aktivieren und den Einfügemodus nach dem Einfügen deaktivieren. Als die faule Person, die ich bin, ist unten die beste Lösung, die ich bisher gefunden habe, die den Einfügemodus beim Einfügen automatisch umschaltet.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 den Kommentaren hinzu.
Tmux Wenn Sie tmux verwenden, müssen die Deklarationen doppelt maskiert werden. Der Code dafür ist auch in Coderwall
quelle
t_SI
undt_EI
Variablen ermöglichen Paste Bracketing und deaktivieren es. Wenn die Klammer einfügen aktiviert ist, wird eingefügtem Text ein Präfix vorangestelltesc[200~
und gefolgt vonesc[201~
.Mac-Benutzer können die automatische Formatierung vermeiden, indem sie direkt aus dem Pasteboard lesen mit:
quelle
:.!pbpaste
, sollte dies funktionieren, indem Sie die aktuelle Zeile durch die Ausgabe des Einfügepuffers ersetzen. Im Allgemeinen können Sie mit vim Daten aus Ihrer aktuellen Datei an ein anderes Programm weiterleiten und den Text durch die Ausgabe des Befehls ersetzen. So:1,3!pbpaste
ersetzt die ersten drei Zeilen Ihrer Datei mit dem Paste - Puffer. Ich:.!ppjson
nehme eine sehr lange (unformatierte JSON-Zeichenfolge) und formatiere sie und ersetze die lange Zeichenfolge durch die formatierte Entsprechung. ppjson ist nur ein Bash-Skript, das ausgeführt wirdpython -m json.tool
.Hier ist ein Beitrag von jemandem, der herausgefunden hat, wie das Einfügeereignis neu zugeordnet werden kann, um den Einfügemodus automatisch ein- und wieder auszuschalten. Funktioniert für mich in tmux / iTerm unter MacOSX.
quelle
Fügen Sie dies zu Ihrem hinzu
~/.vimrc
und Sie müssen nur vor und nach dem Einfügen F2 drücken :quelle
Ich habe es gerade gesagt
set clipboard=unnamed
meine .vimrc eingegeben. Dadurch wird der Standardpuffer in die Zwischenablage von X eingefügt.Wenn ich also ein Stück Text in einem Terminal markiere, kann ich einfach drücken,
p
um es in vim einzufügen. Ebenso kann ich Dinge in vim ziehen (z. B.YY
um die aktuelle Zeile in den Puffer zu ziehen) und mit der mittleren Maustaste in ein beliebiges Fenster klicken, um sie einzufügen.Keine Ahnung. Ich finde es super praktisch.
quelle
Wenn Sie in einem Terminal arbeiten, verarbeitet das vim-Klammer-Einfügen- Vim-Plugin automatisch Pasten, ohne dass vor oder nach dem Einfügen Tastenanschläge erforderlich sind.
Es erkennt den in Klammern gesetzten 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ätzlichen 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.
quelle
Steck das in dein ~ / .vimrc und sei glücklich:
Bearbeiten:
:r !cat
Nach Reflexion ist dies ein weitaus besserer Ansatz, da er kurz und semantisch ist und kein benutzerdefiniertes vimrc erfordert. Verwenden Sie das stattdessen!quelle
Obwohl
:pastetoggle
oder:paste
und:nopaste
sollte gut funktionieren (falls implementiert - sie sind nicht immer, wie wir aus der Diskussion sehen können), empfehle ich dringend, das Einfügen mit dem direkten Ansatz"+p
oder"*p
und das Lesen mit"+r
oder"*r
:Vim hat Zugriff auf zehn Registertypen (
:help registers
) und der Fragesteller interessiert sich fürquotestar
undquoteplus
von Abschnitt:help x11-selection
verdeutlicht weiter den Unterschied von*
und+
:quelle
Dies funktioniert bei mir (Fall für + Register, was ich als Austauschpuffer zwischen APS verwende):
quelle
Wenn Sie auf einem Mac arbeiten, scheint Macvim gut damit umzugehen, ohne die Paste umschalten zu müssen.
brauen installieren macvim --override-system-vim
quelle
.vimrc
Datei aufnehmen?Native Paste / Paste in Klammern ist der beste und einfachste Weg seit
vim 8
(veröffentlicht im Jahr 2016). Es funktioniert sogar über ssh! (Das Einfügen in Klammern funktioniert unter Linux und Mac, jedoch nicht unter Windows Git Bash.)Stellen Sie sicher, dass Sie vim 8+ haben (Sie benötigen die Optionen
+clipboard
oder nicht+xterm_clipboard
).vim --version | head -1
Verwenden Sie einfach den nativen Einfügebefehl des Betriebssystems (z. B.
ctrl+shift+V
odercmd+V
) im normalen Modus. Drücken Sie nichti
für den Einfügemodus.Prüfung
Kopieren (
ctrl+shift+C
odercmd+C
) der Ausgabe davon (2 Zeilen mit einem Tabulatoreinzug) in die Systemzwischenablage:echo -e '\ta\n\tb'
Starten Sie ein sauberes vim 8+ mit autoindent:
vim -u NONE --noplugin -c 'set autoindent'
Einfügen aus der Systemzwischenablage (
ctrl+shift+V
odercmd+V
) im normalen Modus. Drücken Sie nichti
für den Einfügemodus. Dasa
undb
sollte mit einem einzelnen Tabulatoreinzug ausgerichtet werden. Sie können dies sogar tun, während Sie an einen Remote-Computer senden (der Remote-Computer benötigt vim 8+).Versuchen Sie nun den alten Weg, bei dem die zweite Zeile automatisch mit einer zusätzlichen Registerkarte eingerückt wird: Drücken Sie für den Einfügemodus
i
. Dann mitctrl+shift+V
oder einfügencmd+V
. Diea
undb
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 .
brew install vim
quelle
Featured snippet
für meine Suche "Inhalt ohne Tabs einfügen vim" vor, möglicherweise weil ich das Schlüsselwort "tab" verwendet habe, nur in dieser Antwort erwähnt :)Bitte lesen Sie diesen Artikel: Aktivieren Sie das automatische Einrücken für das Einfügen von Code
quelle
Der schnellste Weg, den ich kenne, um schnell in den Paste-Insert-Modus für eine One-Shot-Paste zu wechseln, ist die unbeeinträchtigte Funktion von tpope , die Funktionen
yo
undyO
vermutlich Mnemonik für „you open“ bietet . Sie sind nur in seinem Vimdoc dokumentiert als:quelle
Eine andere Möglichkeit zum Einfügen besteht darin
<CR>
, den Inhalt des Registers (hier das globale Register) zu löschen und zu löschen. Siehe::h i_ctrl-r
undh 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}
Verwenden Sie
<CR><CO>*
in den meisten Unix-Systemen , um Inhalte ohne automatischen Einzug in vim einzufügen .Hinweis: Dies funktioniert nur, wenn vim mit kompiliert ist
clipboard
.quelle
Von vim:
]p
Von außen:
"*]p
oder"+]p
quelle
Eine andere Antwort, die ich bis jetzt nicht gesehen habe:
quelle
Leider habe ich festgestellt, dass das erwähnte vim-Plugin nicht mit iTerm2 3.0.15 funktioniert (um fair zu sein, ich weiß nicht, ob dies bei älteren Versionen kaputt gegangen ist) - aber ich habe stattdessen diesen Hack gefunden.
Ordnen Sie Befehl-p zu, um das Einfügen und Verwenden der iTerm2-VIM-Tasten durchzuführen. Dies funktioniert natürlich nur für iTerm2.
Wie es funktioniert. Ich benutze "jk", um in den Escape-Modus zu wechseln, sodass Sie auch Folgendes benötigen:
: inoremap jk
in Ihrer .vimrc.
Dann wird einfach P aufgerufen, um in den Einfügemodus zu wechseln, "+ p, um aus der Zwischenablage einzufügen, und dann P, um den Einfügemodus zu deaktivieren. Hth.
quelle