【问题标题】:How can I get `emacs -nw` to work with xterm using UTF-8 locale?如何使用 UTF-8 语言环境让 `emacs -nw` 与 xterm 一起使用?
【发布时间】:2017-07-07 21:42:49
【问题描述】:

我正在使用 Emacs 23 和 xterm,并试图通过从 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 键的行为不再像元。因此,将终端编码系统设置为 UTF-8 只能让我输入带有变音符号的拉丁字符。不是我希望的行为。

我发现了一个非常可怕的答案,其中涉及猜测 xterm 在元密钥周围做什么。欢迎提出改进建议——我想找到可以干净利落地完成这项工作的代码。

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

【问题讨论】:

  • 您是否尝试通过set-terminal-coding-system 设置它?什么返回M-: (terminal-coding-system)?如果我理解正确,问题可能是您的 Alt 没有翻译成 Meta - 检查终端设置
  • @AlexOtt nilutf-8 都不起作用。我认为错误在于xterm,而不是emacs。对于xterm 所做的奇怪事情,这确实是一种解决方法。例如,使用 rxvt,emacs -nw 与 Alt 键一起“正常工作”。
  • xterm,见eightBitInput

标签: emacs utf-8 xterm


【解决方案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))

【讨论】:

    猜你喜欢
    • 2016-06-25
    • 2017-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-10
    • 2023-04-03
    • 2012-03-21
    • 1970-01-01
    相关资源
    最近更新 更多