Zunächst ein bisschen Geschichte. Früher, als Sie Text in ein Terminal eingegeben haben, hat jede Taste ein Zeichen an die Anwendung gesendet. Als die Maschinen, mit denen das Terminal verbunden war, leistungsfähiger wurden, standardisierten sich die Terminals auf einen Steuerschlüssel , der einige Sonderzeichen sendete, die nicht gedruckt wurden, aber irgendeine Funktion hatten. Der letztendlich triumphale Zeichensatz war ASCII mit 128 Zeichen, von denen 32 Steuerzeichen sind. Drücken Ctrlzusammen mit einem Buchstaben oder einem anderen Symbol, das mit 10xxxxx₂ (binäre Notation) geschrieben ist, sendet das Steuerzeichen, dessen Code 00xxxxx₂ ist, z. B. Ctrl+ [sendet die Zeichennummer 27₁₀ = 0011011₂, weil [
91₁₀ = 1011011₂ ist.
Einige Funktionstasten an den Terminals haben Steuerzeichen gesendet:
- Backspace=
Ctrl-H
(BS = BackSpace) ¹
- Tab=
Ctrl-I
(HT = Horizontal Tab)
- Linefeed=
Ctrl-J
(LF = Line Feed) (nur wenige Terminals hatten diesen Schlüssel)
- Returnoder Enter=
Ctrl-M
(CR = Carriage Return)
- Escape=
Ctrl-[
(ESC = Escape)
Wenn Terminals mehr Funktionstasten hatten, gab es nicht genügend Steuerzeichen, um sie alle darzustellen. Sie haben also Zeichenfolgen gesendet , und die allgemeine Konvention lautet, dass diese Zeichenfolgen mit dem Escapezeichen beginnen Ctrl-[
.
Mit der Zeit wurden Hardware-Terminals immer seltener. Heutzutage gibt es viele Übersetzungsstufen zwischen der Tastatur und der Anwendung . Die Beschränkung der Anzahl verfügbarer Zeichen und der fest codierten Entsprechungen zwischen bestimmten Tastenkombinationen und bestimmten Steuerzeichen ist nicht mehr relevant. Anwendungen sind jedoch mit vorhandenen Terminals kompatibel geblieben, und Terminals sind mit vorhandenen Anwendungen kompatibel geblieben, was es schwierig machte, irgendetwas zu ändern.
Auf Unix-ähnlichen Systemen erhalten Anwendungen, die in einem Terminal-Emulator ausgeführt werden, das Zeichen, Ctrl-I
wenn der Benutzer die TabTaste drückt , das Zeichen, Ctrl-[
wenn der Benutzer die Taste drückt Escusw. Wenn Vim in einem Unix-Terminal ausgeführt wird, kann es nicht unterscheiden <Esc>
und <Ctrl-[>
weil das Terminal die gleichen Informationen sendet.
Vim, das in anderen Umgebungen ausgeführt wird, unterliegt dieser Einschränkung nicht. Daher ist es grundsätzlich möglich, dass Vim andere Informationen sendet. Angesichts der Tatsache, dass Vim den Ctrl-[
Charakter verwendet, um <Esc>
an vielen Orten zu repräsentieren , wäre es unpraktisch, dies zu ändern. Stattdessen könnte Ctrl+ [gemacht werden, um ein anderes Eingabeereignis zu senden.
Mir ist keine Version von Vim bekannt, die zwischen Escund Ctrl+ unterscheidet [(aber es ist nicht so, als hätte ich jemals eine verwendet). Zum einen scheint Gvim ein Terminal für Gartensorten zu emulieren .
Ironischerweise ist Ihre beste Wette Vim, der in einem Terminalemulator ausgeführt wird. Bei einigen Terminalemulatoren können Sie Escape-Sequenzen anpassen, die über Schlüssel und Schlüsselbänder gesendet werden. Sie können also veranlassen, dass Ctrl+ [nicht das Zeichen ␛ ( Ctrl-[
), sondern eine Escape-Sequenz sendet . Xterm, der Referenz-Terminal-Emulator für Unix-ähnliche Systeme, unterstützt zwei solche Schemata. Beispielsweise:
- Escsendet
␛
und Tabsendet ␉
in allen Konfigurationen.
- Mit
?.VT100.modifyOtherKeys: 0
(Standard) oder ?.VT100.modifyOtherKeys: 1
, Ctrl+ [sendet ␛
und Ctrl+ Isendet ␉
. ?.VT100.modifyOtherKeys: 1
Betrifft nur Metakombinationen und Kontrollkombinationen, denen ein ASCII-Zeichen fehlt.
- Mit
?.VT100.modifyOtherKeys: 2
und ?.VT100.formatOtherKeys: 0
(Standard) Ctrl+ [senden ␛[27;5;91~
und Ctrl+ Isenden ␛[27;5;105~
.
- Mit
?.VT100.modifyOtherKeys: 2
und ?.VT100.formatOtherKeys: 1
, Ctrl+ [senden ␛[91;5u
und Ctrl+ Isenden ␛[105;5u
.
Die Unterstützung kann aktiviert werden, indem die modifyOtherKeys
Ressource beim Start von xterm festgelegt wird (und formatOtherKeys
zwischen den beiden Schemata ausgewählt wird), oder sie kann dynamisch von der Anwendung aktiviert und deaktiviert werden.
Vim hat keine eingebaute Unterstützung, die ich kenne. Sie können Ihre eigenen Bindungen für diese Escape-Sequenzen schreiben. Es ist möglich, dass Vim das Terminal automatisch in den modifyOtherKeys
Modus versetzt, indem es eine geänderte Terminaldefinition eingibt. Dies würde jedoch den Rahmen dieser Antwort sprengen.
Neovim hat Unterstützung für eine der Varianten eingebaut . Soweit ich weiß, wird die Unterstützung nicht eingeschaltet, wenn das Terminal dies unterstützt. Der Benutzer muss dies tun.
¹ BackspaceSendet in zunehmendem Maße und am häufigsten Zeichen 127.
Esc
oder drücken.C-[
Sie haben also Pech, können jedoch möglicherweise etwas mit einer GUI-Version von Vim oder durch Neukonfiguration Ihres Terminals tun.