키 바인딩 테이블? 모든 다양한 방법을

키 누르기를 참조하는 모든 다양한 방법을 번역하는 키 바인딩 테이블이 있습니까? 나는 사용하고있다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

… 그러면 행복합니다.



답변

터미널 애플리케이션과 터미널 에뮬레이터 (또는 하드웨어 터미널) 간의 인터페이스는 키가 아닌 바이트를 전송합니다. 커서 이동 키와 같은 기능 키는 이스케이프 시퀀스로 변환됩니다 (이스케이프 문자 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의 키 바인딩을 이해할 필요는 없습니다.


답변

    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


답변

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

참고 문헌


답변

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

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


답변

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


답변