Im Terminal während einer GUI-Sitzung,Oo erzeugt das Zeichen "/"

Im Terminal während einer GUI-Sitzung,Oo erzeugt das Zeichen "/"

Wenn ich mich in einer GNOME3-GUI-Anmeldesitzung unter Ubuntu 20.10 befinde, erzeugt das schnelle Drücken von ESC, O, oin einem Terminalfenster ein '/'-Zeichen, anstatt diese Tastenanschläge einzugeben. Dies ist problematisch, wenn ich Vim ausführe, wo ich oft den Einfügemodus verlassen und schnell eine neue Textzeile über der aktuellen beginnen möchte.

Andere Tastenfolgen, die mit beginnen, ESC Overhalten sich ähnlich: ESC O qergibt „1“; … weine „7“ usw. Viele funktionieren auch wie erwartet.

Das Zeitfenster zum Eingeben dieser Tasten und Auslösen des Effekts scheint in Vim etwa 2 Sekunden zu betragen, und auf der Befehlszeile ist es erheblich kürzer.

Bei einer Konsolenanmeldung über CTRL ALT F6wird dieses Verhalten nicht beobachtet.

Es tritt auch nicht in anderen Apps wie Chrome, Text Editor oder GVim auf.

Es tritt sowohl unter Guake als auch unter Terminal auf.

Dasselbe Verhalten habe ich auch bei einer WSL-Installation von Ubuntu auf einem Windows 10-Rechner beobachtet. Es scheint keine gemeinsamen Konfigurationselemente zwischen den beiden Home-Verzeichnissen zu geben, die verdächtig sind.

Ich habe das Verhalten unter anderen Desktops wie LXDE oder KDE nicht überprüft.

Mir ist aufgefallen, dass dieses Problem in einer MacOS-Terminalsitzung nicht auftritt.

Ist dies eine Funktion von GNOME? Gibt es eine Möglichkeit, sie zu deaktivieren oder zu ändern?

Antwort1

Das Problem liegt in der Tastenbelegung von VTE.diese Änderung im Jahr 2014:

Commit 598572b526568591ca91e3e0019412274edd9643
Autor: Egmont Koblinger[email geschützt]
Datum: So 18. Mai 2014 13:36:01 +0200

keymap: Verwenden Sie fest codierte Sequenzen anstelle von Terminfo

https://bugzilla.gnome.org/show_bug.cgi?id=728900#c5

Der Quellcode sagt Folgendes:

static const struct _vte_keymap_entry _vte_keymap_GDK_KP_Divide[] = {
        {cursor_all, keypad_default, 0, "/", 1},
        {cursor_all, keypad_app, VTE_NUMLOCK_MASK, "/", 1},
        {cursor_all, keypad_app, 0, _VTE_CAP_SS3 "o", -1},
        {cursor_all, keypad_all, 0, X_NULL, 0},
};

WoSS3ist zufällig die EscapeOSequenz. Einige Terminals (und möglicherweise einige Versionen von Gnome-Terminal) erlauben die Neudefinition von Schlüsseln, aber bei einer schnellen Überprüfung von Ubuntu 20 sehe ich nur die Möglichkeit, eine Bindung an einen derAktionendass das Terminal erkennt:

Gnome-Terminal-Einstellungen

Wenn dieser Weg nicht hilft, gibt es andere Terminals, die unter Ubuntu laufen.

Antwort2

TL;DR Überprüfen Sie, ob Ihre timeoutlenund/oder ttimeoutlenVim-Optionen nicht zu hoch sind.

Dies ist nicht spezifisch für Gnome. Ich hatte vor einiger Zeit ein ähnliches Problem, nur dass <Esc>Or „2“ erzeugte:

Das Makro „oend^[Ores^[“ führt zu einer neuen Zeile „end2es“. Wie?

Das Terminal stellt den darauf laufenden Programmen Sondertasten (wie F1oder ->) als Escape-Sequenzen zur Verfügung. Damit vim weiß, ob diese Escape-Sequenzen oder jedes Zeichen einzeln interpretiert werden soll, verwendet es einen Timer, um zu bestimmen, ob der Benutzer sie wahrscheinlich eingetippt hat oder ob das Terminal die Sequenz als Übersetzung in eine Sondertaste bereitgestellt hat (was viel schneller sein sollte, als man tippen könnte). Vim dokumentiert dies in der Option esckeys:

'esckeys' 'ek'      boolean (Vim default: on, Vi default: off)
            global
    Function keys that start with an <Esc> are recognized in Insert
    mode.  When this option is off, the cursor and function keys cannot be
    used in Insert mode if they start with an <Esc>.  The advantage of
    this is that the single <Esc> is recognized immediately, instead of
    after one second.  Instead of resetting this option, you might want to
    try changing the values for 'timeoutlen' and 'ttimeoutlen'.  Note that
    when 'esckeys' is off, you can still map anything, but the cursor keys
    won't work by default.
    NOTE: This option is set to the Vi default value when 'compatible' is
    set and to the Vim default value when 'compatible' is reset.
    NOTE: when this option is off then the |modifyOtherKeys| functionality
    is disabled while in Insert mode to avoid ending Insert mode with any
    key that has a modifier.

Um dieses Verhalten unter einer Standardkonfiguration von vim zu sehen, müssen Sie die 3 Tasten in weniger als einer Zehntelsekunde eingeben.

Da Sie sehen, dass Ihr Zeitfenster in Vim 2 Sekunden beträgt, würde ich vermuten, dass Ihre timeoutlenund/oder ttimeoutlenVim-Optionen zu hoch sind?

                        *'timeoutlen'* *'tm'*
'timeoutlen' 'tm'   number  (default 1000)
            global

                        *'ttimeoutlen'* *'ttm'*
'ttimeoutlen' 'ttm' number  (default -1, set to 100 in |defaults.vim|)
            global
    The time in milliseconds that is waited for a key code or mapped key
    sequence to complete.  Also used for CTRL-\ CTRL-N and CTRL-\ CTRL-G
    when part of a command has been typed.
    Normally only 'timeoutlen' is used and 'ttimeoutlen' is -1.  When a
    different timeout value for key codes is desired set 'ttimeoutlen' to
    a non-negative number.

        ttimeoutlen mapping delay      key code delay   ~
           < 0      'timeoutlen'       'timeoutlen'
          >= 0      'timeoutlen'       'ttimeoutlen'

    The timeout only happens when the 'timeout' and 'ttimeout' options
    tell so.  A useful setting would be >
        :set timeout timeoutlen=3000 ttimeoutlen=100
    (time out on mapping after three seconds, time out on key codes after
    a tenth of a second).

Nun, /scheint vielleicht kein spezieller Schlüssel zu sein, aber er soll offensichtlich anders interpretiert werden als der neben Shift. Wenn ich mir die Manpage urxvt(7) anschaue, sehe ich:

KP_Divide      /       ESC O o

KPwahrscheinlich ist damit der Ziffernblock gemeint.

verwandte Informationen