Was macht Shift + Enter in einem Terminal und kann ich es in Vim deaktivieren?

3

Jeder, der sich ab und zu im Einfügemodus in Vim befindet, würde gerne mitschreiben, wenn ich plötzlich aus dem Einfügemodus geworfen und meine letzte Bearbeitung rückgängig gemacht würde, nachdem eine bestimmte Tastenkombination gedrückt wurde.

Heute wurde mir klar, dass die mysteriöse Kombination Shift+ war Enter. Tatsächlich wird das Drücken von Shift+ Enterrückgängig gemacht, unabhängig davon, ob der Einfügemodus aktiviert ist.

Ich habe dann versucht, Ctrl+ VShift+ Enterzu tun, um zu sehen, was der Literalwert von Shift+ ist Enter, und es wurde gedruckt:

^[[13;2u

Und jetzt hat es Sinn gemacht - ^[ist Flucht, und das uam Ende wird rückgängig gemacht. Die anderen Zeichen tun nichts, wenn sie in dieser Reihenfolge eingegeben werden.

Es scheint sich um einen Kontrollcode zu handeln, aber ich kann anscheinend nicht das Richtige finden, nach dem ich suchen muss, um zu wissen, was dies bedeutet.

Weiß jemand, was dieser Steuercode bedeutet und ob es möglich ist, ihn in Vim zu deaktivieren? Ich gehe davon aus, dass mein Terminal etwas damit zu tun haben könnte - ich verwende Cygwins Stock-Terminal, um ssh in eine Linux-Box einzuspielen und ssh darüber auszuführen.

Davidscolgan
quelle

Antworten:

4

Ohne auf die Feinheiten von Terminalfunktionen und Escape-Codes einzugehen, werde ich bestätigen, was Sie bereits entdeckt haben: Das Terminal versucht, eine Möglichkeit zur Unterscheidung zwischen einer geänderten und einer nicht geänderten Eingabetaste bereitzustellen.

Edit: Korrektur,es scheintdasswenn Vim den Mintty Terminal in einem „rohen“ Modus bringt es siehtShift+Enterals NullByte und zeigt es als^@wenn man es mit vorausControl+v, aber ansonsten behandelt es als eine neue Zeile sowieso.

Es gibt mehrere Möglichkeiten, um dieses Problem zu lösen. Eine ist die Verwendung von Cygwins Mintty, die mit Shift+ nichts Einzigartiges sendet Enter. Es hat auch andere Vorteile gegenüber dem Lagerterminal.

Eine "schnelle und schmutzige" Lösung besteht jedoch darin, Ihrer ~/.vimrcRemote-Maschine Folgendes hinzuzufügen :

:imap <esc>[13;2u <CR>

Dies hat den Nachteil, dass der Einfügemodus nach jedem Drücken von Escape erst wieder verlassen wird, nachdem Sie mit der Verwendung von Bewegungsbefehlen begonnen haben oder das Zeitlimit für die Karte abgelaufen ist. Siehe " :help 'timeout'" und die folgenden zugehörigen Einträge.

Die andere Lösung ist möglicherweise nicht durchführbar (und löst möglicherweise das Problem auch nicht). Sie muss jedoch sicherstellen, dass Ihre TERM-Variable auf Ihrer Cygwin-Shell ordnungsgemäß festgelegt ist, bevor Sie ssh ausführen, und auf der Remote-Shell, nachdem Sie ssh ausführen, und dass sie übereinstimmen oder sie sind ausreichend ähnlich. (Sie sollten niemals eine bedingungslose TERM=<anything>Einstellung in Ihren Shell-Konfigurationsdateien haben.)

Heptit
quelle