Was verursacht das Verhalten?
Wenn Sie den Pfeil nach links drücken, sendet Ihr Terminal die folgende Escape-Sequenz:
ESC O D
Dies kann auch notiert werden , da ^[OD
, wo ^[
ist Notation für Ctrl-[
, das ist eine andere Art von notating oder Eingabe der ESC - Zeichen. (Probieren Sie es im Einfügemodus!)
Vim erkennt dies nicht als Escape-Sequenz und behandelt diese Tastenanschläge daher so, als hätten Sie sie selbst abgetippt:
- Esc: Einfügemodus verlassen,
- O: Beginnen Sie eine neue Zeile über dem Cursor und rufen Sie den Einfügemodus auf.
- D: Geben Sie ein 'D'-Zeichen ein.
Sie können bestätigen, dass Ihr Terminal dies sendet, indem Sie in den Einfügemodus wechseln und dann drücken, Ctrl-Vgefolgt vom LeftPfeil.
Was läuft falsch?
Die Escape-Sequenz läuft möglicherweise ab
Die einzige Möglichkeit, wie Vim die Escape-Sequenz von denselben drei manuell eingegebenen Zeichen unterscheiden kann, besteht in der Zeit zwischen dem Empfang jedes Zeichens. Auf langsamen Terminals oder stark ausgelasteten Systemen kann es daher zu einer ausreichenden Verzögerung zwischen den einzelnen Zeichen kommen, damit Vim entscheidet, dass es sich nicht um eine Escape-Sequenz handelt, und nur die Tastenanschläge wie oben beschrieben interpretiert.
Dies wird in :help vt100-cursor-keys
und weiter :help timeout
unten beschrieben. Die vorgeschlagene Lösung besteht darin, ein ausreichend großes ttimeoutlen
Zeitlimit festzulegen, das Zeitlimit jedoch vollständig zu deaktivieren, indem beide festgelegt werden, notimeout
und nottimeout
würde auch funktionieren.
Angesichts Ihres Setups ist dies jedoch ziemlich unwahrscheinlich.
Vim erkennt die Sequenz nicht
Es ist wahrscheinlicher, dass das Problem darin besteht, dass Vim die gesendete Escape-Sequenz nicht erkennt und sie daher als Tastenanschläge interpretiert. Sie können dies mit dem folgenden Befehl überprüfen:
:set <left>?
In einem funktionierenden Setup mit Ihrer aktuellen Terminalkonfiguration sollte dies eine der folgenden Ausgaben ergeben:
t_kl <Left> ^[O*D
t_kl <Left> ^[OD
Wenn Sie noch etwas sehen 1 , sprechen Vim und Ihr Terminal nicht ganz dieselbe Sprache.
Der richtige Weg, dies zu beheben, besteht darin, Ihre Terminalkonfiguration so zu korrigieren , dass Ihre Terminfo-Datenbank die Sequenzen meldet, die tatsächlich gesendet werden, wenn Sie die Pfeiltasten drücken. Dies kann jedoch kompliziert sein. Eine leicht hackige Lösung besteht darin, das, was Ihr Terminal sendet, an die Erwartungen von Vim anzupassen. Aus Ihren Kommentaren schließe ich, dass Sie das Standard-Mac Terminal.app verwenden: Sie können unter Einstellungen → Profile → Ihr Profil → Tastatur ändern, welche Escape-Sequenzen für jeden Tastendruck gesendet werden.
Die einfachste Lösung besteht jedoch wahrscheinlich darin, Vim direkt darüber zu informieren, welche Escape-Sequenzen zu erwarten sind. Sie können dies tun, indem Sie die Terminaloptionen folgendermaßen einstellen:
set <up>=^[OA
set <down>=^[OB
set <right>=^[OC
set <left>=^[OD
Beachten Sie, dass das ^[
oben Gesagte ein wörtliches ESC
Zeichen ist. Sie können nicht einfach ^gefolgt von tippen [! Der einfachste Weg, die Zuordnungen einzugeben, ist die Eingabe von z
set <left>=
Drücken Sie dann im Einfügemodus Ctrl-Vgefolgt vom leftPfeil. Beachten Sie, dass Sie dann die Escape-Sequenz direkt auf das einstellen, was Vim empfängt, wenn Sie die Pfeiltaste drücken ... indem Sie diese Sequenz senden!
1: Eine wahrscheinliche Möglichkeit ist die CSI-Sequenz :^[[D