xfce4-terminal에서 Alt+화살표 키 바인딩이 작동하지 않습니다

xfce4-terminal에서 Alt+화살표 키 바인딩이 작동하지 않습니다

Esc내 셸에서는 - 및 -를 입력하여 긴 명령줄을 이동할 수 있으며 Esc이전 또는 다음 단어 구분 기호로 이동 하고 이를 대체 키의 접두사로 사용할 수 있습니다 . 키 바인딩은 다음과 같을 수 있습니다:EscAlt

$ bindkey | grep -a -- -word
(...)
"^[^[[D"       -> backward-word
"^[^[[C"       -> forward-word
(...)

Alt그런데 + 키 조합을 누르면 특수 코드가 인식되지 않고 "3D"라는 두 글자가 인쇄됩니다.

$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;
        }

관련 정보