키 누르기를 참조하는 모든 다양한 방법을 번역하는 키 바인딩 테이블이 있습니까? 나는 사용하고있다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 및 다른 언어의 문자열 리터럴뿐만 아니라 또는 내부 $'…'
또는 인수에 사용할 수있는 백 슬래시 + 문자 조합을 갖는 경향이 있습니다 (도구마다 약간 다른 세트가있을 수 있음에 유의하십시오) 이스케이프 시퀀스)). 이러한 상황에서도 백 슬래시 + 옥탈 (예 :)을 사용할 수 있습니다 .echo
print
\033
각 키에 대해 이스케이프 시퀀스 터미널이 전송하는 방식이 약간 다릅니다. 다행히도 겹치는 부분이 거의 없습니다. 터미널마다 다른 키를 의미하는 문자 시퀀스가 거의 없습니다. 주된 문제는 문자 127 = \177
= 0x7f인데, Backspace요즘 가장 자주 쓰이지 만 때로는 그렇습니다 Delete.
^[OF
그리고 ^[[F
(즉 \eOF
and \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
.