bash의 메타 키란 무엇입니까?


16

xmodmap에 매핑 META_L하는 데 사용하려고했지만 메타 키로 MENU허용되지 않는 것 같습니다 bash. 따라서 메타 및 슈퍼 키와 관련하여 이러한 구성 요소 (키보드, X, xterm, bash)가 각각 어떻게 관련되는지 궁금합니다. 모든 설명을 부탁드립니다.

이것을 다른 방법으로하겠습니다. 예를 들어, bash 맨 페이지에는 yank-nth-arg 함수가 바인딩되어 M-C-y있고를 누르면 작동 한다고 말합니다 Esc-Control-y. 그러나 나는 이것을 약간 성가신 것으로 생각합니다. 그렇다면 bash 가 모든 기본 바인딩에 대해 다른 키를 Meta(처럼 Menu) 수락하도록 어떻게 할 수 있습니까?


당신의되어 MENU키도 X에 의해 발견? 사용중인 창 관리자-일부는 키 재정의에 도움이 될 수 있습니다.
choroba

답변:


11

등 수정에 키보드 키의 매핑 Meta과는 ControlX 서버합니다 (GUI의 즉, 낮은 수준의 부분)에 의해 처리됩니다. 이 매핑은 이전 스타일 xmodmap명령 또는 새로운 스타일 XKB 인터페이스를 통해 또는 이러한 구성 요소 중 하나를 사용하는 GUI 구성 도구를 통해 조작 할 수 있습니다 .

기본적으로 대부분의 설정에서 Meta키는 레이블이 지정된 키 Alt입니다. 역사적으로 많은 유닉스 워크 스테이션에는 MetaPC에 키가있는 키 레이블이 붙어 있기 때문 Alt입니다. 에 대한 바인딩이 있으면 + +를 M-C-y누릅니다 .CtrlAltY

현재 바인딩이 무엇인지 확인하려면 xev터미널 에서 프로그램을 시작하십시오 . xev 창이 초점을 맞춘 상태에서 키를 누릅니다. 터미널에서 생성 된 이벤트의 대화 내용이 표시됩니다.

터미널 에뮬레이터 (또는 물리적 터미널에 해당하는 터미널 장치)와 응용 프로그램 간의 통신에는 문자가 사용됩니다. 를 누르면 A터미널에 정보“ A키, 수정 자 없음 ”이 수신 되지만 터미널에서 실행되는 응용 프로그램으로 전송되는 문자는 문자 a입니다. Up또는 과 같은 기능 키를 누르면 F1해당 문자가 없습니다. 터미널은 이스케이프 문자로 시작하는 문자 시퀀스 (바이트 27, 때로는 쓰기 \e또는 ^[)를 보냅니다 . xterm과 같은 터미널 에뮬레이터는 Meta수정자를 사용하여 키 누르기 이벤트를 수신하면 + \ea를 누를 때 해당 키를 이스케이프 문자로 변환 한 다음 키의 기본 기능 (예 : (이스케이프, 소문자 a))으로 변환합니다 .MetaA

'터미널', '쉘', 'tty'및 '콘솔'의 정확한 차이점은 무엇입니까? 유용한 배경이 될 수 있습니다.


5

키 이벤트는 X 서버에 의해 생성되고 (로 구성됨 xmodmap) X 응용 프로그램으로 전송됩니다. 윈도우 매니저가 xterm으로 보내기 전에 이것을 가로 챌 수 있습니다. XTerm은 이벤트를 일부 바이트로 변환하고 쉘 bash에서 할당 한 의사 tty에 바이트를 보냅니다.

모든 이벤트가 XTerm에 의해 바이트로 직접 변환되는 것은 아닙니다. 예를 들어 Ctrland shift키는 자체적으로 X 키보드 이벤트를 생성하지만 XTerm은 안에서 실행되는 셸 (또는 다른 응용 프로그램)에 아무것도 보내지 않습니다 . 여기에는 Meta키 자체 만 포함 되지만 키 는 포함 되지 않습니다 Menu. 그러나 Meta- 를 눌러 생성 된 이벤트 e는 XTerm.VT100.metaSendsEscape 자원 설정에 따라 XTerm이 바이트 0xE5 또는 2 바이트 시퀀스 0x1B 0x65를 보내도록합니다.


2

Bash의 메타 키는 원래 다음과 같이 정의되었습니다 ( lib/readline/ChangeLog).

Mon Jul 13 11:34:07 1992  Brian Fox  (bfox@cubit)
        * readline.c: (rl_variable_bind) New variable "meta-flag" if "on"
        means force the use of the 8th bit as Meta bit.  Internal variable
        is called meta_flag.

그것이 ncursesxterm으로 해석되는 방식 입니다. 이 기능의 옵션을 제공 단말기 (즉 측면은 널리 아니었다 단말기의 대부분은 당신이 사용하는 하드 코딩 행동 (매우 흥미로운되지 않음)가 발생됩니다.. terminfo의 매뉴얼 페이지 문서 이러한 터미널 기능 :

   has_meta_key              km     km   Has a meta key
                                         (i.e., sets 8th-bit)
   meta_off                  rmm    mo   turn off meta mode
   meta_on                   smm    mm   turn on meta mode
                                         (8th-bit on)

그리고 기능을 설명합니다 :

터미널에 전송되는 문자의 8 비트를 설정하는 Shift 키 역할을하는 "메타 키"가있는 경우이 사실은로 표시 될 수 있습니다 km. 그렇지 않으면 소프트웨어는 8 번째 비트가 패리티라고 가정하고 일반적으로 지워집니다. 문자열이 "메타 모드"와 오프를 켜있는 경우, 그들은으로 부여 할 수 smmrmm.

Alt키 에 응답하여 이스케이프 문자를 접두사로하는 다른 기능 이 일부 터미널 에뮬레이터에 통합되었습니다. Bash (실제로는 readline라이브러리) 는 2004 년부터 변경 로그에 사용 된 내용을 문서화합니다 .

lib/readline/callback.c            
        - use _rl_dispatch_callback and a chain of _rl_keyseq_contexts to
          simulate the recursion used to decode multicharacter key sequences
          (even things like ESC- as meta-prefix

메타는 특별한 경우입니다 수정 키. 마찬가지로 control, shift다른 키와 동시에 누르면 키 자체를 누르는 것과 다른 것을 기대합니다. X는 키의 X 이벤트와 함께 전달되는 수정 자 값에 비트를 할당하여 수정 자 키를 제공합니다. 키 누름은 여러 X 이벤트 일 수 있습니다. X는 수정자를 유지하면서 이러한 이벤트를 결합하는 기능을 제공합니다.

X는 키보드에 나타날 수있는 각 키의 기호도 정의합니다. 이벤트를 결합하는 함수에서 특수 처리하여 다른 값 (예 : 유니 코드)을 제공합니다.

그러나 "메타"는 특별한 경우입니다.

X 응용 프로그램에는 meta규칙을 제외하고 키 가 없습니다 . X에는 ​​메타 키 또는 메타 한정자에 대한 정의가 없습니다. 통상적으로, 단말기는 Alt키 및 / 또는 xmodmap예를 들어, 알려진 것으로 알려진 수정 자 중 하나를 찾는다 mod2. 이후의 xkb 기능은 Alt키 를 찾기 위해 다른 정보 계층을 제공하여 문제를 복잡하게하지만 (이 논의와 관련하여 개선되지는 않습니다) .

물론 meta 에 관한 어떤 xmodmap것도 xkb알지 못한다면 컨벤션은 지금까지만 가능 합니다. 예를 들어, xterm은 구성 가능하며 모든 사용자 가 동일한 방식으로 메타 를 구성하려는 것은 아닙니다 . 예를 들어 리소스 에서 사용되는 경우 의도 된 메타 키가 아닐 수 있습니다 . 다른 키는 메타 키일 수 있지만 사용자 (특히 bash에서 이스케이프 시퀀스를 사용하는 사용자)는를 누를 때 이스케이프 문자를 보내려고 할 수 있습니다. 그러나 수정 자로 구성 되지 않으면 xterm은 자체적으로 이벤트를 결합하지 않습니다.AlttranslationAlt

xterm에는 몇 가지 자원 설정이 있습니다 ( 매뉴얼 페이지에 설명되어 있음 ).

  • altIsNotMeta그리고 altSendsEscape( 2007 년에 추가됨 ).
  • eightBitInput이후 2,006 메타 모드의 원래 의미에 대응하고, 제공하는이 정의 이스케이프 시퀀스가 smmrmm(설정 / 제거 메타 모드)를 단말 기능.
  • eightBitInput디코딩 된 유니 코드 값을 원시 입력 바이트가 아닌 128만큼 시프트하여 UTF-8을 고려하도록 2003 년 에 수정되었습니다 .
  • metaSendsEscape에서 날짜 1999
  • eightBitInput보다 훨씬 더 늙었습니다 metaSendsEscape. 이는 메타 모드 (8 번째 비트 추가) 또는 escapeX11R4 (1989) 이후 키 접두사 사이에서 선택을 구현했습니다 . 그러나이 기능은 시작시 결정되었습니다. 초기화 중에 입력이 8 비트 또는 7 개만 허용되도록 설정되었는지 확인했습니다. 그 후에는 변경되지 않았습니다.

어떤 사람들은 후자를 메타 모드 ( meta mode )로 지칭 하는 두 가지 ( 8 비트 와 이스케이프 접두사)를 동일시 합니다. 문제에 대한 관점에 따라 xterm 의 리소스 설정은 실행 가능한 메타 키를 얻는 솔루션의 일부입니다.eightBitInput

더 읽을 거리 :

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.