터미널 사용시 키 바인딩 문제


30

나는 다음 줄을 가지고있다 init.el:

(global-set-key [(control \;)] 'comment-region)

GUI 창에서 매우 잘 작동하지만 옵션으로 emacs호출 하면 영역을 주석 처리하지 않고 문자 만 삽입 합니다. 그러나 잘 작동합니다.-nwC-;;M-x comment-region RET

비슷한 문제에 대해이 답변 을 따르려고 했지만 C-q C-;반환 ;하고 분명히 bare 바인딩하고 싶지 않습니다 ;.

원하는 효과를 얻는 방법?


4
터미널이 (어떻게 사용하고 있습니까?) 해당 명령 순서를 인식하지 못할 수 있습니다. C-;콤보를 사용 해보고 M-x view-lossageEmacs에 도착하는지 확인하십시오.
Dan

내가 사용하고 gnome-terminal, 및 M-x view-lossage반환 :ESC [ > 1 ; 2 8 0 2 ; 0 c ; ESC x v i e w - l o s s a g e RET
WeSenseASoulInSearchOfAnswers

3
터미널 문제처럼 보입니다. 키 조합이 Emacs에 도달하면 C-;오히려 c ;(또는 적어도 얻습니다 C-;) 처럼 보일 것 입니다.
Dan

@ 단 : 당신은 대답으로 그것을 넣을 수 있습니까? 그러면 질문이 답변 된 것으로 표시되고 해결책을보다 쉽게 ​​볼 수있게되는데, 이는 동일한 문제를 가진 다른 사람들에게 좋습니다. 감사!
Tikhon Jelvis

더 많은 내용을 읽을 수 있도록 추가 링크와 함께 요약 및 게시했습니다. 또한 질문 제목을 편집하여 좀 더 일반적으로 만듭니다.
Dan

답변:


17

첫째,보다 일반적인 문제 : 터미널 에뮬레이터는 종종 그들이 보낼 수있는 제어 및 이스케이프 시퀀스에 제한이 있습니다. 따라서 터미널이 특수 문자를 Emacs에 도달하기 전에 삼키는 경우가 있습니다. 일반적인 진단으로서, 키 조합이 Emacs로 만들어 졌는지 확인하기 위해 C-h l(또는 M-x view-lossage) 누르십시오.

이 문제에 대한 자세한 내용은이 스택 오버플로 스레드 와 그 링크를 확인하십시오.

주석에서 앞뒤로 요약하면 특정 문제는 문제 인 Emacs가 아닌 터미널이라는 것을 나타냅니다. 당신이 시도한 C-;후에 M-x view-lossage, 당신은 얻었다 blah blah blah c ; ESC v i e w - l o s s a g e RET. 그것은 터미널 문제처럼 보입니다. 키 조합이 Emacs에 도달하면 c ;부분은 다음과 같습니다 C-;.


33

에서 + 위쪽 터미널에서 이맥스를 인식하지 시프트 터미널 이스케이프 시퀀스로 대부분의 기능 키를 변환 어떻게, 설명하기 때문에 응용 프로그램 및 단말기의 송신 문자 (또는 오히려 바이트),하지 키 사이의 인터페이스를 제공합니다. 소수의 수정 자 + 문자 조합에만 고유 한 문자가 있습니다.

  • Ctrl플러스 문자 또는 @[\]^_바이트 중 하나는 바이트 0-31 (ASCII 제어 문자 ) 로 바뀝니다 .
  • 종종 Ctrl+ ?바이트 (127)에 회전 및 Ctrl+ Space동등 Ctrl+ @(바이트 0).
  • 일부 기능 키는 제어 문자와 같습니다 : Tab= Ctrl+ I, Return= Ctrl+ M, Esc= Ctrl+ [.
  • 그리고 Backspace= Ctrl+ HCtrl+ ?구성에 따라 달라집니다. Ctrl+는 ?이후, 이맥스에 대한 더 편리 Ctrl+가 H도움이됩니다.
  • Meta+ 다음에 문자character 가 전송됩니다 .Esc

Ctrl+ ;또는 Ctrl+ Shift+ 와 같은 다른 조합은 letter어떻습니까? 해당 문자가 없으므로 터미널은 문자를 재사용하거나 이스케이프 시퀀스를 보내야합니다. 많은 터미널은 해당 문자가 없으면 수정자를 무시하므로 Ctrl+ ;보내기 ;, Ctrl+ Shift+ letterCtrl+ letter등으로 끝납니다 .

터미널 공급 업체는 오랫동안 간단한 일을 계속했습니다. 이스케이프 시퀀스에 대한 표준은 없었으며 자체적으로 지속되었습니다. 터미널 공급 업체는이를 구현하지 않고, 응용 프로그램은이를 지원하지 않으며, 사용자는이를 기대하지 않습니다. 일부 터미널 에뮬레이터는 임의의 이스케이프 시퀀스를 보내도록 구성 할 수 있으므로 가능한 경우 이스케이프 시퀀스를 구성하고 이스케이프 시퀀스를 Emacs에 선언 할 수 있습니다.

최근 이스케이프 시퀀스를 표준화하기위한 두 가지 제안이 있었기 때문에 상황이 변하고 있습니다. 하나는 구문 이있는 LeoNerd의 libtermkey 입니다 . 다른 하나는 Thomas Dickey의 xterm 구문 입니다. 리소스 를 설정하여 현재 버전의 xterm (≥216)을 구문에 맞게 구성 할 수 있습니다 . 를 0이 아닌 값 으로 설정하여 기능을 활성화해야합니다 .ESC [ codepoint ; modifier uESC [ 2 7 ; modifier ; codepoint ~formatOtherKeysmodifyOtherKeys

터미널 에뮬레이터가 이러한 구문을 지원하지 않지만 구성 할 수있는 경우 둘 중 하나를 선택하십시오.

Emacs 24.4부터 Emacs modifyOtherKeys는 터미널이 xterm 버전 ≥216임을 감지하면 자동으로 기능을 켭니다 . Emacs는 키를 인코딩하기 위해 이스케이프 시퀀스를 감지하여 변수를 통해 작동합니다 local-function-key-map. Emacs 24.4부터 모든 이스케이프 시퀀스가 ​​지원되는 것은 아닙니다. init 파일에서 다음 코드를 사용하여 작업을 완료 할 수 있습니다.

;; xterm with the resource ?.VT100.modifyOtherKeys: 1
;; GNU Emacs >=24.4 sets xterm in this mode and define
;; some of the escape sequences but not all of them.
(defun character-apply-modifiers (c &rest modifiers)
  "Apply modifiers to the character C.
MODIFIERS must be a list of symbols amongst (meta control shift).
Return an event vector."
  (if (memq 'control modifiers) (setq c (if (or (and (<= ?@ c) (<= c ?_))
                                                (and (<= ?a c) (<= c ?z)))
                                            (logand c ?\x1f)
                                          (logior (lsh 1 26) c))))
  (if (memq 'meta modifiers) (setq c (logior (lsh 1 27) c)))
  (if (memq 'shift modifiers) (setq c (logior (lsh 1 25) c)))
  (vector c))
(defun my-eval-after-load-xterm ()
  (when (and (boundp 'xterm-extra-capabilities) (boundp 'xterm-function-map))
    (let ((c 32))
      (while (<= c 126)
        (mapc (lambda (x)
                (define-key xterm-function-map (format (car x) c)
                  (apply 'character-apply-modifiers c (cdr x))))
              '(;; with ?.VT100.formatOtherKeys: 0
                ("\e\[27;3;%d~" meta)
                ("\e\[27;5;%d~" control)
                ("\e\[27;6;%d~" control shift)
                ("\e\[27;7;%d~" control meta)
                ("\e\[27;8;%d~" control meta shift)
                ;; with ?.VT100.formatOtherKeys: 1
                ("\e\[%d;3u" meta)
                ("\e\[%d;5u" control)
                ("\e\[%d;6u" control shift)
                ("\e\[%d;7u" control meta)
                ("\e\[%d;8u" control meta shift)))
        (setq c (1+ c))))))
(eval-after-load "xterm" '(my-eval-after-load-xterm))

경우] TERM환경 변수로 설정되어 있지 않은 xterm등의 변이체 또는 xterm-256color이멕스 그 시퀀스를 활성화 할 것이다. Emacs가 이미 귀하의 값을 TERM지원하는 경우, 위와 유사한 함수를 정의하여 이름이 값인 Lisp 파일TERM로드 한 후 실행되도록 지원을 추가 할 수 있습니다 . Emacs가 그러한 지원을 제공하지 않는 경우,에 term어딘가 라는 서브 디렉토리를 작성하고이라는 함수를 정의하는 where is the value load-path라는 Lisp 파일 을 작성하여이를 추가 할 수 있습니다 .term/$TERM.el$TERMTERMterminal-init-$TERM

내가 쓰는 것처럼 xterm 이외의 터미널 에뮬레이터는 이러한 이스케이프 시퀀스를 채택하지 않은 것 같습니다. OSX에서는 각 키 조합에 대해 이스케이프 시퀀스를 하나씩 선택하여 iTerm2 를 구성 할 수 있습니다 .


2
이 주제에 대한 당신의 대답은 항상 훌륭합니다, 질. 매우 감사.
phils

큰!. urxvt가 해당 시퀀스를 보내는 방법을 찾는 데 어려움을 겪고 있지만. :)
Amos

@ 아모스 나는 rxvt를 사용하지 않습니다. urxvt가 modifyOtherKeys를 사용하여 xterm과 동일한 이스케이프 시퀀스를 전송하는 방법을 Unix & Linux 에서 문의해야합니다 .
Gilles 'SO- 악마 그만해'

macOS xterm-256color에서는 작동하지 않습니다. M-C-%로 인식ESC 5
LoranceChen

@LoranceChen modifyOtherKeys기능이 활성화되지 않은 경우 예상되는 동작 입니다. 최신 버전의 xterm에서만 지원되며 Emacs 24.4 이후 자동으로 만 활성화됩니다. OSX가 최신 버전과 함께 제공되는지 모르겠습니다. 그것이 효과가없고 효과가 없다면 새로운 질문을하는 것이 좋습니다. 사용중인 버전을 언급하십시오.
Gilles 'SO- 악한 중지

2

Gilles의 답변은 다음과 같이 언급했습니다 On OSX, you can configure iTerm2 by selecting an escape sequence for each key combination, one by one. .

터미널에서 Emacs를 실행할 때 (예 : Mac의 기본 Terminal.app) C-x C-;실행되지 않고 comment-line해당 기능을 원하는 경우 iTerm2 (Terminal.app에 기능이 없음)로 전환하고 키 매핑을 만들어야합니다 프로파일 ... 아래의 :

^;     ^[[59;5u

이것은 클릭하여 이루어집니다 +"키보드 바로 가기"라는 작은 창이 나타납니다 버튼; 이 창에는 처음에 두 개의 필드가 있습니다. 상단의 값은 "클릭하여 설정"이고 하단의 값은 "무시"입니다. 상단 버튼을 클릭하고을 입력하십시오 C-;. 이는 조치 및 코드를 실행할 키 조합을 설정합니다. 맨 아래 필드 인 "Action"을 클릭하고 "Send Escape Sequence"를 찾으십시오. 클릭하면 "Esc +"라는 세 번째 필드가 나타납니다. 이 필드 안에 다음을 입력하십시오.

[59;5u

59쉼표의 진수 ASCII 코드이며,이 5코드입니다 Ctrl. 그런 다음 "확인"을 눌러 완료하십시오. 올바른 키 조합 대 키 시퀀스가 ​​이제 iTerm2의 환경 설정에 포함됩니다. iTerm에서 Emacs를 시동하면 C-x C-;기능에 액세스 할 수 있습니다.

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