키 바인딩 테이블?


18

키 누르기를 참조하는 모든 다양한 방법을 번역하는 키 바인딩 테이블이 있습니까? 나는 사용하고있다zsh 하고 있지만 그러한 테이블이 있다면 어떤 쉘에서도 작동한다고 가정합니다.

내가 묻는 이유는 키 바인딩을 할당하고 키 참조를 알 수있는 방법이 없기 때문입니다 (이미 정의 된 키를 훔치지 않는 한).

예를 들어 'zbindkey'에는 다음과 같은 것이 있습니다.

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

... "kend"는 이것이 End키 를 의미한다는 것을 추측 할 수 있습니다 .

교차 확인으로 bindkey다음 줄이 표시됩니다.

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

... 그래서 나는 그 라인 중 하나가 End열쇠를 참조한다고 믿습니다 . 어느 것?

"bindkey"파일에도 있습니다.

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

이제 그것이 그것이 Up Arrow핵심 이라는 것을 알게 되었지만, 내가 몰랐는지 어떻게 알 수 있습니까?

$ bindkey (at CLI)

... 같은 키에 대해 다른 언어를 제공합니다.

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

...하지만 적어도 지금 ^[[A은 bindkey-at-CLI speak \e[A에서 bindkey-in-zbindkey speak에서 와 동일 하다는 것을 알고 있습니다. 쉽습니다. DOS에서 옛날에,이 Up Arrow 이었다 0;72당신은 모든 법적 키의 스캔 코드를 찾을 수있는 오직 하나 개의 언어가 있었다 -.

테이블이 있습니까? 또는 키 입력을 선택하고 terminfo[]"bindkey-at-CLI"의 "bindkey-in-zbindkey"... 및 / 또는 다른 언어로 키 입력을 선택할 수있는 다른 방법 있을까요?

다시 한 번, DOS에는 scancode프로그램 이있었습니다 . 키 입력을 입력하면 스캔 코드가 나타납니다. 죄악이 쉬웠습니다.


대답에서 나는 모든 가능한 바인딩 테이블을 인쇄 할 수있는 방법이 없다고 생각합니다. 어쨌든 '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

... 그러면 행복합니다.


3
Ctrl 키 + V (또는 무엇이든 stty -a말한다 lnext다음의 핵심입니다).
Mikel

답변:


16

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

보시다시피 제어 문자를 설명하는 여러 가지 방법이 있습니다. 일부는 전통적인 기능 (예 : 탭, 줄 바꿈)에 해당하는 이름을 가지고 있습니다. 그것들은 ( 또는 sed 정규 표현식과 awk, C 및 다른 언어의 문자열 리터럴뿐만 아니라 또는 내부 $'…'또는 인수에 사용할 수있는 백 슬래시 + 문자 조합을 갖는 경향이 있습니다 (도구마다 약간 다른 세트가있을 수 있음에 유의하십시오) 이스케이프 시퀀스)). 이러한 상황에서도 백 슬래시 + 옥탈 (예 :)을 사용할 수 있습니다 .echoprint\033

각 키에 대해 이스케이프 시퀀스 터미널이 전송하는 방식이 약간 다릅니다. 다행히도 겹치는 부분이 거의 없습니다. 터미널마다 다른 키를 의미하는 문자 시퀀스가 ​​거의 없습니다. 주된 문제는 문자 127 = \177= 0x7f인데, Backspace요즘 가장 자주 쓰이지 만 때로는 그렇습니다 Delete.

^[OF그리고 ^[[F(즉 \eOFand \e[F)는에 의해 전송 된 두 개의 일반적인 이스케이프 시퀀스 End입니다. ^E( \005)는에 대한 Emacs 키 바인딩 ( Ctrl+ E)입니다 end-of-line.

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

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

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

키보드 입력 및 텍스트 출력어떻게 작동합니까?를 참조하십시오 . 키를 누를 때 발생하는 상황에 대한보다 완전한 개요 zsh의 키 바인딩을 이해할 필요는 없습니다.


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

(의견, 개선, 쓴 비난 환영 : 이스트 링크 닷 ca의 rayandrews)

데비안 리눅스의 xfce4에서 'zsh'를 실행하는 PC에 연결된 '101'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에서

bindkey -s '^ [[[A' '내 명령 \ Cm'

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

'.zshrc'에서 :

bindkey -s '\ e [25' 'my-command1; 내 command2 \ 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 ~'

[ Insert ] = '^ [[2 ~' [ Delete ] = '^ [[3 ~' [ Home ] = '^ [[1 ~' [ End ] = '^ [[4 ~' [ PageUp ] = '^ [[5 ~' [ PageDown ] = '^ [[6 ~' [ Up ] = '^ [[A' [ Down ] = '^ [[B' [ Right ] = '^[[C' key[Left] = '^[[D'

key[Bksp] = '^?' key[Bksp-Alt] = '^[^?' key[Bksp-Ctrl] = '^H' console only.

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

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

key[Tab] = '^I' or '\t' unique form! can be bound, but does not 'showkey -a'. key[Tab-Alt] = '^[\t'

COMBINATIONS USING THE WHITE KEYS:

Anomalies: 'Ctrl+`' == 'Ctrl+2', and 'Ctrl+1' == '1' in xterm. Several 'Ctrl+number' combinations are void at console, but return codes in xterm. OTOH Ctrl+Bksp returns '^H' at console, but is identical to plain 'Bksp' in xterm. There are no doubt more of these little glitches however, in the main:

White key codes are easy to undertand, each of these 'normal' printing keys has six forms:

A = 'a' (duhhh) A-Shift = 'A' (who would have guessed?) A-Alt = '^[a'
A-Ctrl = '^A' A-Alt-Ctrl = '^[^A' A-Alt-Shift = '^[A' A-Ctrl-Shift = '^A' (Shift has no effect)

Don't forget that:

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

And, we can 'stack' keybindings:

bindkey -s '^Xm' "My mistress\' eyes are nothing like the sun."

... Bind 'Ctrl-X' followed by 'm' to a nice line of poetry.

And we can flirt with madness:

bindkey -s '^Pletmenot' 'Let me not, to the marriage of true minds'

... but you hafta start something like that with a 'modifier' character. Try it, if you like keyboard shortcuts, you can really go to town.

QUESTIONS:

Where is it written that 'Ctrl-Bksp' means one thing at console, another thing in xterm?

Are these assignments changable?

Who designed all this, and what were they thinking at the time?

Why is it 'Alt-Function' to change terminals at a terminal, but 'Alt-Ctrl-Function' to change to a terminal from GUI?

' Alt - Ctrl - Delete ' 는 어떻게 / 어디에 정의되어 있습니까?

enter code here

나는 거의 이메일을 보내려고합니다 ...
mikeserv

꼭 마이크를해라 : rayandrews@eastlink.ca
Ray Andrews

그것은 단지 농담이었습니다. 레이-당신은 종종 암캐, 그립, 불만을 보지 못 합니까? 나에게 이메일을 보내 ... 에 의해 온라인 주변. 나는 그것을 감사했다. 어쨌든 zsh키 주제 에 대해서는 zkbd파일에 저장된 전체 키 매핑을 가져 오는 기능 을 시도해 볼 수 있습니다. 나는 그것이 autoload가능 하다고 생각 하지만, 그렇지 않다면에서 찾으십시오 /usr/share/zsh/functions/Misc. 그건 그렇고, 다른 이상한 것들도 tetris있습니다.
mikeserv

이것이 제가 테이블을 만들 때 사용한 도구 중 하나이지만, 어떻게하면 '모든 것'을 한 번에 정리할 수 있습니까?
Ray Andrews

흥미 롭습니다. 나는 실제로 지금까지 그것을 실행 한 적이 없으며 소스 파일 만 읽습니다. 그리고 몇 달 전이었습니다. 저장 파일을 생성하기 위해 일련의 입력 테스트를 수행한다고 생각합니다. 그러나 그것은 모든 것을 파일에 저장합니다.
mikeserv

6

유닉스 / 리눅스에는 많은 도구가 있으므로 혼란스럽고 압도적입니다. 초보자는 다음을 사용합니다 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의 키 맵핑 이라는 제목의 추가 정보가 있습니다 .

참고 문헌


1
이것이 사실이지만 터미널의 키 바인딩을 이해하는 것은 중요하지 않습니다.
Gilles 'SO- 악한 중지'

@Gilles-예, 나는 단지 리드를 제공하려고 노력하고 있다고 생각했습니다. 이제 AI가 인터페이스의 작동 방식을 이해했기 때문에 감사합니다!
slm

"showkey -a"는 관련이 없습니다.
skagedal

2

주요 글리프를 '일반적인'용어로 번역하는 방법이 있다면 :

bindkey "Home" beginning-of-line

... 그럼 행복합니다.

항목 infocmp을 설명하는 유틸리티 가 있습니다 terminfo. 이것은 특히 긴 C 변수 이름-L 옵션 과 함께 유용 합니다 .

$ infocmp -cL
...
key_home= '\EOH'.
key_up= '\EOA'.
key_down= '\EOB'.
key_right= '\EOC'.
key_left= '\EOD'.
key_backspace= '^H'.
key_end= '\EOF'.
...

이것을 bindkey출력과 비교

"^[OH" beginning-of-line
"^[OA" up-line-or-history
"^[OB" down-line-or-history
"^[OC" forward-char
"^[OD" backward-char
"^H" backward-delete-char
"^[OE" end-of-line

그들이 탈출 을 위해 다른 표기법을 사용한다는 것을 알 수 있지만, 기본적으로 두 번째 열과 infocmp첫 번째 열을 연결하는 스크립트를 작성하는 것은 상대적으로 쉽습니다 bindkey.

특정 문자열이 무엇을 의미하는지 의심이가는 경우 (예 : infocmp출력 으로 인쇄 됨 ) terminfo자세한 설명이 제공되는 곳에서는 항상 수동으로 살펴볼 수 있습니다.

key_send  ->  shifted end key
key_sic   ->  shifted insert-character key
key_dc    ->  delete-character key

0

URxvt 터미널 에뮬레이터를 사용합니다. 이러한 코드를 표시하는 데 유용한 키 바인딩이 Ctrl+V있습니다.. 그것을 누르면 원하는 키 시퀀스를 입력하고 코드를 인쇄합니다. 예를 들어, my Ctrl+ 에는 code가 있습니다 ^[Oa.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.