Warum wird der eingefügte Code von Vim falsch eingerückt?

100

In Vim, wenn ich dieses Skript einfügen:

#!/bin/sh
VAR=1
while ((VAR <  10))
    do
        echo "VAR1 is now $VAR"
        ((VAR = VAR +2))
    done
    echo "finish"

Ich bekomme diese seltsamen Ergebnisse:

#!/bin/sh
#VAR=1
#while ((VAR <  10))
#       do
#                       echo "VAR1 is now $VAR"
#                                       ((VAR = VAR +2))
#                                               done
#                                                       echo "finish"
#                                                       

Hash-Zeichen (#) und Tabulatoren wurden angezeigt. Warum?

Elbarna
quelle
31
Dies könnte eine bessere Frage für vi.stackexchange.com sein
Eric Renouf
@EricRenouf warum? (ehrliche Frage)
Qix
3
@qix Meiner Meinung nach handelt es sich hierbei um eine Frage zur Funktionsweise von vim. Dies ist ein gängiges Tool für * nix, aber * nix ist keine Voraussetzung für die Verwendung von vim
Eric Renouf
1
@JaredBurrows Ich hoffe, es schafft es
Eric Renouf
1
Wie löst du die Paste aus? Mit der maus
Ben Voigt

Antworten:

122

Es gibt zwei Gründe:

Zum Einfügen bei vimaktiviertem automatischen Einzug müssen Sie in den Einfügemodus wechseln, indem Sie Folgendes eingeben:

:set paste

Dann können Sie in den Einfügemodus wechseln und Ihren Code einfügen. Nach dem Einfügen geben Sie Folgendes ein:

:set nopaste

um den Einfügemodus zu deaktivieren. Da dies eine häufige und häufige Aktion ist, vimbietet das Umschalten des Einfügemodus Folgendes an:

set pastetoggle=<F2>

Sie können F2zu jeder beliebigen Taste wechseln und das Einfügen jetzt ganz einfach ein- und ausschalten.


Um das automatische Einfügen von Kommentaren zu deaktivieren , können Sie die folgenden Zeilen zu Ihrer vimrc hinzufügen :

augroup auto_comment
    au!
    au FileType * setlocal formatoptions-=c formatoptions-=r formatoptions-=o
augroup END

vimBietet außerdem ein Einfügeregister, in das Sie Text aus der Systemzwischenablage einfügen können. Sie können "*poder "+pabhängig von Ihrem System verwenden. Auf einem System ohne X11 wie OSX oder Windows müssen Sie das *Register verwenden. Auf einem X11-System wie Linux können Sie beide verwenden.

Weitere Lektüre

cuonglm
quelle
2
Ich habe Vim schon immer benutzt und wusste nie davon. Danke vielmals.
Caja
Die meisten modernen grafischen Terminalemulatoren unterstützen eine Funktion, die als "Einfügemodus in Klammern" bezeichnet wird. Vim kann das Terminal auffordern, diesen Modus zu aktivieren, der wiederum eingefügten Text mit bestimmten Escape-Sequenzen umgibt. Vim kann dies erkennen und das Umschließen / Einrücken für die Dauer der Paste deaktivieren. Langer Story-Stort: ​​Das Einfügen wird "wie erwartet funktionieren". Ich bin kein VIM-Benutzer, aber eine schnelle Websuche zeigt Ihnen, wie Sie diesen Modus konfigurieren.
egmont
2
@MichaelDurrant set pastesollte niemals in deinem Vimrc sein. Viele Dinge werden deaktiviert oder zurückgesetzt, einschließlich Einfügemoduszuordnungen, Befehlszeilenzuordnungen, Abkürzungen, Textbreite, Zeilenumbruch, Autoindent, Smartindent, Softtabstop, Formatoptionen, Indentexpr und einige andere. :h pastehat die ganze Liste. Die meisten Leute verwenden einige oder alle dieser Dinge und fragen sich, warum dort Einstellungen ignoriert werden.
FDinoff
4
Ich benutze normalerweise, :r!catum wörtlich einzufügen.
Simon Richter
1
Es kann sich lohnen, die Interaktion mit zu diskutieren set mouse, die beim Einfügen mit einem Mausklick automatisch in den Einfügemodus wechselt und diesen verlässt.
Ben Voigt
36

Verwenden Sie die Vim Paste. Sie möchten nur das einfügen, was sich im Zwischenspeicher befindet "+p

Dies wählt das aus +und fügt es ein.

Wenn Sie Linux verwenden, *ist der X / Middle-Click-Puffer (der zuletzt ausgewählte Text).

Dann weiß Vim, dass es eine Paste ist.

Andernfalls geht vim davon aus, dass Sie die einzufügenden Schlüssel eingegeben haben, und führt eine automatische Einrückung (über der kopierten Einrückung) bis zum Ende des Einfügens durch.

Damit dies über SSH funktioniert, müssen Sie die Option für die Freigabe Ihrer Zwischenablage festlegen -Y

Sehen Sie man sshfür weitere Details.

exussum
quelle
4
Dies ist eigentlich die richtige Antwort imho
Kristoffer Sall-Storgaard
Es sieht so aus, als ob dies nur für das grafische vim ( gvim) funktioniert ; vim in einem Terminal-Emulator ausgeführt wird, fügt den zuletzt gelöschten Text mit "* p" ein, nicht die aktuelle Auswahl.
Wurtel
Ich benutze kein gvim, nur das Terminal vim. Was ist Ihre Mauseinstellung? Meine Mauseinstellung ist c. Nicht sicher, wie es funktioniert, wenn die Mausauswahl erlaubt ist. set mouse?
Exussum
2
überprüfen Sie auch vim --versionsehen sich , wenn sie mit Unterstützung der Zwischenablage kompiliert wurde +xterm_clipboardin der Ausgabe sein sollte
exussum
@wurtel: Vielleicht hast du die Zwischenablage mit unnamedString gesetzt.
Cuonglm
8

Die Registerkarten wurden eingefügt, weil Sie die automatische Einrückung aktiviert haben und Sie dieses Verhalten deaktivieren können, indem Sie die automatische Einrückung ( :set noai) deaktivieren, bevor Sie sie in das Terminal einfügen.

Die kommentierten Zeilen werden durch automatisches Kommentieren erzeugt und können durch Deaktivieren deaktiviert werden.

Alternativ dazu sollten Sie das gewünschte Verhalten mit den Schaltflächen erzielen :set paste, indem Sie Ihren formatierten Code einfügen und :set nopastedas normale Verhalten wiederherstellen.

casey
quelle