Deaktivieren Sie <Esc>, aber behalten Sie <C - [> bei

24

Zum Zurückschalten aus dem Einfügemodus bin ich es gewohnt <Esc>. Jetzt suche ich mich umzubilden <C-[>statt <Esc>. Dafür muss ich deaktivieren <Esc>, um bei der Umschulung zu helfen.

Das Problem ist

:inoremap <Esc> <Nop>

auch deaktiviert <C-[>. Für Vim scheinen sie dasselbe zu sein.

Gibt es eine Möglichkeit, eins ohne das andere zu deaktivieren?

mxlian
quelle
13
Es hängt davon ab, in welcher Umgebung Sie arbeiten. Die meisten Text-Terminals senden die gleichen Informationen an die Anwendung, wenn Sie Escoder 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.
Gilles 'SO- hör auf böse zu sein'
Recht! Kein Problem. Ich werde eine Problemumgehung mit den Tastaturzuordnungen finden. Danke
mxlian
3
@ Gilles, warum schreibst du das nicht in eine Antwort? Es ist besser für Googler und unsere Website-Statistiken.
Robbie Wxyz
2
@SuperScript Ich habe das etwas genauer untersucht und eine Antwort gepostet.
Gilles 'SO- hör auf böse zu sein'

Antworten:

35

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-Iwenn 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: 1Betrifft nur Metakombinationen und Kontrollkombinationen, denen ein ASCII-Zeichen fehlt.
  • Mit ?.VT100.modifyOtherKeys: 2und ?.VT100.formatOtherKeys: 0(Standard) Ctrl+ [senden ␛[27;5;91~und Ctrl+ Isenden ␛[27;5;105~.
  • Mit ?.VT100.modifyOtherKeys: 2und ?.VT100.formatOtherKeys: 1, Ctrl+ [senden ␛[91;5uund Ctrl+ Isenden ␛[105;5u.

Die Unterstützung kann aktiviert werden, indem die modifyOtherKeys Ressource beim Start von xterm festgelegt wird (und formatOtherKeyszwischen 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 modifyOtherKeysModus 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.

Gilles 'SO - hör auf böse zu sein'
quelle