Ubuntu 20.10のGNOME3 GUIログインセッションで、ターミナルウィンドウで、、を素早く連続して押すと、これらのESC
キーO
ストロークo
を入力する代わりに "/"文字が生成されます。これはVimを実行するときに問題になります。挿入モードから外れ、現在のテキストの上に新しいテキスト行をすばやく開始したい場合がよくあります。
次に始まる他のキーシーケンスもESC
O
同様に動作します。ESC
O
q
「1」… w
「7」など。多くの人が期待どおりに動作します。
これらのキーを入力してエフェクトを実行するのにかかる時間は、Vimでは約2秒であるように見えますが、コマンドラインでははるかに短いです。
コンソールからログインしてもCTRL
ALT
F6
この動作は観察されません。
Chrome、テキストエディタ、GVimなどの他のアプリケーションでも発生しません。
Guakeとターミナルの下に表示されます。
また、Windows 10システムのUbuntu WSLインストールでも同じ動作を観察しました。 2つのホームディレクトリの間には、疑わしいほど共通のコンポーネントがないようです。
LXDEやKDEなどの他のデスクトップは動作を確認していません。
MacOS 端末セッションでは、この問題は発生しないことがわかりました。
これがGNOMEの機能ですか?無効または変更する方法はありますか?
答え1
問題はVTEのキーマップにあります。2014年にこの変化が起こりました:
コミット 598572b526568591ca91e3e0019412274edd9643
著者: Egmont Koblinger[Eメール保護]
日付:2014年5月18日日曜日13:36:01 +0200keymap:terminfoの代わりにハードコーディングされたシーケンスを使用する
ソースコードは次のように言います。
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},
};
どこSS3まさにEscapeO
その順序です。一部の端末(およびおそらくいくつかのバージョンのgnome-terminal)ではキーのオーバーライドが可能ですが、Ubuntu 20をすばやく見ると、それらの1つにのみバインディングを割り当てることができます。行動端末識別:
その方法が役に立たない場合は、Ubuntuで実行されている他の端末があります。
答え2
TL;DR お客様timeoutlen
および/またはttimeoutlen
vim オプションが高すぎるか確認してください。
これはGnomeに限定されていません。 <Esc>または「2」を生成することを除いて、しばらく前に同様の問題がありました。
マクロ "oend^[Ores^[") は、"end2es" という新しい行を生成します。どのように?
ターミナルは、ターミナルで実行されているプログラムのF1エスケープシーケンスとして特殊キー(たとえば、または)を提供します。->vimは、これらのエスケープ文字列を解釈する必要があるかどうか、または各文字を個別に解釈する必要があるかどうかを知るために、タイマーを使用して、ユーザーがこれらの文字を入力する可能性があるかどうか、または端末が特殊キーの翻訳としてシーケンスを提供することを確認します。を入力するよりも速くする必要があります。)Vimはオプションについてこれを文書化します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.
vimのデフォルト設定でこの動作を確認するには、10分の1秒以内に3つのキーを入力する必要があります。
vimのタイムウィンドウが2秒であることを見ると、あなたtimeoutlen
と/またはttimeoutlen
vimオプションが高すぎると思いますか?
*'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).
これは/
特別なキーのようには見えないかもしれませんが、隣のキーとは明らかに異なるように解釈されますShift。 urxvt(7) のマニュアルページを見ると次のようになります。
KP_Divide / ESC O o
KP
おそらく数字キーパッドを話しているようです。