2014-01-25 1 views
1

나는 이멕스 23을 xterm과 함께 사용하고 있는데, POSIX 로케일을 en_US.utf8으로 바꾸면 21 세기에 리눅스 시스템을 도입하려고하고있다. 문제점 :이 로케일에서 키보드의 Alt 키를 사용하면 xterm은 2 문자 시퀀스를 보냅니다. 예를 들어 Alt-f이 메타 문자로 표시되도록 이맥을 수정하고 싶습니다. 두 문자 시퀀스 "\303\246"이 아닙니다. 나는 이것이 입력 코딩을위한 작업일지도 모른다고 생각하지만, 이맥스 문서에서 나는 어떻게 하나를 쓰는지를 알지 못했다.`emacs -nw`는 UTF-8 로켈을 사용하여 xterm에서 어떻게 작동합니까?

나는 이멕스가 메타 이스케이프를 도입하기 위해 접두사 문자로 취급 할 수 있도록 키맵에 8 진수 '\303'을 추가하고자합니다. 이 방법을 선호하는 방법은 '\303'을 다음 키를 가져 와서 메타 키로 조정하는 함수에 바인딩하는 것입니다. 그러나 나는 그 중 하나를 이해할 수 없다.

최악의 경우 'a' ~ 'z'의 메타 키를 바인딩하는 루프 또는 동등하게 무서운 것을 작성하는 것 같아요.

나는 set-terminal-coding-system 주변에 엉망했지만, 문제의 핵심은 UTF-8 로켈에서, xterm Alt 키가 더 이상 메타처럼 동작 비 ASCII 문자 —를 보낼 수있는 Alt 키를 사용한다는 것입니다. 따라서 터미널 코딩 시스템을 UTF-8로 설정하면 분음 기호가있는 라틴 문자 만 입력 할 수 있습니다. 내가 바라던 행동이 아니야.

나는 xterm이 메타 키 주위에서 무엇을하고 있는지 추측하는 것을 포함하는 정말 무서운 대답을 발견했습니다. 개선을위한 제안은 환영합니다 — 나는이 일을 깨끗하게 할 수있는 코드를 찾고 싶습니다.

(unless (display-graphic-p) 
    (defun make-meta-key() 
    (interactive) 
    (let ((e (read-event))) 
     (if (numberp e) 
      (let ((keys (vector (event-convert-list (list 'meta 
                 (+ (event-basic-type e) 64)))))) 
      (let ((result (key-binding keys))) 
       (command-execute result))) 
     (error "this can't happen")))) 
    (global-set-key [?\M-C] 'make-meta-key)) 

xterm가 무엇을하고 있는지 주위를 작동하는 것 같다 :

(. 그리고 참고로, I'm not the only one with this problem)

+0

당신이 '설정 - 터미널 - 코딩 - system'를 통해 그것을 설정하는 것을 시도했다 : 개정 더 메타 시퀀스를 처리하는? 'M- : (terminal-coding-system)'을 반환하는 것은 무엇입니까? 제가 올바르게 이해한다면, Alt가 메타로 변환되지 않았을 가능성이 있습니다 - 터미널 설정을 확인하십시오 –

+0

@AlexOtt'nil'도'utf-8'도 작동하지 않습니다. 나는 그 결함이'emacs'가 아닌'xterm'에 있다고 생각합니다. 이것은'xterm'이하는 이상한 것들에 대한 실질적인 해결책입니다. 예를 들어, rxvt를 사용하면,'emacs -nw'는 Alt 키로 "그냥 작동합니다". –

+0

man [xterm] (http://invisible-island.net/xterm/manpage/xterm.html), [eightBitInput] (http://invisible-island.net/xterm/manpage/xterm.html#VT100- Widget-Resources : eightBitInput). –

답변

1

여기 정말 끔찍한 해킹.

ETA :

(unless (display-graphic-p) ;; deal with the Unicode sequences that xterm sends when Alt (meta) keys ;; are used. N.B. Works with Alt-letter, Alt-\, Alt-space, and Alt-Shift-: (defun make-meta-key() (interactive) (let ((e (read-event))) ;; (message "Got event %s; basic event is %s" e (event-basic-type e)) (if (numberp e) (let* ((basic (event-basic-type e)) (shifted (+ basic 64)) (basecode (if (<= shifted 127) shifted basic)) (keys (vector (event-convert-list (list 'meta basecode)))) (command (key-binding keys))) ;; (message "Result is %s; commandp says %s" command (commandp command)) (command-execute command)) (error "this can't happen")))) (global-set-key [?\M-C] 'make-meta-key) (defun do-nothing() (interactive) nil) (global-set-key [?\M-B] 'do-nothing))