Zsh는 수정자와 함께 terminfo 키를 얻습니다.

Zsh는 수정자와 함께 terminfo 키를 얻습니다.

Zsh의 Arch Linux Wiki 페이지에는 terminfo에서 키 시퀀스를 가져오는 예가 있습니다.

typeset -g -A key

key[Home]="${terminfo[khome]}"
key[End]="${terminfo[kend]}"
...

하지만 수정자를 사용하여 어떻게 얻을 수 있나요? 특히 Alt+j 및 Alt+k입니다.

감사해요.

답변1

터미널 ncurses데이터베이스는 이를 정의합니다(참조:Shift 또는 Control 수정자를 사용하는 방법은 무엇입니까?ncursesFAQ 에서 ).

이 중 대부분은 수행된 작업을 기반으로 합니다 xterm(참조:이 페이지, 예를 들어).

이는 고유한 이름입니다( zsh미리 정의된 터미널 이름 사전에 없기 때문에 무시됩니다. 참조).src/모듈/terminfo.c). 예를 들어, tput데이터를 변수에 넣으 려면 출력에 대해 일부 쉘 할당을 수행해야 합니다 .

Alt일반적으로 고려되지 않음수정자일반 키에 적용되는 경우.j또는k내부에 xterm.

패턴이 있습니다 (다른 키 수정), 이스케이프 시퀀스의 다양한 조합을 보내도록 지시합니다(참조:내 프로그램은 컨트롤-I와 탭을 어떻게 구별합니까?xtermFAQ 에서 ).

이 경우 zsh아무런 도움도 제공되지 않습니다. 마찬가지로 터미널은 결과 테이블을 제공하지 않습니다(처리특수 키). 맞춤형 애플리케이션이 필요합니다.

당신이 생각할 수 있는 것은특징. 여기에는 terminfo 기능이 있습니다(smm할 수 있게 하다,rmm장애가 있는). 그러나 대부분의 터미널(제외 xterm)파일에 기록하다행동. 존재하다 terminfo(5):

터미널에 Shift 키 역할을 하는 "metakey"가 있고 전송된 문자의 비트 8을 설정하는 경우 이 사실은 다음 명령으로 표현할 수 있습니다. km. 그렇지 않으면 소프트웨어는 비트 8이 패리티 비트라고 가정하고 일반적으로 지워집니다. 이 "메타 모드"를 켜고 끄는 문자열이 있는 경우 다음과 같이 지정할 수 있습니다.smm그리고rmm.

bash이는 부분적으로 문서에 있는 역방향 정의 때문입니다 (참조:내 대답더 알아보기). 그러나 terminfo는 어떤 문자가 접두사로 사용될 수 있는지 스크립트에 알려주는 정보를 저장하지 않습니다 Escape.

관련 정보