키 바인딩 테이블?

키 바인딩 테이블?

다양한 키 입력을 모두 변환하는 키 바인딩 테이블이 있나요? 나는 를 사용하고 있지만 zsh그러한 테이블이 있다면 어떤 쉘에서도 작동할 것이라고 생각합니다.

제가 묻는 이유는 일부 키 바인딩을 할당하고 싶지만 이를 참조하는 방법을 알 수 없기 때문입니다(이미 정의된 키 바인딩을 훔치고 싶지 않은 경우).

예를 들어 "zbindkey"에는 다음과 같은 내용이 있습니다.

[[ "$terminfo[kend]"  == " O"* ]] && \
    bindkey -M emacs "${terminfo[kend]/O/[}"  end-of-line

End..."kend"는 이것이 키 를 참조한다는 뜻이라고 추측할 수 있습니다 .

교차 확인을 해보면 bindkey다음과 같은 내용이 보입니다.

"^E" end-of-line
"^[OF" end-of-line
"^[[F" end-of-line

... 그래서 줄 중 하나가 key 를 참조한다고 생각합니다 End. 어느 것?

"bindkey" 파일에도 이 내용이 있습니다:

bindkey "\e[A" history-beginning-search-backward

자, 우연히 이것이 열쇠라는 것을 알았지 Up Arrow만, 몰랐다면 어떻게 찾을 수 있었겠습니까?

$ bindkey (at CLI)

...동일한 키에 대해 서로 다른 언어를 제공합니다.

"^[[A" history-beginning-search-backward

...하지만 적어도 지금은 Bindkey-at-CLI에서 말하는 것이 ^[[ABindkey-in-zbindkey에서 말하는 것과 같다는 것을 알고 있습니다. \e[A그것은 간단합니다. Up Arrow 예전 DOS 에서는 0;72모든 합법적인 키 입력에 대해 하나의 언어로만 스캔 코드를 찾을 수 있었습니다.

테이블이 있나요? 아니면 키 입력을 선택하고 terminfo[]"bindkey-at-CLI"에서 "bindkey-in-zbindkey"하는 방법 및/또는 존재할 수 있는 다른 언어에서 이를 참조하는 다른 방법을 알 수 있습니까 ?

scancode마찬가지로, DOS에는 키보드를 치면 스캔 코드를 얻을 수 있는 프로그램이 있었습니다 . 너무 쉽습니다.


답변을 보면 가능한 모든 바인딩의 테이블을 인쇄할 수 있는 방법이 없다고 생각합니다. 어쨌든, "bindkey"는 내가 원하는 것을 거의 수행합니다.

pts/2 HP-y5-10-Debian1 root /aWorking/Docs $ bindkey -L
bindkey "^@" set-mark-command
bindkey "^A" beginning-of-line
bindkey "^B" backward-char
bindkey "^D" delete-char-or-list
bindkey "^E" end-of-line
...

전부는 아니더라도 적어도 기존 바인딩을 모두 볼 수 있습니다.가능한제본. 이제 주요 형식을 "일반" 용어로 변환하는 방법이 있다면 다음과 같습니다.

bindkey "Home" beginning-of-line

...그럼 다행이겠습니다.

답변1

터미널 애플리케이션과 터미널 에뮬레이터(또는 하드웨어 터미널) 간의 인터페이스는 키가 아닌 바이트를 전송합니다. 커서 이동 키와 같은 기능 키는 이스케이프 시퀀스(이스케이프 문자 ESC, 즉 \e0x1b \033, ^[로 시작)로 변환됩니다. 기능 키 또는 문자 키와 수정자의 조합도 마찬가지입니다. 하지만 모든 터미널이 모든 다른 수정자 조합에 대해 서로 다른 시퀀스를 보내는 것은 아닙니다. 일부 키는 제어 문자로 인코딩됩니다(예: Tab→ Ctrl-I == \t) \011.

보시다시피 제어 문자를 설명하는 방법에는 여러 가지가 있습니다. 일부는 기존 기능(예: 탭, 줄 바꿈)에 해당하는 이름을 가지고 있으며 $'…'내부적으로나 매개변수에서 사용할 수 있는 백슬래시+문자 조합을 갖는 경향이 있습니다.echo또는 print(awk, C 및 기타 언어의 sed 정규 표현식 및 문자열 리터럴도 포함됩니다(다른 도구에는 약간 다른 이스케이프 시퀀스 세트가 있을 수 있음에 유의)). \033이러한 컨텍스트에서는 백슬래시 + 8진수(예:)를 사용할 수도 있습니다 .

키별로 전송되는 이스케이프 시퀀스 터미널에 대한 몇 가지 변형이 있습니다. 다행스럽게도 겹치는 부분이 거의 없습니다. 서로 다른 터미널에서 서로 다른 키를 나타내는 문자 시퀀스는 거의 없습니다. 주요 문제는 문자 127 == \1770x7f입니다. 요즘 가장 일반적 Backspace이지만 때로는 Delete.

^[OF^[[F(즉 \eOF\e[F)는 전송되는 두 개의 공통 이스케이프 시퀀스입니다 End. ^E(즉 \005)은 Emacs 키 바인딩( Ctrl+ E) 입니다 end-of-line.

터미널 에뮬레이터가 특정 키 또는 키 조합에 대해 보내는 내용을 보려면 Ctrl+를 누른 V다음 관련 키를 누르세요.문자 그대로 이스케이프 시퀀스의 첫 번째 문자를 삽입합니다. 이스케이프 시퀀스는 일반적으로 이스케이프 문자와 인쇄 가능한 문자로 구성되므로 이스케이프 시퀀스의 나머지 부분도 문자 그대로 삽입됩니다.

Terminfo 데이터베이스에는 특정 키에 대한 이스케이프 시퀀스가 ​​포함되어 있습니다. Terminfo 기능 목록은 다음에서 찾을 수 있습니다.용어 정보(5)시스템의 매뉴얼 페이지. zsh에서는 다음을 통해 데이터베이스의 값을 나열할 수 있습니다.terminfo연관 배열. 이스케이프 시퀀스가 ​​포함된 값을 인쇄할 때 이러한 이스케이프 시퀀스는 표시될 때 터미널에서도 해석되므로 인용 형식으로 인쇄된다는 점에 유의하세요.

% print -lr ${(q)terminfo[kend]}
$'\033'OF

바라보다키보드 입력과 텍스트 출력은 어떻게 작동합니까?키를 눌렀을 때 어떤 일이 발생하는지 더 완벽하게 이해해 보세요. zsh의 키 바인딩에 대해 알 필요가 없습니다.

답변2

    BEGINNER'S GUIDE TO ZSH KEYBOARD ASSIGNMENTS, AKA 'KEYBOARD BINDINGS'.

(의견, 개선 및 심각한 비난을 환영합니다: eastlink dot ca의 rayandrews)

"101" PC의 키보드에서 "사용 가능한" 키 조합은 Debian Linux의 xfce4에서 "zsh"를 실행하는 PC에 연결됩니다("책임"이 누구인지는 모르겠습니다). 표시된 가장 단순한 아바타를 제외하고 "회색" 키 내에서 중복 코드를 생성하는 모든 조합이 제거되었습니다. 일부 회색 키/조합에는 "Enter" == "^M"과 같은 "^letter" 중복 항목이 있지만 아직 제거되지 않았습니다. 다른 활성 조합은 예를 들어 콘솔에서도 시스템에서 사용되었으므로 더 이상 "사용 가능"하지 않습니다. "Alt+Function" 키는 터미널을 전환합니다. "Meta" 키가 더 많은 작업을 수행할 수도 있지만 101KB입니다. 흥미롭게도 Ctrl+Function과 같이 DOS에는 더 많은 조합이 있습니다. 이 조합은 모두 DOS에서 사용할 수 있지만 Linux에서는 사용할 수 없는 것 같습니다. 삼중 키 조합(예: "Ctrl+Alt+Up")은 회색 키에 고유 코드를 생성하지 않지만 흰색 키에는 코드를 생성합니다. 흥미로운 예외: "^[[22" "^[[27" "^[[30"이 누락되었습니다. 왜 이 숫자를 건너뛰는지 궁금할 것입니다. (즉, "F11"은 "^[[23"이 아니라 "^[[22"가 될 것으로 예상할 수 있습니다.)

표시되는 키 코드는 CLI의 "showkeys -a" 또는 "bindkey" 출력과 동일합니다. 그러나 어떤 이유로 스크립트에서 "bindkey"를 사용하는 경우(".zshrc"에서와 같이) "^["는 "\e"로 바뀌어야 하므로 CLI에서는 다음과 같습니다.

바인드키 -s '^[[[A' '내 명령\Cm'

..."F1"을 "my-command"에 바인딩하고 실행합니다("\Cm"은 "Enter" 키를 시뮬레이션합니다).

".zshrc"에서:

findkey -s '\e[25' '내 명령 1;내 명령 2 \Cm'

..."Shift-F1"을 "my-command1"에 바인딩한 다음 "my-command2"에 바인딩하고 실행합니다.

"회색" 키 조합만 사용하세요:

키[F1] = '^[[[A' 키[F2] = '^[[[B' 키[F3] = '^[[[C' 키[F4] = '^[[[D' 키[F5] = '^[[[E' 키[F6] = '^[[17~' 키[F7] = '^[[18~' 키[F8] = '^[[19~' 키[F9] = '^[[20~' 키[F10] = '^[[21~' 키[F11] = '^[[23~' 키[F12] = '^[[24~'

키 [Shift-F1] = '^[[25~' 키 [Shift-F2] = '^[[26~' 키 [Shift-F3] = '^[[28~' 키 [Shift-F4] = '^[[29~' 키 [Shift-F5] = '^[[31~' 키 [Shift-F6] = '^[[32~' 키 [Shift-F7] = '^[[33~' 키 [Shift-F8] = '^[[34~'

키[삽입] = '^[[2~' 키[삭제] = '^[[3~' 키[홈] = '^[[1~' 키[끝] = '^[[4~' 키[이전 페이지] = '^[[5~' 키[PageDown] = '^[[6~' 키[위] = '^[[A' 키[아래로] = '^[[B' 키[오른쪽] = '^[[C' 키[왼쪽] = '^[[D'

키[Bksp] = '^?' 키[Bksp-Alt] = '^[^?' key[Bksp-Ctrl] = '^H' 콘솔에만 해당.

키[Esc] = '^[' 키[Esc-Alt] = '^[^['

키[Enter] = '^M' 키[Enter-Alt] = '^[^M'

key[Tab] = '^I' 또는 '\t' 고유한 형식입니다! 바인딩할 수 있지만 "showkey -a"는 사용할 수 없습니다. 키[Tab-Alt] = '^[\t'

흰색 키 조합을 사용하세요.

비정상적인 상황: xterm에서는 'Ctrl+`' == 'Ctrl+2' 및 'Ctrl+1' == '1'입니다. 일부 "Ctrl+Number" 조합은 콘솔에서 작동하지 않지만 xterm에서는 코드를 반환합니다. OTOH Ctrl+Bksp는 콘솔에서 "^H"를 반환하지만 xterm의 일반 "Bksp"와 동일합니다. 그러나 의심할 여지 없이 이러한 결함에는 더 많은 결함이 있으며 주요 결함은 다음과 같습니다.

흰색 키 코드는 이해하기 쉽습니다. 각각의 "일반" 인쇄된 키에는 6가지 형태가 있습니다.

A = 'a' (말도 안되는 소리) A-Shift = 'A'(누가 짐작할 수 있겠습니까?) A-Alt = '^[a'
A-Ctrl = '^A' A-Alt-Ctrl = '^[^A' A-Alt-Shift = '^[A' A-Ctrl-Shift = '^A'(Shift는 효과가 없음)

잊지 마요:

/-Shift-Ctrl = Bksp = '^?' [-Ctrl = Esc = '^[' M-Ctrl = Enter = '^M'

게다가, 키바인딩을 "스택"할 수도 있습니다:

binkey -s '^Xm' "내 여주인의 눈은 태양과 전혀 다릅니다."

..."Ctrl-X" 다음에 "m"을 입력하여 아름다운 시를 만들어 보세요.

우리는 미친 듯이 추파를 던질 수 있습니다:

binkey -s '^Pletmenot' '하지 말자, 성실한 결혼'

...하지만 "수정자" 문자로 그런 ​​작업을 시작해야 합니다. 한번 시도해 보세요. 키보드 단축키가 마음에 든다면 정말 시내로 나갈 수 있습니다.

질문:

"Ctrl-Bksp"가 콘솔에 있는 것과 xterm에 있는 것이 다르다고 어디에 기록되어 있습니까?

이러한 작업을 변경할 수 있나요?

이 모든 것을 누가 디자인했으며 당시 그들은 무엇을 생각하고 있었습니까?

터미널을 변경하기 위해 "Alt-Function"을 사용하는 이유존재하다터미널이지만 "Alt-Ctrl-Function"을 통해 변경할 수 있습니다.도착하다GUI용 터미널?

"Alt-Ctrl-Delete"는 어떻게/어디에서 정의됩니까?

enter code here

답변3

Unix/Linux에는 사용할 수 있는 도구가 많기 때문에 다소 혼란스럽고 부담스러울 수 있습니다. 우선 다음을 사용합니다 showkey.

$ showkey -a

Press any keys - Ctrl-D will terminate this program

a    97 0141 0x61
b    98 0142 0x62
c    99 0143 0x63
d   100 0144 0x64
e   101 0145 0x65
f   102 0146 0x66
g   103 0147 0x67

매뉴얼 페이지에서 -a:

   When  in  `ascii' dump mode, showkey prints to the standard output the 
   decimal, octal, and hexadecimal value(s) of the key pressed,
   according to he present keymap.

다음을 사용하여 일부 매핑을 얻을 수 있습니다 xmodmap.

$ xmodmap
xmodmap:  up to 4 keys per modifier, (keycodes in parentheses):

shift       Shift_L (0x32),  Shift_R (0x3e)
lock        Caps_Lock (0x42)
control     Control_L (0x25),  Control_R (0x69)
mod1        Alt_L (0x40),  Alt_R (0x6c),  Meta_L (0xcd)
mod2        Num_Lock (0x4d)
mod3      
mod4        Super_L (0x85),  Super_R (0x86),  Super_L (0xce),  Hyper_L (0xcf)
mod5        ISO_Level3_Shift (0x5c),  Mode_switch (0xcb)

위의 내용은 전체 퍼즐이 아니지만 키 바인딩과 스캔 코드 간의 최종 매핑을 찾는 데 도움이 될 수 있는 몇 가지 추가 정보입니다. 자세한 내용은 이 U&L Q&A에 포함되어 있습니다.Linux의 키 매핑.

인용하다

답변4

URxvt 터미널 에뮬레이터를 사용합니다. 이러한 코드를 표시하는 유용한 키 바인딩이 있습니다: Ctrl+V. 원하는 키 시퀀스를 누른 후 입력하면 해당 코드가 인쇄됩니다. 예를 들어, 내 Ctrl+에는 코드가 있습니다 ^[Oa.

관련 정보