Emacs 편집 모드의 Zsh에는 기본 키 바인딩 ALT+ Backspace커서 오른쪽의 단어 삭제 및 ALT+ D왼쪽의 단어 삭제가 함께 제공됩니다. ALT+ 에 후자의 기능을 추가하고 싶습니다 DEL.
terminfo
각 키 조합에 대한 이스케이프 시퀀스를 올바르게 설정하기 위해 데이터베이스를 사용하려고 합니다 $TERM
. Capname이 되는 것에 man terminfo
대해 읽었을 때 + kDC3
에 해당 이름을 사용해야 할 수도 있습니다 .ALTDEL
내 항목에 다음 줄을 추가했습니다 ~/.zshrc
.
bindkey -e `tput kDC3` kill-word
$TERM
SSH (is) 를 통해 내 컴퓨터에 직접 연결할 때 이것은 훌륭하게 작동합니다 xterm
. 하지만 Tmux 세션( $TERM
is 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
. - 이미
tmux
kDC3
테이블, 전화하지 않습니다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
가능성이 있는 것 같습니다.