이것매뉴얼 페이지for bin은 구문 설명과 연결되어 있지 않은 것 같으므로 bind -p
사람이 읽을 수 있는 형식으로 변환하려고 할 때 483에서 109까지 쓰레기를 필터링할 수 있지만 그 다음에는 73만 이해할 수 있습니다.
bind -p 2>/dev/null \
| grep -vP "digit-argument|do-lowercase-version|not bound|self-insert" \
| perl -pe 's/\\e/[alt]/g;s/\\C/[control]/g' \
| grep -P "[\-\]].\""
"[control]-g": abort
"[control]-x[control]-g": abort
"[alt][control]-g": abort
"[control]-j": accept-line
"[control]-m": accept-line
"[control]-b": backward-char
"[control]-h": backward-delete-char
"[control]-?": backward-delete-char
"[control]-x[control]-?": backward-kill-line
"[alt][control]-h": backward-kill-word
"[alt][control]-?": backward-kill-word
"[alt]b": backward-word
"[alt]<": beginning-of-history
"[control]-a": beginning-of-line
"[alt]c": capitalize-word
"[control]-]": character-search
"[alt][control]-]": character-search-backward
"[control]-l": clear-screen
"[control]-i": complete
"[alt]!": complete-command
"[alt]/": complete-filename
"[alt]@": complete-hostname
"[alt]{": complete-into-braces
"[alt]~": complete-username
"[alt]$": complete-variable
"[control]-d": delete-char
"[control]-x[control]-v": display-shell-version
"[alt]l": downcase-word
"[alt][control]-i": dynamic-complete-history
"[control]-x[control]-e": edit-and-execute-command
"[alt]>": end-of-history
"[control]-e": end-of-line
"[control]-x[control]-x": exchange-point-and-mark
"[control]-f": forward-char
"[control]-s": forward-search-history
"[alt]f": forward-word
"[alt]g": glob-complete-word
"[alt]^": history-expand-line
"[alt]#": insert-comment
"[alt]*": insert-completions
"[alt].": insert-last-argument
"[alt]_": insert-last-argument
"[control]-k": kill-line
"[alt]d": kill-word
"[control]-n": next-history
"[alt]n": non-incremental-forward-search-history
"[alt]p": non-incremental-reverse-search-history
"[control]-o": operate-and-get-next
"[alt]=": possible-completions
"[alt]?": possible-completions
"[control]-p": previous-history
"[control]-q": quoted-insert
"[control]-v": quoted-insert
"[control]-x[control]-r": re-read-init-file
"[control]-r": reverse-search-history
"[alt][control]-r": revert-line
"[alt]r": revert-line
"[control]-@": set-mark
"[alt] ": set-mark
"[alt][control]-e": shell-expand-line
"[alt]&": tilde-expand
"[control]-t": transpose-chars
"[alt]t": transpose-words
"[control]-x[control]-u": undo
"[control]-_": undo
"[control]-u": unix-line-discard
"[control]-w": unix-word-rubout
"[alt]u": upcase-word
"[control]-y": yank
"[alt].": yank-last-arg
"[alt]_": yank-last-arg
"[alt][control]-y": yank-nth-arg
"[alt]y": yank-pop
Remand 36 아직 해독하지 못했습니다.
bind -p 2>/dev/null \
| grep -vP "digit-argument|do-lowercase-version|not bound|self-insert" \
| perl -pe 's/\\e/[alt]/g;s/\\C/[control]/g' \
| grep -vP "[\-\]].\""
"[alt]OD": backward-char
"[alt][D": backward-char
"[alt][alt][D": backward-word
"[alt][1;5D": backward-word
"[alt][5D": backward-word
"[alt]OH": beginning-of-line
"[alt][1~": beginning-of-line
"[alt][H": beginning-of-line
"[alt][200~": bracketed-paste-begin
"[control]-xe": call-last-kbd-macro
"[alt][alt]": complete
"[alt][3~": delete-char
"[alt]\\": delete-horizontal-space
"[control]-x)": end-kbd-macro
"[alt]OF": end-of-line
"[alt][4~": end-of-line
"[alt][F": end-of-line
"[alt]OC": forward-char
"[alt][C": forward-char
"[alt][alt][C": forward-word
"[alt][1;5C": forward-word
"[alt][5C": forward-word
"[control]-x*": glob-expand-word
"[control]-xg": glob-list-expansions
"[alt]OB": next-history
"[alt][B": next-history
"[control]-x!": possible-command-completions
"[control]-x/": possible-filename-completions
"[control]-x@": possible-hostname-completions
"[control]-x~": possible-username-completions
"[control]-x$": possible-variable-completions
"[alt]OA": previous-history
"[alt][A": previous-history
"[alt][2~": quoted-insert
"[control]-x(": start-kbd-macro
예를 들어, 저는 이 세 가지 중 하나가 다음과 같아야 한다는 것을 알고 있습니다 alt→.
bind -p | grep forward-word | grep \\[
"\e\e[C": forward-word
"\e[1;5C": forward-word
"\e[5C": forward-word
하지만 어느 것이었는지, 나머지는 무엇인지 모르겠습니다. 일반적으로 일치하는 36개의 목록이 있습니까?
[편집 1] @undercat 님의 제보 덕분에 ^V
알 수 없는 숫자를 7로 줄일 수 있었습니다.
bind -p 2>/dev/null \
| grep -vP "digit-argument|do-lowercase-version|not bound|self-insert" \
| perl -pe 's/\\e\[A/[up]/g' \
| perl -pe 's/\\e\[B/[down]/g' \
| perl -pe 's/\\e\[C/[right]/g' \
| perl -pe 's/\\e\[D/[left]/g' \
| perl -pe 's/\\e\[1;5A/[control]-[up]/g' \
| perl -pe 's/\\e\[1;5B/[control]-[down]/g' \
| perl -pe 's/\\e\[1;5C/[control]-[right]/g' \
| perl -pe 's/\\e\[1;5D/[control]-[left]/g' \
| perl -pe 's/\\e\[2~/[control]-[insert]/g' \
| perl -pe 's/\\e\[3~/[control]-[delete]/g' \
| perl -pe 's/\\e/[alt]/g;s/\\C/[control]/g' \
| grep -P "\[[^\]]*\"" \
| perl -pe 's/\[alt\]/\\e/g;s/\[control\]/\\C/g'
"\e[5D": backward-word
"\e[1~": beginning-of-line
"\e[H": beginning-of-line
"\e[200~": bracketed-paste-begin
"\e[4~": end-of-line
"\e[F": end-of-line
"\e[5C": forward-word
[EDIT2] nosh와 printf
팁에 대해 @JdeBP에게 감사드립니다. 하지만 decode-ecma48(nosh-terminal-management_1.39_amd64의) 출력도 해석하기가 어렵습니다.
... \
| perl -pe 's/:.*//g;s/"//g;s/^/\\/g' \
| xargs -I {} printf '{}' \
| ./console-decode-ecma48
CUB 5
DEC FIND
CUP 0
DEC FNK 200;1
DEC SELECT
CPL 1
CUF 5
JdeBP 또는 다른 사람들은 이러한 오래된 약어를 완전한 현대 약어로 번역할 수 있습니다(실시예 1,실시예 2, 그리고 고대예) 키(최신 키보드에 매핑되는 경우)?
답변1
키 시퀀스에 대한 많은 정보는 매뉴얼 페이지에서 얻을 수 있습니다 console_codes
. 예를 들어 \e[1;5C
다음과 같습니다.
ECMA-48 CSI 시퀀스
CSI(또는 ESC [) 뒤에는 세미콜론으로 구분된 십진수인 최대 NPAR(16)까지 일련의 매개변수가 옵니다. (...) CSI 시퀀스의 동작은 최종 문자에 따라 결정됩니다.
이는 첫 번째 숫자가 1
매개변수이자 C
연산임을 알려줍니다. 더 자세히 살펴보면 작업을 성공적으로 찾을 수 있습니다.
C CUF 지정된 열 수만큼 오른쪽으로 커서를 이동합니다.
이는 시퀀스가 커서를 한 기호 오른쪽으로 이동하는 키를 설명한다는 것을 의미합니다. 그것이 바로 →키입니다!
여기서 문서화되지 않은(?) 접두사는 5
제어 키를 나타냅니다. 그것은에서 언급되었다엘, 추측하는 것이 더 쉬울 것이라고 생각하지만 (하지만 확실히 쉽지는 않습니다!)
이러한 이스케이프 코드를 사람이 읽을 수 있는 형식으로 변환하는 쉬운 방법은 모르지만 반대 방향으로의 변환은 간단합니다. C-vBash를 누르면 키 조합과 해당 제어 순서가 화면에 표시됩니다. 기호 형태로, 예를 들어 Ctrl+가 v생성 Ctrl→됩니다 ^[[1;5C
.
답변2
console-decode-ecma48이 작동하지 않는 것 같습니다.
질문에 주어진 결과로부터는 분명합니다.했다일하다. 작동하지 않는 것은 echo
먼저 제어 시퀀스를 생성하지 않고 잘못 호출하는 명령입니다. 표시된 디코딩된 출력은 echo
명령 입니다.실제로 방출.
%에코 -n '\e[1;5D' \e[1;5D%
console-decode-ecma48
디코딩실제인코딩된 표현이 아닌 터미널 입력 및 출력을 위한 ECMA-48 제어 시퀀스입니다. 따라서 실제 ECMA-48 제어 시퀀스를 제공해야 합니다.
이를 수행 하는 방법은 여러 가지가 있지만 echo
발생하는 상황은 echo
셸마다 다르며 더 좋은 방법은 printf
.
%printf '\e[1;5D' | '\e[1;5D' |콘솔 디코딩 ecma48--input 컨트롤+컵 1 %
그러나 이것은 이상적이지 않습니다. 왜냐하면 GNU Readline에서 사용하는 인코딩은 특별하고 또는 / 인코딩에 사용되는 printf
and (때때로) 이스케이프 시퀀스 와 같은 다른 것과 정확히 공유되지 않기 때문입니다.echo
vis
unvis
printf
남아 있는 많은 미확인 항목이 처리되지만 \C-
시퀀스는 제어 코드로 변환될 수 없습니다. 미리 양식을 이해할 수 있는 8진수 이스케이프 시퀀스로 변환해야 합니다. 그렇지 않으면 처음부터 디코딩할 올바른 ECMA-48 문자 시퀀스를 인쇄하지 않습니다.\C-c
printf
%printf '\Cg' | 인쇄 콘솔 디코딩 ecma48--input '\' '씨' '-' 'G' %printf '\007' | printf '\007' |콘솔 디코딩 ecma48--입력 벨 %
이 --input
옵션은 터미널이기 때문에 필요합니다입력하다디코딩 중입니다. ⎇ Alt키 코드를 사용하여 작업하려면 다음을 수행합니다.반품--no-7bit
(거의 모든) ECMA-48의 디코딩을 방지하는 옵션이 필요합니다 .7자리 코드ECMA-48에 따라 올바른 의미로 디코딩될 수 있는 확장 및 기타 이스케이프 시퀀스입니다.
%printf '\eD' | 인쇄 콘솔 디코딩 ecma48--input 임상 시험 %printf '\eb' |콘솔 디코딩 ecma48--input 전자기 간섭 %printf '\eD' | 인쇄 콘솔 decoder-ecma48 --input--no-7bit 위안 "D" %printf '\eb' |콘솔 디코딩-ecma48 --input--no-7bit 요소 "b" %
첫 번째 필드 시퀀스의 출력을 반복 bind -p
하고 입력하는 것 printf
(8진수 이스케이프로 미리 변환됨)은 독자의 연습 문제로 남겨져 있으며 이를 수행하는 방법을 알고 있다는 질문에서 분명합니다.\C-c
출력에 사용된 표준 약어의 의미는 매뉴얼 및 참조 표준에 설명되어 있습니다.
추가 읽기
- 왜 printf가 echo보다 나은가요?
- 조나단 데보인 폴라드(2018). "
console-decode-ecma48
". 스낵 가이드. 소프트웨어.