답변:
터미널 구성 방법에 따라 입력 Alt+Key은 키 Esc와 Key키를 순서대로 입력하는 것과 같으 므로 ESC 문자 ( \e
또는 ^[
또는 \033
)를 누른 다음을 누를 때 전송되는 문자 또는 문자 순서를 전송합니다 Key.
키를 누른 후 Up, 대부분의 터미널 에뮬레이터 중 하나를 세 문자를 보내 \033[A
거나 \033OA
그들이 응용 프로그램 키패드 모드 여부에있어 여부에 따라.
첫 번째는 터미널로 출력 할 때 커서를 위로 이동하는 이스케이프 시퀀스에 해당합니다. 당신이 할 경우 :
printf '\nfoo\033[Abar\n\n'
당신은 한 줄 위로 bar
쓰여진 것을 볼 수 있습니다 foo
. 당신이 할 경우 :
stty -echoctl; tput rmkx; read foo
화살표 키로 커서를 움직일 수 있습니다.
응용 프로그램 이 터미널에서 해당 문자 시퀀스를 읽 zsh
거나 vi
읽을 때 , terminfo 데이터베이스 ( kcuu1
기능) 에서을 누를 때 전송 된 이스케이프 시퀀스임을 알고 있기 때문에이를 "업"조치로 해석합니다 Up.
하기 위해 Alt-Up, 어떤 형 터미널 rxvt
과 같은 그 유도체 eterm
보내기 \033
위한 이스케이프 시퀀스 뒤에 Up이다 ( \033\033[A
또는 \033\033OA
)와 같은 일부 다른 상태 xterm
또는 gnome-terminal
같은 조합 키를 사용했을 때 키의 해당 유형의 별도 이스케이프 시퀀스가 Alt, Shift, Ctrl.
그것들은 일반적으로 전송 \033[1;3A
됩니다 Alt-Up.
터미널로 전송 될 때 해당 시퀀스는 커서를 위로 이동합니다 (두 번째 매개 변수 (3)는 무시 됨). 해당 키패드 키가 없으므로 응용 프로그램 키패드 모드Alt-Up 로 들어 오거나 나가는 동일한 순서 입니다.
지금은 여부 \033\033[A
또는 \033[1;3A
많은 응용 프로그램은 그 순서가 무엇인지 모른다. terminfo 데이터베이스는 이러한 키 조합이 보내는 문자를 정의하는 기능이 없기 때문에 도움이되지 않습니다.
그들은 그 순서를 해석하기 위해 최선을 다할 것입니다. bash
예를 들어 \033[1;3
, 이스케이프 시퀀스로 해석 하고 그것에 대해 아무것도 모르고 아무것도하지 않습니다 A
. zsh
, 일치하는 알려진 문자 시퀀스가없는 것으로 확인되는 즉시 읽기를 중단합니다. 처음부터 알고있는 이스케이프 시퀀스가 없으므로 \033[1
건너 뛰고 나머지를 읽고 ;3A
라인 편집기에 삽입하십시오.
같은 많은 응용 프로그램 vi
, zsh
또는 readline
같은 기준으로 사람 gdb
또는 bash
(하지만 조심 bash
사용을의 수정 된 버전을 readline
) 당신이 문자의 순서에 대한 바인딩을 추가 할 수 있습니다.
예를 들어,에서 zsh
, 당신은 바인딩 할 수 있습니다 Alt-Up, Alt-Down같은 :
bindkey '\e[1;3A' history-beginning-search-backward
bindkey '\e[1;3B' history-beginning-search-forward
그것들은 현재 명령처럼 커서의 현재 위치까지 시작하는 명령 행을 위해 이력을 앞뒤로 검색하여 이전 명령을 기억하는 데 매우 편리합니다.
Crtl+ v를 사용 하여 키보드의 입력 코드를 반환 할 수 있습니다 . 당신은 화살표 키 위해 그렇게 할 경우, 당신은 얻을 것이다 [[D^
, [[C^
, [[A^
, 및 [[B
값을. Alt+ 화살표 키에 대한 기본 바인딩이 없으므로 수행 된 작업이 문자 코드 만 인쇄하는 것 같습니다. 로컬 버전의 readline 라이브러리 구성 파일을 작성하는 경우 Hovewer :
$ cp /etc/inputrc ~/.inputrc
그리고 라인을 추가하십시오 :
"\e[1;3C": "sometexthere"
어디 [1;3C
의 입력 코드 Alt+이 →(당신은 사용하기 전에 그것을 같은 방식으로 얻을 수 Crtl+ v단축키) 및 터미널 다시 시작 Crtl+ →바로 가기 당신이 "sometexthere"및 기타 텍스트 반환 Alt문자를 반환 중지됩니다 + 화살표 바로 가기를.
대신 텍스트 당신은에서 바인딩 명령을 전달할 수 있습니다 http://www.gnu.org/software/bash/manual/html_node/Bindable-Readline-Commands.html#Bindable-Readline-Commands 같은
"\e[1;3C": unix-line-discard
Crtl+ u(줄 삭제) 와 같은 효과를 갖습니다 .
자세한 정보는 여기 : http://cnswww.cns.cwru.edu/php/chet/readline/readline.html
이 Alt키는 종종 메타 수정 자로 사용됩니다 . 커서 및 기능 키는 여러 문자를 보낼 수 있으므로 전송되는 문자를 변경할 수 있으므로 특수 키 라고합니다 .
예를 들어 일부 사용자 는 키 bash
를 누르면 Alt이스케이프 문자가 붙은 키가 전송 될 것으로 예상합니다 . 문서화 된 "메타"기능 (참조 terminfo(5)
)은 여덟 번째 비트를 처리합니다.
터미널에 전송되는 문자의 8 비트를 설정하는 Shift 키 역할을하는 "메타 키"가있는 경우이 사실은로 표시 될 수 있습니다
km
. 그렇지 않으면 소프트웨어는 8 번째 비트가 패리티라고 가정하고 일반적으로 지워집니다. 문자열이 켜있는 경우 "메타 모드" 와 오프, 그들은으로 주어질 수있다smm
와rmm
.
bash
이것에 대해서도 알고 있지만 ( ncurses FAQ 참조 )이 기능에 관심이있는 사용자는 거의 없습니다. 그럼에도 불구 Alt하고 메타 모드가 꺼져 있어도 "메타"라고 하는 데 익숙합니다 . rxvt와 xterm은 둘 다 1990 년대 초부터이 기능을 가지고 있습니다.
다른 사용자 ( 패치 # 94, 1999xterm
의 기능을 도입 한 이후 )는 특수 키가 전송하는 문자 시퀀스에서 수정 자 정보가 매개 변수로 인코딩 될 것으로 예상 할 수 있습니다. XTerm의 문서는 이러한 수정 된 키를 "PC 스타일" 기능 키로 언급하여 "VT220 스타일" (수정자가없는) 과 구별합니다 . 수정되지 않은 커서 키를 보낼 수 있지만,하는 것도 합법적 매개 변수 , 예를 들어 , 응용 프로그램이 어떤 해야 하는 다섯 번 반복으로 이해한다. 의 첫 번째 버전 의 PC-스타일의 키는 "5"나타 내기 위해 사용ESC[AESC[5Axterm
control, 이후 버전에서는 반복 횟수와 혼동되지 않도록 변경되었습니다. 그래서...
ESC[5A
응용 프로그램이 커서를 5 행 위로 이동하는 동안
ESC[1;5A
control키가 눌 렸음을 애플리케이션에 알리면서 한 행 위로 이동하도록 제안합니다 .
유용한 조합은 2004 년 부터 ncurses terminfo 데이터베이스에있었습니다 .
# 2004-07-17
# * add xterm-pc-fkeys -TD
terminfo 데이터베이스는 수정 자 인코딩 방법을 보여주는 주석과 함께 xterm + pcfkeys 의 현재 버전을 보여줍니다 .
# This fragment describes as much of XFree86 xterm's "pc-style" function
# keys as will fit into terminfo's 60 function keys.
# From ctlseqs.ms:
# Code Modifiers
# ---------------------------------
# 2 Shift
# 3 Alt
# 4 Shift + Alt
# 5 Control
# 6 Shift + Control
# 7 Alt + Control
# 8 Shift + Alt + Control
# ---------------------------------
# The meta key may also be used as a modifier in this scheme, adding another
# bit to the parameter.
Alt와 Meta는 반드시 같은 키일 필요는 없습니다. 즉 , 터미널 설명이 형성 되는 빌딩 블록 (다른 빌딩 블록으로 구성됨 xterm
)입니다. 1999 년부터 ncurses에서 제공되는 확장명을 사용하여 사용자 정의 이름을 허용합니다. termcap은 2 자 이름과 1023 바이트 설명 만 지원하므로 이러한 확장 이름을 termcap 인터페이스를 통해 사용할 수있는 이유는 없었습니다 . terminfo 인터페이스를 사용하여 응용 프로그램에서 쉽게 사용할 수 있습니다 .
이제 어려운 점이 있습니다. 응용 프로그램에서 이와 같은 키 시퀀스가 무엇을 나타내는 지 결정하는 몇 가지 방법이 있습니다.
첫 번째 프로그램은 거의 없습니다. 일부 텍스트 편집기는 두 번째 (사실, 내가 한 할 것 이를 위해 ded
에서 1980 년대 후반 ). 응용 프로그램 개발자 bash
는 대부분의 정보가 termcap 에 있다고 가정하여 세 번째 경로 를 선택했습니다 . 또는 termcap / terminfo 정보가있는 테이블을 만들고 최상의 정보를 제공 한 인터페이스를 사용하도록 선택할 수 있습니다. 실제 기능 키 할당을 제공 xterm
하는 tcap-query 기능 에 대해 이를vim
수행합니다.
bash
비교 하는 문자열은 수신하는 문자열과 일치하지 않으므로 부분적으로 일치하는 이스케이프 문자와 같이 부분적으로 일치하도록 혼동 될 수 있습니다.
더 읽을 거리 :