Tmux Terminfo 및 Zsh 키 바인딩 문제

Tmux Terminfo 및 Zsh 키 바인딩 문제

Emacs 편집 모드의 Zsh에는 기본 키 바인딩 ALT+ Backspace커서 오른쪽의 단어 삭제 및 ALT+ D왼쪽의 단어 삭제가 함께 제공됩니다. ALT+ 에 후자의 기능을 추가하고 싶습니다 DEL.

terminfo각 키 조합에 대한 이스케이프 시퀀스를 올바르게 설정하기 위해 데이터베이스를 사용하려고 합니다 $TERM. Capname이 되는 것에 man terminfo대해 읽었을 때 + kDC3에 해당 이름을 사용해야 할 수도 있습니다 .ALTDEL

내 항목에 다음 줄을 추가했습니다 ~/.zshrc.

bindkey -e `tput kDC3` kill-word

$TERMSSH (is) 를 통해 내 컴퓨터에 직접 연결할 때 이것은 훌륭하게 작동합니다 xterm. 하지만 Tmux 세션( $TERMis screen)에서 Zsh를 시작하면 다음과 같은 오류 메시지가 나타납니다.

tput: unknown terminfo capability 'kDC3'

ALT이것은 정말로 Tmux에서 + 에 아무것도 바인딩하는 것이 불가능하다는 것을 의미합니까 ? DEL아니면 내가 뭔가 잘못하고 있는 걸까? 혹시 kDC3순서가 잘못된 건 아닐까?

저는 Debian Wheezy Beta 4 x86_64를 실행하고 있습니다.

답변1

첫 번째 질문은 당신의 것입니다용어 정보항목에는 screen정의된 기능이 없습니다 kDC3. 이는 일반적일 수 있습니다. 이 기능을 사용자 정의 screen항목에 추가하거나 명령의 시퀀스를 "하드코드" 할 수 있습니다 bindkey.


기능을 추가하면 다른 프로그램이 키에 대해 배우는 데 도움이 될 수 있지만 구성이 조각화될 수 있습니다. 구성을 새 컴퓨터나 사용자 계정에 수동으로 복사할 때 이 사용자 지정을 잊어버리기 쉽습니다. 다음 명령을 사용하여 적절한 항목을 추출 infocmp하고 다음을 사용하여 새 항목을 빌드할 수 있습니다 tic.

{ infocmp -xT screen ; infocmp -x1T xterm | grep -E '^\tkDC[3-8]?=' ; } >/tmp/s
tic -x /tmp/s

당신이 달리면terminfo 디렉토리(예: /usr/share/terminfo)에 대한 쓰기 권한이 있는 사용자로서 새 항목이 해당 위치에 배치됩니다(원래 항목을 덮어쓸 수 있음). 그렇지 않으면 해당 항목이 (또는 해당 환경 변수를 설정한 경우 TERMINFO) 아래에 배치됩니다 ~/.terminfo.

(UP|DN|RIT|LFT|PRV|NXT|HOM|END|IC|DC)완전성을 위해 대신 사용하고 싶을 수도 있습니다 DC.grepUp, Down, Right, Left, PageUp, PageDown, Home, End, Insert 및 Delete의 수정된 버전을 캡처하는 모드입니다.


사용자 정의 terminfo 항목으로 인해 발생하는 구성 조각화가 마음에 들지 않으면 값을 "하드코드"할 수 있습니다. 조금 더 나은 결과를 얻으려면 kDC3먼저 다음을 확인해 보세요.

bindkey -e ${$(tput kDC3 2>/dev/null):-'\e[3;3~'} kill-word

screen이 "하드 코딩"을 TERM 값에만 기반으로 제한하려면 다음을 수행하십시오 .

altdel=$(tput kDC3 2>/dev/null)
[[ -z $altdel && $TERM == screen(|-*) ]] && altdel='\e[3;3~'
[[ -n $altdel ]] && bindkey -e $altdel kill-word
unset altdel

터미널 에뮬레이터(스택)가 최종적으로 생성되자마자xterm키의 스타일 순서가 수정되었습니다.


xterm-keys바인딩한 후에도 옵션 을 켜야 합니다.멀티플렉서이렇게 하면 생성됩니다.xterm해당 창에 전달된 주요 스타일의 순서입니다. 예를 들어 ~/.tmux.conf:

set-option -wg xterm-keys on

답변2

때에 따라 다르지:

  • ncurses는 확장 기능을 지원합니다(사용자 정의 가능) 터미널 기능.
  • kDC3확장하다터미널 기능.
  • 아무도 없거나 tmux그것에 대해 아는 것이 zsh없습니다 .emacs모두에 대한 kDC3.
  • 이미tmuxkDC3테이블, 전화하지 않습니다use_extended_names이 기능을 활성화하십시오.
  • ncurses는 tput알게 될 것이다 kDC3.만약에이는 현재 터미널 설명에 정의되어 있습니다.

screen( tmux모방한) 프로그램도 맞습니다 kDC3.용어 모자애플리케이션이며 (그 자체로는) 2자리 이름에만 관심이 있습니다. 그런데 screen이 문제를 직접적으로 해결해주는 기능이 있습니다: 매뉴얼(16.1 창에 대한 termcap 항목 선택) 설정을 선택하는 방법을 알려줍니다.TERM ~에스크린 세션:

screen자체 터미널 이름을 찾으려고 할 때 먼저 다음과 같은 항목을 찾습니다.screen.학기, 어디학기변수의 내용입니다 $TERM. 해당 항목이 없으면 화면에서 다음을 시도합니다.screen(또는screen-w, 터미널이 매우 넓은 경우(132열 이상)). 이 항목조차 찾을 수 없는 경우,vt100대체품으로 사용됩니다.

터미널이 중요한 기능(예: 문자 제거 또는 EOS 지우기)을 지원하지 않는 경우 화면에 대한 새로운 termcap/terminfo 항목(이름:screen.dumbterm), 이 기능은 비활성화되어 있습니다. 이 항목이 컴퓨터에 설치되어 있으면 rlogin할 수 있으며 올바른 termcap/terminfo 항목을 계속 유지할 수 있습니다. 터미널 이름은 $TERM모든 새 창의 변수에 저장됩니다. 또한 화면은 $TERMCAP시뮬레이션된 가상 터미널의 기능을 반영하는 변수를 설정합니다. 또한 이 변수는 $WINDOW각 창의 창 번호로 설정됩니다.

ncurses의 터미널 데이터베이스는 이 기능을 활용하여 가장 일반적인 screen변형을 제공합니다.xterm및 기타 유사한 터미널이지만다른기능 키(예:콘솔,정맥 혈전색전증(예: 그놈 터미널),가치를 얻다. 그 외에 rxvt다른 모든 것은 아직 TERM설정 되어 있습니다 xterm.

기본 구성에서는 이러한 터미널 설명을 사용할 수 없을 수도 있습니다(그리고 이 질문에서와 같이 사용자가 버그를 보고하도록 screen계속 설정하고 인센티브를 제공할 것입니다 ). TERM=screen예를 들어 데비안에는ncurses 기본 사항terminfo 패키지는 최소한의 터미널 설명 세트만 제공합니다. 당신은 설치해야ncurses-term완전한 터미널 데이터베이스를 얻으십시오.

물론 터미널 설명에는 screen확장 기능 키에 대한 설명이 없습니다. 그런데 여기에는 다음과 같은 확장 기능이 포함되어 있습니다.

AX, G0, E0=\E(B, S0=\E(%p1%c,

그러나 이러한 앱 중 어느 것도( 제외 tput) 아무 것도 수행하지 않습니다.

tmux불완전한 일치의 동작으로 인해 상황이 복잡해집니다 screen. ncurses에서 제공하는 대체 이름을 확인하지 않습니다. 이유는 설명할 필요가 없습니다.매뉴얼 페이지설명하다

내부에서 실행되는 모든 프로그램의 경우 환경 TERM변수를 로 설정해야 합니다. 새 창이 해당 환경에 자동으로 추가되지만 쉘 시작 파일에서 재설정하지 않도록 주의해야 합니다.“screen”tmux“TERM=screen”

가능한 이유는 개발자가 이를 보장하고 싶지 않았기 때문입니다 screen. 기능 키는 또 다른 이야기입니다. 제안된 대로 터미널 설명을 수정할 수 있지만 이는 해결책보다는 문제가 더 많은 것으로 입증되었습니다.

이것추천 스크립트그런데 작동하지 않는 것 같습니다. 이 질문의 모든 맥락을 고려할 때 수정된 스크립트를 표시하는 것은 의미가 없습니다. 터미널 데이터베이스를 단편적으로 조정하는 것보다 쉘 초기화에서 Case 문을 사용하여 TERM설정을 확인하고 터미널 데이터베이스에 이미 더 나은 대안이 있는지 확인하는 것을 선호합니다. screen개발자가 터미널의 기능에 따라 설정하는 것을 거부하므로 TERM이를 올바르게 수행하는 것은 더 복잡해집니다 . 그러나 환경 변수를 살펴보면 대부분의 방법을 얻을 수 있습니다 COLORTERM.

귀하의 오락을 위해:

답변3

tmux의 내부를 살펴보니 terminfo 설정 등에 별로 주의를 기울이지 않는 것 같습니다. 예를 들어, xterm 모드를 켜면 다음과 같습니다.

set-window-option -g xterm-keys on

다양한 키에 해당하는 실제 이스케이프 시퀀스는 프로그램에 하드코드되어 있으며 infocmp xterm사용자가 들은 내용과 다를 수 있습니다.

그 외에 tmux는 F20하드코딩된 키 세트만 인식하므로 위의 모든 것을 무시합니다. 그래서 이렇게

set-option -g terminal-overrides "screen:kf34=\033[21;5~"

또는

tmux bind-key -t emacs-copy F34 page-up

xterm이나 tput이 무엇을 뱉어도 아무 일도 일어나지 않습니다. 적어도 지금은 그렇게 보입니다.

동일한 문제가 비슷한 문제에 영향을 미치는지는 확실하지 않지만 kDC3가능성이 있는 것 같습니다.

관련 정보