bash에서 단축키를 다시 매핑하는 터미널 키 코드 목록은 어디에서 찾을 수 있습니까?


42

예를 들면 다음과 같습니다.

"\e[1;5C"
"\e[Z"
"\e-1\C-i"

난 단지 같은 비트와 조각, 알고 \e탈출과 스탠드 C-를 들어 Ctrl,하지만이 숫자 (무엇 1)와 문자 ( Z)? 무엇이다 ;, [-표지판은?

시행 착오가 있거나 bash 키 코드의 전체 목록과 구문에 대한 설명이 있습니까?


2
쉘 의 실제 readline 바인딩 을 나열하는 추가 팁 은 bind -p입니다.

1
이러한 코드는 대부분 터미널에서 해석됩니다. 큰 목록을 보려면 Wikipedia의 ANSI 이스케이프 코드 에 대해 읽으십시오 .
chepner

의 stty는 -a 표시 터미널의 라인 설정
버그

답변:


52

주어진 키를 누를 때 터미널이 전송하는 일련의 문자입니다. bash 또는 readline 자체와는 아무런 관련이 없지만 readline주어진 키를 눌렀을 때 무언가를 수행 하도록 구성하려는 경우 주어진 키 또는 키 조합이 보내는 문자 시퀀스를 알고 싶을 것입니다.

A키 를 누르면 일반적으로 터미널이 a(0x61) 문자를 보냅니다 . <Ctrl-I>또는 을 누르면 <Tab>일반적 ^I으로 TAB또는 \t(0x9) 로 알려진 문자를 보냅니다 . 대부분의 기능 및 탐색 키는 일반적으로 ^[(control-[) ( ESC또는 \e0x1b, 033 8 진수) 로 시작하는 일련의 문자를 보내지 만 정확한 순서는 터미널마다 다릅니다.

터미널에 키 또는 키 조합이 전송하는 것을 찾는 가장 좋은 방법은 실행 sed -n l하고 Enter키보드에서 입력하는 것 입니다. 그러면 다음과 같은 것이 보일 것입니다 :

$ sed -n l
^[[1;5A
\033[1;5A$

첫 번째 줄은 echo터미널 장치가 수행 한 로컬 터미널에 의해 발생 합니다 (터미널 장치 설정이 영향을 미치기 때문에 신뢰할 수 없음).

두 번째 줄은로 출력됩니다 sed. 는 $그 줄의 끝이 어디를 보여주기 위해 단지이다, 포함 할 수 없습니다.

그 수단 위 그 Ctrl-Up(I를 누르면 한 함) 6 개 문자를 보내 ESC, [, 1, ;, 5A(0x1b 0x5b 0x31로 회신 0x3b 0x35 0x41을)

terminfo데이터베이스 (기반으로 단말 번호에 대한 공통 키의 시퀀스 번호의 개수를 기록 $TERM값).

예를 들어 :

TERM=rxvt tput kdch1 | sed -n l

rxvt를 누르면 어떤 이스케이프 시퀀스가 ​​전송되는지 알려줍니다 Delete.

현재 터미널에서 주어진 순서에 해당하는 키를 찾을 수 있습니다 infocmp(여기서는 ncursesinfocmp 가정 ).

$ infocmp -L1 | grep -F '=\E[Z'
    back_tab=\E[Z,
    key_btab=\E[Z,

키 조합 Ctrl-Upterminfo데이터베이스에 해당하는 항목이 없으므로 전송하는 내용을 찾으려면 해당 터미널의 소스 또는 문서를 읽거나 sed -n l위에서 설명한 방법으로 시도하십시오 .


이것은 훌륭한 설명입니다, 감사합니다! 이제 모든 장소에 속하는 \e-1\C-i이전 버전과 탭입니다 때문에 controli탭을 삽입 한 escape다음 -1뒤로 한 번을 할 수있는 bash는 말한다 (난이 희번덕 거리는 약 몇 가지 물건을 발견 digit-arguments).
bug

$ sed -n 1 sed: -e expression #1, char 1: missing command
cnvzmxcvmcx

3
@vib. 소문자 L은 숫자 1이 아닙니다
Stéphane Chazelas

1
@ user367890은 키패드 모드 입니다. 아마도 tput smkx터미널이 \e[OD( kcub1) 및 ( ) 이후 tput rmkx\e[D( cub1, 커서를 왼쪽으로 이동하는 시퀀스와 동일한 코드를 보내서 해당 키 의 에코 가 커서를 이동한다는 stty -echoctl; tput rmkx; sleep inf것을 알게 될 것 입니다. 키패드 모드 가 아닌 경우 화살표 키는 커서를 움직 입니다.
Stéphane Chazelas

1
@ user367890, Thomas (ncurses 및 xterm 관리자)가 링크에서 답변에서 말한 것에서 그렇습니다. 작동해야합니다. 키패드 모드 또는 응용 프로그램 모드 는 동일한 사항을 참조하므로 (단, Thomas에 따르면) smkx가 활성화 된 경우 terminfo 데이터베이스의 주요 사양이 사용됩니다.
Stéphane Chazelas

4

gnu readline 라이브러리를 통해 제공됩니다. 설명을 찾으려면 man 3 readline 을 살펴보십시오 .

escspe 코드 liks의 \[A의미에 대한 정보가 필요한 것 같습니다 . 이 정보는 wikipedia ANSI esacape 코드 기사 에서 찾을 수 있습니다 .


이것은 내 예를 설명하지 않습니다.
bug

작은 오해 인 것 같습니다. 답변 업데이트를 확인하십시오.
돌진

이 기사에는 특정 예제에 대한 정보가 없습니다. "[A"에 대한 페이지 검색에서 아무 것도 반환하지 않았습니다.
bug

1
@bug 기사를주의 깊게 읽으십시오. \[A테이블 "CSI 코드"행 내에서입니다 : "CSI N A가"
돌진

덕분에 돌진하지만, 어디에서 설명을 찾을 수 있습니까 [Z, [1;5C또는를 -1?
bug

3

이 코드는 동일한 소스에서 온 것입니까? 마지막은 GNU readline 바인딩처럼 보입니다. 그것이 사용자가 배쉬에 보내는 것입니다 (러쉬의 답변 참조). 그러나 처음 두 개는 터미널 제어 시퀀스 와 비슷해 보입니다 (첫 번째는 잘못된 형식이지만). 이것이 bash 또는 다른 프로그램이 커서 이동, 텍스트 색상 등을 제어하기 위해 터미널 에뮬레이터로 다시 보내는 것입니다.


"\ e [1; 5C"는 ctrl-arrow 앞으로 단어 이동에 사용되고 "\ e [Z"및 "\ e-1 \ Ci"는 다른 자습서에서 메뉴 완성-뒤로 사용됩니다. 그것들은 모두 .inputrc 파일 내에서 사용되었습니다.
bug

만약 그것들이 readline에 의해 해석된다면, 이들 제어 시퀀스가 ​​기능 또는 화살표 키로 ctrl, alt, 및 / 또는 shift의 조합에 바인딩되는 터미널 에뮬레이터가 있어야합니다. (어느 쪽인지 모르겠습니다.)
Uwe

0

키 또는 키 콤보로 생성 된 이스케이프 시퀀스를 확인하는 가장 쉬운 방법 은 터미널에서 Ctrl+ 를 누른 v다음 알고 싶은 키 / 콤보를 누르는 것입니다.

당신은 같은 순서를 얻을 것이다 ^[Oa당신은 번역해야합니다 ^[으로 \e하거나 \033또는 \x1b이스케이프 문자 또는 어떤 다른 표현하여 키 바인딩 시스템이 기대합니다.

Emacs 함수로 시작했으며 quoted-insertBash 및 Zsh의 기본 키 바인드가 Emacs를 모방했기 때문에 복사했습니다.

Bash는 GNU Readline 입력 라이브러리를 통해 파이썬의 import rlcompleter향상 과 같은 다른 것들도 사용합니다.

다음은 Readline 매뉴얼 의 설명입니다 .

quoted-insert( C-q또는 C-v)

다음 문자를 줄 그대로 입력하십시오. C-q예를 들어와 같은 키 시퀀스를 삽입하는 방법 입니다.

GNU Readline을 기반으로 하는 모든 작업에서 작동 합니다.

ZLE라는 자체 대안을 사용하는 Zsh의 C-q경우 Vi 모드에서 아이러니하게도 원래 Emacs 바인딩 만 사용하지만 C-v여전히 기본 Emacs와 같은 입력 모드에서 작동합니다. ( 또는 zshall` 맨 페이지 quoted-insert에서 검색 하면 zshzle두 번째 결과 쌍에 기본 키 바인드가 나열되어야합니다.)

니모닉, 나는 생각 조언 Ctrl+를 v그것을 요구로 V erbatim.

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