我最近在这里得到了修复M-left
等问题的帮助:终端元箭头键绑定中的 emacs,但无法使用类似的解决方案修复Shift-up
。当我尝试shift-up
时,我收到错误<select> is undefined
.我尝试使用以下方法重新映射它:
(add-hook 'term-setup-hook
'(lambda ()
(define-key function-key-map "e[1;9A" [M-up])
(define-key function-key-map "e[1;9B" [M-down])
(define-key function-key-map "e[1;9C" [M-right])
(define-key function-key-map "e[1;2A" [S-up])
(define-key function-key-map "e[1;9D" [M-left])))
但转变仍然没有定义。我还尝试通过使用从cat
返回的转义序列来重新绑定密钥,这是^[[1;2A
。奇怪的是,下移确实有效。 shift-select-mode
也标在t
。
听起来像是我通过 Putty 访问 Ubuntu 12.04 机器时遇到的麻烦,当时 END 导致 Emacs 23.3.1 说<select> is undefined
。事实证明,这是术语信息的问题,它允许程序以独立于设备的方式使用终端。
基于这个 2008 年的错误报告讨论,我通过在 ~/.bashrc 的顶部添加以下内容来解决我的问题:
#so the END key will work correctly in Emacs over PuTTY
TERM=xterm-vt220
注意,使用 xterm-vt220 或默认的 xterm,当我按 END 时,emacs -Q -nw
ESC O A
表示 Up,ESC [ A
表示 Shift-Up 时,会变得ESC [ 4 ~
。 (要查看 Emacs 获得的键代码,请按一些按钮,然后按C-h,l
。 对于相同顺序的相同键,cat
说[4~
、[A
和[OA
...所以向上和向上移位是奇怪的颠倒。
如果您不想更改术语信息,请参阅此讨论以获取解决方法http://lists.gnu.org/archive/html/help-gnu-emacs/2011-05/msg00211.html
您应该能够通过以下方式解决此问题:
(define-key input-decode-map "e[1;2A" [S-up])
为了使它在正确的时间生效,您必须在.emacs中使用以下内容:
(if (equal "xterm" (tty-type))
(define-key input-decode-map "e[1;2A" [S-up]))
只是为了添加有关解决方案的更多信息:https://github.com/arthurnn/dotfiles/blob/8d56f2419da9a4cb654d8941f379d6d5783bdb90/.emacs.d/init.d/setup-bindings.el#L3-L10 这应该可以解决包括emacsclient在内的所有情况。最后一行负责修复使用 emacsclient 时的 Shift-up。