Die Pfeiltasten funktionieren im Einfügemodus nicht


13

Wenn ich im Einfügemodus die Pfeiltasten drücke, erhalte ich Zeichen anstelle der Navigation:

Durch Drücken der Pfeiltasten werden Zeichen eingegeben

Ich möchte in der Lage sein, mit den Pfeiltasten zu navigieren.


Dinge, die ich versucht habe

Ich habe set nocompatiblein meinem ~/.vimrc( vimrc pastebin ), ich benutze Pathogen und hier ist mein ~/.vim/bundleVerzeichnis:

YouCompleteMe/
emmet-vim/
nerdtree/
node/
vim-airline/
vim-markdown/

Das Problem hat erst vor kurzem begonnen, kann mich nicht an die Ursache erinnern.

Einige empfehlen :set term=builtin_ansi, und dies behebt das Problem, entfernt aber alle meine Farben.


$ vim --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Aug 29 2016 12:51:13)
MacOS X (unix) version
Included patches: 1-2290
Compiled by Homebrew
Huge version without GUI.  Features included (+) or not (-):
...

Die gesamte Ausgabe finden Sie unter http://pastebin.com/5z1HbpqW .

$ echo $TERM
xterm-256color

und in vim:

:set compatible?
nocompatible

:set term?
term=xterm-256color

5
Vielleicht kein Duplikat (ich bin mir nicht sicher), aber zumindest ziemlich verwandt vi.stackexchange.com/q/5123/1841
statox

@statox Dies ist kein Duplikat, da ich vim verwende, nicht vi.
Theonlygusti

1
Wie haben Sie Ihren Bildschirm so aufgenommen?
Anthony

Haben Sie Tipps von dieser Website ausprobiert : vim.wikia.com/wiki/… ?
Grodzik

1
Entfernen Sie die Zuordnung des Einfügemodus mit Escape. Linie 133
FDinoff

Antworten:


7

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-keysund weiter :help timeout unten beschrieben. Die vorgeschlagene Lösung besteht darin, ein ausreichend großes ttimeoutlenZeitlimit festzulegen, das Zeitlimit jedoch vollständig zu deaktivieren, indem beide festgelegt werden, notimeoutund nottimeoutwü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 ESCZeichen 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


Dank Ihrer Antwort konnte ich die Cursortasten unter Windows Subsystem für Linux korrigieren!
David Ferenczy Rogožan

5

Diese Antwort löste genau das gleiche Problem für mich.

In ~/.vimrcdie folgende Zeile:

set nocompatible

Nach dem Neustart von vim ist das Problem behoben


2
Von so , wenn Sie eine haben , setzen in es sollte überflüssig sein. :h 'nocompatible' default on, off when a vimrc or gvimrc file is found.vimrcset nocompatible
Statox

2

Durch das Aktualisieren des vimPakets wurde das Problem mit den gebrochenen Pfeilen für mich behoben.

Wenn Sie unter Ubuntu sind, führen Sie apt upgrade vim. Interessanterweise apt install vimhilft auch. Und noch interessanter ist, dass die vimVersion nach dem Update gleich bleibt:

VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Nov 24 2016 16:44:48)
Included patches: 1-1689
Extra patches: 8.0.0056

Aber es hilft.


1
Die Version könnte gleich bleiben, aber vielleicht wurden die enthaltenen Patches aktualisiert? Ansonsten sehe ich nicht, wie ich apt upgradedas Problem lösen könnte.
Statox

Dies funktionierte perfekt für mich unter elementarem OS 5.1 Hera.
Praneetloke
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.