모든 키 조합을 처리 할 수있는 리눅스 터미널이 있습니까?


11

터미널 모드 ( -nw) 에서 emacs를 사용 하고 싶지만 대부분의 (모두?) 터미널은 일부 키 조합을 처리 할 수없는 것 같습니다 (예 : C-<RET>또는) C-M-%. 나는 이것이 대부분의 터미널이 VT-100을 에뮬레이트하기 때문에이 조합을 가지고 있지 않다는 것을 알고 있습니다. 이러한 키 조합을 처리 할 수있는 Linux 터미널 (바람직하게는 KDE)이 있습니까? 아니면 이것이 모든 터미널의 근본적인 제한입니까?

답변:


15

터미널에서 키 또는 키 조합을 누르면 하나 이상의 문자 시퀀스로 터미널에서 실행중인 응용 프로그램으로 전송됩니다. 예를 들어를 누르면 a응용 프로그램이 수신 a합니다. 을 누르면 Enter응용 프로그램은 문자 CR(일명 ^M"Control-emm", 일명 문자 번호 13, 일명 \r또는 \015)를받습니다. 관련된 키 조합 Alt은 일반적으로 문자 ESC( ^[일명 일명 \e또는 \033) 로 전송되고 그 뒤에 키 또는 키 조합에 대한 시퀀스가 ​​이어집니다 Alt. 기능 키 및 기타 키 조합은 \e[또는로 시작하는 이스케이프 시퀀스로 전송됩니다 \eO.

이스케이프 시퀀스는 완전히 표준화되지 않았으며 터미널은 일반적으로 특정 키의 특정 속성을 무시합니다. 예를 들어 Ctrl+ Shift+ letter는 기본적으로 Ctrl+ 와 같이 정확하게 전송됩니다 letter.

쉘 프롬프트에서 Ctrl+ V와 그 키 조합을 차례로 누르 C-q거나 C-h cEmacs 의 키 조합을 누르면 터미널이 키 조합에 대해 전송하는 내용을 볼 수 있습니다 .

일부 터미널 에뮬레이터를 사용하면 각 키에 대한 이스케이프 시퀀스를 구성 할 수 있습니다. Xterm에서 이것은 X resources를 통해 수행됩니다 . 대부분의 설정은 ~/.XresourcesX가 시작될 때 부터 리소스를 읽으며을 사용하여 파일을 수동으로로드 할 수 있습니다 xrdb -merge ~/.Xresources.

Term.VT100.translations:       #override \n\
    Ctrl ~Shift ~Meta <key>Return: string("\033[73;5~") \n\
    Ctrl Shift ~Meta <key>percent: string("\033[37;6~")

공통 규칙은 ESC [ number1 ; number2 ~수정자가있는 기능 키 에 대해 형식의 이스케이프 시퀀스를 사용합니다 . number1기능 키를 나타낸다 ( 1524에 대한 F5F12- 역사적인 이유로, F1을 통해 F4다른 이스케이프 시퀀스가) 및 number2수식을 나타낸다 ( 2에 대해 Shift, 3에 대해 Meta, 5에 대해 Ctrl, 7에 대해 Ctrl+ Meta및 1 추가 Shift적어도 하나와 함께 Ctrl또는 Meta).

이맥스 통해 키 내부 표현으로 이스케이프 시퀀스를 변환 input-decode-map하거나local-function-key-map (또는 function-key-map이맥스 23 전).

(define-key local-function-key-map "\033[73;5~" [(control return)])
(define-key local-function-key-map "\033[37;6~" [(control ?L)])

따라서 이것을 올바르게 이해하면 먼저 키 조합에 해당하는 터미널에서 이스케이프 시퀀스를 정의해야합니다. 그런 다음 이맥스에서 이스케이프 시퀀스를 키 조합에 다시 매핑해야합니다. infocmp $TERM?에 정의 된 것과 충돌하지 않는 한 이스케이프 시퀀스는 임의적 일 수 있습니까 ?
Yossarian

2
@Yossarian 예. 충돌하지 않는 것 외에도, 이스케이프 시퀀스는 분명해야하며, 즉 이스케이프 시퀀스가 ​​다른 시퀀스의 접두어가 아니어야합니다. 이것은 실제로 첫 번째 문자는 ESC(128 자 이상을 시도하지 않는 한 가능한 입력 인코딩을 제한하지 않는 한) 두 번째 문자는 ESC foo바인딩 을 원하지 않는 것이어야 함을 의미합니다 .
Gilles 'SO- 악마 그만해'

방금 제안한 것을 시도해 보았습니다. 해야 local-set-key실제로 일 define-key? 전자는 오류 (잘못된 인수 수)를 제공하지만 후자는 적어도 <kbd> C-Enter </ kbd>에 대해 작동합니다. Konsole이 여전히 <kbd> CM-% </ kbd>를 전송하는 데 문제가있는 것 같습니다.
Yossarian

@Yossarian 실제로,이어야합니다 define-key. Konsole의 이스케이프 키를 구성 할 수 있는지 모르겠습니다. xterm은 다른 방법보다 사용자 정의가 가능합니다.
Gilles 'SO- 악마 그만해'

1
참고 토마스 당나귀의 xterm 등이 적극적인 개발을 받고있다. XTerm*modifyOtherKeys: 2리소스를 사용하면 C-M-조합 에도 고유 한 시퀀스를 생성 하지만이 설정을 사용하면 많은 사용자 지정 매핑을 제공해야합니다 ( XTerm*modifyOtherKeys: 1기능이 부족하지만 기능이 훨씬 뛰어남). 예를 들어 볼 (나를 위해 작동하지 않은 일이기는하지만) xterm-extras.el라이브러리 및 관련 .Xresources.inputrc에있는 파일 easymacs의 다운로드.
phils

1

KDE의 곤솔을 가정 할 때 제한적이지만 중요한 키 세트의 경우 emacs -nw에서 작동하는 복잡한 키 바인딩을 갖기 위해 다음을 수행 할 수 있습니다.

S-<RET>예를 들어 작업 구현에 대한 구현을 사용합니다 .

  1. 새 곤솔을 열고 설정-> 현재 프로필-> 키보드-> 편집으로 이동하십시오.
  2. Add Return+Shift키를 누르고 새로운 항목을 작성 하고 유용한 키 시퀀스를 제공하십시오 ( \E[27;3xev와 함께 파고 났을 때 X가 보낸 키 시퀀스라고 생각했지만 잘못되었을 수도 있습니다. 적절한 탈출구가 있고 다른 것과 충돌하지 않는지 확인하십시오).
  3. 바닥의 ​​작은 테스트 영역에서 작동하여 작동하는지 확인하십시오.
  4. 곤솔을 다시 시작하십시오.
  5. 시작 emacs -nw하고 스크래치 버퍼에서 다음을 평가하십시오.

    (read-key-sequence-vector "Type your new key:")

    그런 다음 새 키 조합을 입력하십시오.

    • 이 점에 익숙하지 않은 경우 줄을 작성하고 줄 끝에 커서를 놓고 Cx Ce를 눌러 emacs가 해당 줄을 실행하도록하십시오. 따옴표에 넣은 내용을 말하고 기다려야합니다. 무언가를 입력하십시오.
  6. 바인딩 할 수있는 키 시퀀스를 추출해야합니다.
    ( 콘솔 키 바인딩을 엉망으로 만들기 전에 [27 91 50 55 59 51]지루한 옛날과는 반대로 나에게 돌아 왔습니다 [13].)

  7. emacs 구성에 추가하십시오 :

    (define-key function-key-map [27 91 50 55 59 51] [(shift return)])
    
  8. 다음을 emacs -nw사용하여 스크린 세션에서 테스트했습니다 .

    (define-key ess-mode-map [(shift return)] #'ess-eval-line-and-step)
    (define-key sh-mode-map [(shift return)]  #'send-line-to-shell)
    

0

짧은 대답은 모든 터미널의 근본적인 한계라는 것입니다.

약간 더 긴 대답은 누군가가 원하는 것을 수행하는 터미널을 만들었더라도 Emacs 자체 가이 가상 터미널을 사용하기 위해 큰 변화가 필요하다는 것입니다.


그것은 이맥스에 대한 좋은 지적이며 나에게도 발생하지 않았습니다. 대신 gui를 사용하기 시작합니다.
Yossarian

그게 내가하는 일이야.
hruvulum 2016 년

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