Alt+화살표 키를 눌렀을 때 인쇄되는 문자는 무엇입니까?

Alt+화살표 키를 눌렀을 때 인쇄되는 문자는 무엇입니까?

를 누르면 터미널 화면에 인쇄됩니다 AltUp. A눌렀을 때도 같은 일이 발생했지만 AltDown대신 B인쇄되었습니다.

내가 깨달은 다른 캐릭터;

AltLeft= DAltRight=C

이 명령의 목적은 무엇입니까?

답변1

터미널 구성 방법에 따라 입력은 및 키를 순서대로 Alt+Key입력하는 것과 같으 므로 ESC 문자( 또는 또는 )와 를 누를 때 전송되는 문자 또는 문자 시퀀스가 ​​전송됩니다 .EscKey\e^[\033Key

를 누르면 대부분의 터미널 에뮬레이터는 응용 프로그램 키패드 모드인지 여부에 따라 세 Up문자를 보냅니다 .\033[A\033OA

첫 번째 것은 터미널에 출력될 때 커서를 위로 이동시키는 이스케이프 시퀀스에 해당합니다. 그렇게 하는 경우:

printf '\nfoo\033[Abar\n\n'

한 행 위로 올라가면 bar쓰여진 것을 볼 수 있습니다 . foo그렇게 하는 경우:

stty -echoctl; tput rmkx; read foo

화살표 키를 누르면 커서가 움직이는 것을 볼 수 있습니다.

애플리케이션이 터미널에서 해당 문자 시퀀스를 좋아 zsh하거나 읽을 때 이를 "Up" 동작으로 해석합니다. 왜냐하면 를 누를 때 전송되는 이스케이프 시퀀스라는 것을 terminfo 데이터베이스(능력) 에서 알고 있기 때문입니다 .vikcuu1Up

이제 의 경우 send Alt-Up와 같은 일부 터미널 rxvt과 그 파생어 뒤에 이스케이프 시퀀스 (즉 또는 )가 오는 반면, 일부 터미널은 , , 와 같은 조합 키와 함께 사용할 때 해당 유형의 키에 대해 별도의 이스케이프 시퀀스를 사용합니다 .eterm\033Up\033\033[A\033\033OAxtermgnome-terminalAltShiftCtrl

\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같은 기반 애플리케이션 ( 수정된 버전을 사용 하지만 주의 )을 사용하면 임의의 문자 시퀀스에 대한 바인딩을 추가할 수 있습니다.gdbbashbashreadline

예를 들어 , 다음과 같이 zsh바인딩할 수 있습니다 .Alt-UpAlt-Down

bindkey '\e[1;3A' history-beginning-search-backward
bindkey '\e[1;3B' history-beginning-search-forward

이는 현재 명령줄처럼 시작하여 커서의 현재 위치까지 기록을 앞뒤로 검색하는 것입니다. 이는 이전 명령을 기억하는 데 매우 편리합니다.

답변2

Crtl+를 사용하여 v키보드의 입력 코드를 반환 할 수 있습니다 . 화살표 키에 대해 그렇게 하면 [[D^, [[C^, [[A^[[B값을 얻게 됩니다. +화살표 키 에 대한 기본 바인딩이 없으므로 Alt수행된 작업은 문자 코드만 인쇄하는 것 같습니다. 그러나 readline 라이브러리 구성 파일의 로컬 버전을 생성하는 경우:

$ cp /etc/inputrc ~/.inputrc

그리고 한 줄을 추가하세요:

"\e[1;3C": "sometexthere"

+ [1;3C입력 코드는 어디에 있습니까( + 단축키를 사용하기 전과 동일한 방법으로 얻을 수 있음 ). 터미널을 다시 시작하면 + 단축키는 "sometextthere" 텍스트를 반환하고 다른 +화살표 단축키는 문자 반환을 중지합니다.AltCrtlvCrtlAlt

대신 텍스트에서 바인딩 가능한 명령을 전달할 수 있습니다.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

답변3

열쇠 Alt는 종종 다음과 같은 용도로 사용됩니다.메타수정자. 커서 및 기능 키는 다음과 같습니다.특수 키여러 문자를 보낼 수 있고 전송되는 문자가 변경될 수 있기 때문입니다.

예를 들어 일부 사용자는 bash키를 누르면 Alt이스케이프 문자가 앞에 붙은 키를 보낼 것이라고 기대합니다. 문서화된 "메타" 기능(참조terminfo(5))는 여덟 번째 비트를 다룹니다.

터미널에 전송된 문자의 8번째 비트를 설정하는 Shift 키 역할을 하는 "메타 키"가 있는 경우 이 사실은 다음과 같이 표시될 수 있습니다.km. 그렇지 않으면 소프트웨어는 8번째 비트가 패리티라고 가정하고 일반적으로 삭제됩니다. 이것을 뒤집을 문자열이 존재한다면"메타 모드" 켜짐과 꺼짐은 다음과 같이 주어질 수 있습니다.smm그리고rmm.

bash그것도 알고 있어요 (참조ncurses FAQ), 하지만 이 기능에 관심이 있는 사용자는 거의 없습니다. 그럼에도 불구하고 Alt메타 모드가 꺼져 있어도 "메타"라고 부르는 데 익숙합니다 . rxvt와 xterm 모두 (적어도) 1990년대 초반부터 이 기능을 갖고 있었습니다.

다른 사용자( xterm이 기능이 도입된 이후패치 #94, 1999) 수정자 정보는 특수 키가 보내는 문자 시퀀스의 매개변수로 인코딩될 것으로 예상할 수 있습니다. XTerm의 문서에서는 이러한 수정된 키를 다음과 같이 언급했습니다."PC 스타일"기능키와 구별하기 위한 기능키"VT220 스타일"(수정자가 없었습니다). 수정되지 않은 커서 키는 을 보낼 수 ESC[A있지만매개변수, 예를 들어 ESC[5A, 애플리케이션~해야 한다다섯번 반복하면 이해가 됩니다. xterm의 첫 번째 버전PC 스타일키는 "5"를 사용하여 를 나타냈고 control이후 버전에서는 반복 횟수와의 혼동을 피하기 위해 이를 변경했습니다. 그래서...

ESC[5A

응용 프로그램이 커서를 5행 위로 이동하도록 제안하는 반면,

ESC[1;5A

한 행 위로 이동하여 애플리케이션에 control키를 눌렀음을 알려줍니다.

유용한 조합은 ncurses terminfo 데이터베이스에 있었습니다.2004년:

# 2004-07-17
#       * add xterm-pc-fkeys -TD

terminfo 데이터베이스는 현재 버전을 보여줍니다.xterm+pcf키수정자가 인코딩되는 방법을 보여주는 주석이 포함되어 있습니다.

# 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터미널 설명이 형성됩니다. ncurses에서 제공되는 확장을 사용합니다.1999년 이후사용자 정의 이름을 허용합니다. termcap은 2문자 이름과 1023바이트 설명만 지원하므로 이러한 확장 이름을 다음을 통해 사용할 이유가 없습니다.텀캡상호 작용. 이는 다음을 사용하는 애플리케이션에서 쉽게 사용할 수 있습니다.용어 정보상호 작용.

이제 어려움이 따릅니다. 애플리케이션이 이와 같은 키 시퀀스가 ​​무엇을 나타내는지 결정하는 몇 가지 방법이 있습니다.

  1. 문자 순서를 완전히 분석
  2. control부분적으로 분석하고 필요하지 않으면 수정자를 버립니다.
  3. 그런 식으로 의미를 결정하기 위해 문자 순서를 사전과 비교하면 됩니다.

첫 번째 작업을 수행하는 프로그램은 거의 없습니다. 일부 텍스트 편집자는 두 번째 작업을 수행합니다(실제로 저는 수행했습니다).이것~을 위한ded에서1980년대 후반). 와 같은 애플리케이션 개발자는 bash대부분의 정보가 다음과 같다고 가정하여 세 번째 경로를 선택했습니다.텀캡. 대안으로 그들은 termcap/terminfo 정보가 포함된 테이블을 만들고 최상의 정보를 제공하는 인터페이스를 사용하도록 선택할 수도 있었습니다. xterm이것을 위해tcap 쿼리vim실제 기능 키 할당을 제공하는 기능입니다 .

비교하는 문자열 중 bash수신한 문자열과 일치하는 문자열이 없기 때문에 혼란스러워서 부분 일치(예: 이스케이프 문자 자체)로 처리될 수 있습니다.

추가 자료:

관련 정보