it-swarm.com.de

Deaktivieren des automatischen Einzugs beim Einfügen von Text in vim

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  
1021
Rimian

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>
1922
P Shved

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.

251
Jacob R

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.

123
thegeek

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.

82
thomasrutter

Mac-Benutzer können die automatische Formatierung vermeiden, indem sie direkt vom Pasteboard lesen:

:r !pbpaste
37
maniacalrobot

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

27
thdoan

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.

19
Von

Fügen Sie dies Ihrem ~/.vimrc hinzu und Sie müssen nur F2 vor und nach dem Einfügen drücken:

set pastetoggle=<F2>
12
anh_ng8

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.

9
studgeek

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.

9
Soren

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!

7
Dergachev

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

  1. Auswahl- und Ablageregister "*, "+ und "~

Verwenden Sie diese Register zum Speichern und Abrufen des ausgewählten Textes für die GUI . Siehe quotestar und quoteplus. 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.
3
codingdave

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>
3

Wenn Sie mit einem Mac arbeiten, scheint MacVim gut damit umzugehen, ohne die Paste umschalten zu müssen.

installieren Sie macvim --override-system-vim

2
Marcus Ericsson

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.)

  1. Stellen Sie sicher, dass Sie vim 8+ haben (Sie benötigen nicht die Optionen +clipboard oder +xterm_clipboard).

    vim --version | head -1

  2. 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

  1. 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'

  2. Starte ein sauberes vim 8+ mit autoindent:

    vim -u NONE --noplugin -c 'set autoindent'

  3. 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+).

  4. 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

2
wisbucky

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.

1
Micah Elliott

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
1
d.danailov

Von vim: ]p

Von außen: "*]p oder "+]p

0
Bruno

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.

0
TheChetan

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.

 enter image description here

0
Neil McGill

Eine andere Antwort, die ich bis jetzt nicht gesehen habe:

:se paste noai
0
sjas