我正在使用带有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
围绕元键做什么。欢迎提出改进建议 - 我希望找到可以干净利落地完成这项工作的代码。
答案 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))