Warum funktioniert Shift Insert nur im Insert-Modus?

13

Ich habe gerade versucht, einige Inhalte (in Git Bash auf dem CentOS-Server) mit vim in eine Datei einzufügen.
Ich habe gerade die Datei geöffnet und versucht, shift+ zu verwenden, insertund habe festgestellt, dass die erste Hälfte (ungefähr) abgeschnitten wird, aber wenn ich vim auf Einfügemodus setze und shift+ insertdrücke, wird alles perfekt eingefügt.
Haben Sie sich nur gefragt, warum das so ist?

Vielen Dank

treyBake
quelle
Hey, ich habe auch zwei Daumen !!! : D
RonJohn

Antworten:

24

Sowohl Shift+ Insertals auch " Einfügen " in ein Terminal verhalten sich ähnlich - sie emulieren Tastendrücke.

Dies ist eine wichtige Unterscheidung, die für Terminals häufig nicht möglich ist - tippen Sie oder fügen Sie ein? Hinweis : Einige Terminals unterstützen " Bracketed Paste " -Modi. Nach @ Joshs Kommentar bin ich sogar auf ein VIM-Plugin gestoßen, das in xterm- Klammern eingefügt ist das Sie vielleicht interessiert.

Ihre eingefügten Daten gehen bis zum ersten Zeichen verloren, das in den Einfügemodus wechselt. Möglicherweise stellen Sie auch fest, dass sich Ihr Cursor bewegt hat und dass sich andere Teile der Datei geändert haben (z. B. Groß- / Kleinschreibung geändert / gelöscht / usw.) ...

Wenn Sie zusammenfassend Text einfügen, den Sie in die Datei einfügen möchten, rufen Sie zuerst den Einfügemodus auf.


Kopieren Sie den folgenden Text und fügen Sie ihn in ein Terminal ein, auf dem Vim ausgeführt wird (nicht im Einfügemodus):

hello how are you

Das Ergebnis entspricht dem Eingeben der gleichen Buchstaben auf Ihrer Tastatur:

Ergebnis des Einfügens in Vim

In diesem Fall bleiben Sie im Einfügemodus ...

Verlassen Sie nun den Einfügemodus - Esc- und fügen Sie Folgendes ein

/are
n

Dies führt eine Suche nach "are" durch:

Ergebnis des Einfügens in Vim

Fügen Sie nun Folgendes ein:

:0
dG

Oh nein ... alles ist weg!

alle weg


Wenn Sie das Einrücken aktiviert haben, wird beim Einfügen eines Codeblocks in vim (im Einfügemodus) zu viel eingerückt - es wird automatisch eingerückt, und der eingefügte Code wird eingerückt.

def my_print(message):
    print(message)
    print('done...')

Code einfügen

Um dies zu beheben, verwenden Sie die Befehle :set pasteund:set nopaste

Code einfügen (Einfügemodus)

Attie
quelle
4
"Dies ist eine wichtige Unterscheidung, die Terminals nicht treffen können - tippen Sie oder fügen Sie ein?" - Dies ist nicht ganz richtig. Einige Terminals und Anwendungen unterstützen das Einfügen in Klammern, wenn vor und nach dem eingefügten Text eine spezielle Sequenz gesendet wird.
Ash
@Josh: interessant, danke ... dein Kommentar hat mich sogar zu einem Vim-Plugin geführt
Attie
Bin ich der einzige, der sich Sorgen macht set nopaste? Ich würde erwarten unset paste.
Eric Duminil
@ThisGuyHasTwoThumbs als Alternative, zumindest wenn Sie Vim verwenden, möchten Sie möglicherweise das "+Register für die Interaktion mit der Systemzwischenablage verwenden, da es sich normalerweise vernünftiger verhält. Der Nachteil ist, dass einige Systeme oder Builds von Vim möglicherweise "*stattdessen verwenden oder einfach keine System-Zwischenablage-Unterstützung haben, aber meiner Erfahrung "+nach sehr zuverlässig waren.
8bittree