如何使用UTF-8语言环境让`emacs -nw`与xterm一起工作?

时间:2014-01-25 20:51:39

标签: emacs utf-8 xterm

我正在使用带有xterm的Emacs 23,并试图通过从POSIX区域设置切换到en_US.utf8来将我的Linux系统带入21世纪。问题:当我在此语言环境中使用键盘上的Alt键时,xterm发送一个双字符序列。我想修复emacs,以便它将Alt-f视为meta-f而不是双字符序列"\303\246"。我认为这可能是输入编码的工作,但是从emacs文档我还没想出如何写一个。

作为替代方案,我愿意将八进制'\303'添加到键映射,以便emacs将其视为引入元转义的前缀字符。我希望这样做的方法是将'\303'绑定到一个函数,然后该函数接受下一个键并将其调整为元键。但我也不能完全弄明白。

最糟糕的情况我想我写了一个循环,它将'a'的元键绑定到'z'或同样可怕的东西。

我已经弄乱了set-terminal-coding-system,但问题的关键是在UTF-8语言环境中,xterm使用Alt键发送非ascii字符 - Alt键不再像meta那样表现。因此,将终端编码系统设置为UTF-8只能使我输入带有变音符号的拉丁字符。不是我希望的行为。

我发现了一个非常可怕的答案,涉及猜测xterm围绕元键做什么。欢迎提出改进建议 - 我希望找到可以干净利落地完成这项工作的代码。

(仅供参考,I'm not the only one with this problem。)

1 个答案:

答案 0 :(得分:1)

这是一个真正可怕的黑客:

(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正在做的事情。

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))