[unix] Alt + 화살표 키를 누르면 어떤 문자가 인쇄됩니까?

나는 누르면 AltUp, A단말기 화면에 인쇄. 눌렀을 때도 같은 일이 발생 AltDown했지만 B대신 인쇄됩니다.

내가 깨달은 다른 캐릭터들;

AltLeft= DAltRight=C

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



답변

터미널 구성 방법에 따라 입력 Alt+Key은 키 EscKey키를 순서대로 입력하는 것과 같으 므로 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 번째 비트가 패리티라고 가정하고 일반적으로 지워집니다. 문자열이 켜있는 경우 “메타 모드” 와 오프, 그들은으로 주어질 수있다 smmrmm.

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

다른 사용자 ( 패치 # 94, 1999xterm 의 기능을 도입 한 이후 )는 특수 키가 전송하는 문자 시퀀스에서 수정 자 정보가 매개 변수로 인코딩 될 것으로 예상 할 수 있습니다. XTerm의 문서는 이러한 수정 된 키를 “PC 스타일” 기능 키로 언급하여 “VT220 스타일” (수정자가없는) 과 구별합니다 . 수정되지 않은 커서 키를 보낼 수 있지만,하는 것도 합법적 매개 변수 , 예를 들어 , 응용 프로그램이 어떤 해야 하는 다섯 번 반복으로 이해한다. 의 첫 번째 버전 의 PC-스타일의 키는 “5”나타 내기 위해 사용ESC[AESC[5Axtermcontrol, 이후 버전에서는 반복 횟수와 혼동되지 않도록 변경되었습니다. 그래서…

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 인터페이스를 사용하여 응용 프로그램에서 쉽게 사용할 수 있습니다 .

이제 어려운 점이 있습니다. 응용 프로그램에서 이와 같은 키 시퀀스가 ​​무엇을 나타내는 지 결정하는 몇 가지 방법이 있습니다.

  1. 문자 순서를 완전히 분석
  2. 부분적으로 분석하고 control필요하지 않은 경우 수정자를 버리십시오.
  3. 문자 순서를 사전과 비교하여 그 의미를 결정하기를 바랍니다.

첫 번째 프로그램은 거의 없습니다. 일부 텍스트 편집기는 두 번째 (사실, 내가 한 할 것 이를 위해 ded에서 1980 년대 후반 ). 응용 프로그램 개발자 bash는 대부분의 정보가 termcap 에 있다고 가정하여 세 번째 경로 를 선택했습니다 . 또는 termcap / terminfo 정보가있는 테이블을 만들고 최상의 정보를 제공 한 인터페이스를 사용하도록 선택할 수 있습니다. 실제 기능 키 할당을 제공 xterm하는 tcap-query 기능 에 대해 이를vim 수행합니다.

bash비교 하는 문자열은 수신하는 문자열과 일치하지 않으므로 부분적으로 일치하는 이스케이프 문자와 같이 부분적으로 일치하도록 혼동 될 수 있습니다.

더 읽을 거리 :


답변