Esc←私のシェルでは、-と-を入力して長いコマンドラインを移動することがEscでき→ます。キーバインディングは次のようになります。EscAlt
$ bindkey | grep -a -- -word
(...)
"^[^[[D" -> backward-word
"^[^[[C" -> forward-word
(...)
Altちなみに+キーの組み合わせを押すと←特殊コードが認識されず、「3D」という2文字が印刷されます。
$echo longcommand longcommand longcommand longcommand
(pressing at the end of the line at this point)
$echo longcommand longcommand longcommand longcommand3D
Alt+は→「3C」を提供します。
xev
←キーの有無にかかわらず、同じKeyPressイベントを表示しますAlt(ここでは左のAltが使用されます)。
プレフィックスバリアントはすでに機能していますが、どのようにAlt機能させますかEsc?
これはキーの組み合わせが機能しているxfce4-terminal
ときに発生します。xterm
答え1
xfce4-terminal は、vte ライブラリを使用してすべての関連機能を実装します。この場合、円xtermの関数(参照altIsNotMeta
そしてaltSendsEscape
、またmetaSendsEscape
)。 vteはこれを実装しません。その場合(xtermを正しく模倣するために)、メタモードをオフまたはオンにするために使用されるエスケープシーケンスも認識する必要があります。それもしません。
VTEは文書化されていないため、その内容を読む必要があります。ソースコードその特性を理解することです。
xfce4-terminal 0.8.9.2およびvte 0.62.1を使用してソースコードを読み取ったことを確認すると、後者はこのシーケンスを部分的に実装します(プライベートモード 1036)、存在するvte.cc:
Ps = 1 0 3 6 ⇒ Send ESC when Meta modifies a key, xterm.
This enables the metaSendsEscape resource.
ただし、特殊キー処理は省略されました(あなたの質問はこれに関連しています)。このブロックの前のコメントは次のとおりです。
/* If we got normal characters, send them to the child. */
特殊キーは派生修飾子を使用します。widget.cc
:
/* Read the modifiers. See bug #663779 for more information on why we do this. */
auto mods = GdkModifierType{};
if (!gdk_event_get_state(event, &mods))
return 0;
#if 1
/* HACK! Treat META as ALT; see bug #663779. */
if (mods & GDK_META_MASK)
mods = GdkModifierType(mods | GDK_MOD1_MASK);
#endif
エラーレポート#663779vte開発者がこの領域でxtermの動作の一部をハードコーディングした方法を詳しく説明します。彼らが言う部分は特別なキーです(例:Alt+矢印、AltまたはMetaと組み合わせる)。このブロックはvte.cc
:
_vte_keymap_map(keyval, m_modifiers,
m_modes_private.DEC_APPLICATION_CURSOR_KEYS(),
m_modes_private.DEC_APPLICATION_KEYPAD(),
&normal,
&normal_length);
/* If we found something this way, suppress
* escape-on-alt. */
if (normal != NULL && normal_length > 0) {
suppress_alt_esc = TRUE;
}