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

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

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

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

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



답변

주어진 키를 누를 때 터미널이 전송하는 일련의 문자입니다. 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위에서 설명한 방법으로 시도하십시오 .


답변

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

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


답변

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


답변

키 또는 키 콤보로 생성 된 이스케이프 시퀀스를 확인하는 가장 쉬운 방법 은 터미널에서 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.


답변