다양한 키 입력을 모두 변환하는 키 바인딩 테이블이 있나요? 나는 를 사용하고 있지만 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에서 말하는 것이 ^[[A
Bindkey-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, 즉 \e
0x1b \033
, ^[로 시작)로 변환됩니다. 기능 키 또는 문자 키와 수정자의 조합도 마찬가지입니다. 하지만 모든 터미널이 모든 다른 수정자 조합에 대해 서로 다른 시퀀스를 보내는 것은 아닙니다. 일부 키는 제어 문자로 인코딩됩니다(예: Tab→ Ctrl-I == \t
) \011
.
보시다시피 제어 문자를 설명하는 방법에는 여러 가지가 있습니다. 일부는 기존 기능(예: 탭, 줄 바꿈)에 해당하는 이름을 가지고 있으며 $'…'
내부적으로나 매개변수에서 사용할 수 있는 백슬래시+문자 조합을 갖는 경향이 있습니다.echo
또는 print
(awk, C 및 기타 언어의 sed 정규 표현식 및 문자열 리터럴도 포함됩니다(다른 도구에는 약간 다른 이스케이프 시퀀스 세트가 있을 수 있음에 유의)). \033
이러한 컨텍스트에서는 백슬래시 + 8진수(예:)를 사용할 수도 있습니다 .
키별로 전송되는 이스케이프 시퀀스 터미널에 대한 몇 가지 변형이 있습니다. 다행스럽게도 겹치는 부분이 거의 없습니다. 서로 다른 터미널에서 서로 다른 키를 나타내는 문자 시퀀스는 거의 없습니다. 주요 문제는 문자 127 == \177
0x7f입니다. 요즘 가장 일반적 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
.