예를 들면 다음과 같습니다.
"\e[1;5C"
"\e[Z"
"\e-1\C-i"
난 단지 같은 비트와 조각, 알고 \e
탈출과 스탠드 C-
를 들어 Ctrl,하지만이 숫자 (무엇 1
)와 문자 ( Z
)? 무엇이다 ;
, [
및 -
표지판은?
시행 착오가 있거나 bash 키 코드의 전체 목록과 구문에 대한 설명이 있습니까?
예를 들면 다음과 같습니다.
"\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
또는 \e
0x1b, 033 8 진수) 로 시작하는 일련의 문자를 보내지 만 정확한 순서는 터미널마다 다릅니다.
터미널에 키 또는 키 조합이 전송하는 것을 찾는 가장 좋은 방법은 실행 sed -n l
하고 Enter키보드에서 입력하는 것 입니다. 그러면 다음과 같은 것이 보일 것입니다 :
$ sed -n l
^[[1;5A
\033[1;5A$
첫 번째 줄은 echo
터미널 장치가 수행 한 로컬 터미널에 의해 발생 합니다 (터미널 장치 설정이 영향을 미치기 때문에 신뢰할 수 없음).
두 번째 줄은로 출력됩니다 sed
. 는 $
그 줄의 끝이 어디를 보여주기 위해 단지이다, 포함 할 수 없습니다.
그 수단 위 그 Ctrl-Up(I를 누르면 한 함) 6 개 문자를 보내 ESC
, [
, 1
, ;
, 5
및 A
(0x1b 0x5b 0x31로 회신 0x3b 0x35 0x41을)
terminfo
데이터베이스 (기반으로 단말 번호에 대한 공통 키의 시퀀스 번호의 개수를 기록 $TERM
값).
예를 들어 :
TERM=rxvt tput kdch1 | sed -n l
키 rxvt
를 누르면 어떤 이스케이프 시퀀스가 전송되는지 알려줍니다 Delete.
현재 터미널에서 주어진 순서에 해당하는 키를 찾을 수 있습니다 infocmp
(여기서는 ncurses
infocmp 가정 ).
$ infocmp -L1 | grep -F '=\E[Z'
back_tab=\E[Z,
key_btab=\E[Z,
키 조합 Ctrl-Up은 terminfo
데이터베이스에 해당하는 항목이 없으므로 전송하는 내용을 찾으려면 해당 터미널의 소스 또는 문서를 읽거나 sed -n l
위에서 설명한 방법으로 시도하십시오 .
\e-1\C-i
이전 버전과 탭입니다 때문에 control
및 i
탭을 삽입 한 escape
다음 -1
뒤로 한 번을 할 수있는 bash는 말한다 (난이 희번덕 거리는 약 몇 가지 물건을 발견 digit-arguments
).
$ sed -n 1
sed: -e expression #1, char 1: missing command
tput smkx
터미널이 \e[OD
( kcub1
) 및 ( ) 이후 tput rmkx
에 \e[D
( cub1
, 커서를 왼쪽으로 이동하는 시퀀스와 동일한 코드를 보내서 해당 키 의 에코 가 커서를 이동한다는 stty -echoctl; tput rmkx; sleep inf
것을 알게 될 것 입니다. 키패드 모드 가 아닌 경우 화살표 키는 커서를 움직 입니다.
gnu readline 라이브러리를 통해 제공됩니다. 설명을 찾으려면 man 3 readline 을 살펴보십시오 .
escspe 코드 liks의 \[A
의미에 대한 정보가 필요한 것 같습니다 . 이 정보는 wikipedia ANSI esacape 코드 기사 에서 찾을 수 있습니다 .
\[A
테이블 "CSI 코드"행 내에서입니다 : "CSI N A가"
[Z
, [1;5C
또는를 -1
?
이 코드는 동일한 소스에서 온 것입니까? 마지막은 GNU readline 바인딩처럼 보입니다. 그것이 사용자가 배쉬에 보내는 것입니다 (러쉬의 답변 참조). 그러나 처음 두 개는 터미널 제어 시퀀스 와 비슷해 보입니다 (첫 번째는 잘못된 형식이지만). 이것이 bash 또는 다른 프로그램이 커서 이동, 텍스트 색상 등을 제어하기 위해 터미널 에뮬레이터로 다시 보내는 것입니다.
키 또는 키 콤보로 생성 된 이스케이프 시퀀스를 확인하는 가장 쉬운 방법 은 터미널에서 Ctrl+ 를 누른 v다음 알고 싶은 키 / 콤보를 누르는 것입니다.
당신은 같은 순서를 얻을 것이다 ^[Oa
당신은 번역해야합니다 ^[
으로 \e
하거나 \033
또는 \x1b
이스케이프 문자 또는 어떤 다른 표현하여 키 바인딩 시스템이 기대합니다.
Emacs 함수로 시작했으며 quoted-insert
Bash 및 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.
bind -p
입니다.