如何配置 emacs 以正确接受 Shift 和 Alt 光标组合?

如何配置 emacs 以正确接受 Shift 和 Alt 光标组合?

emacs我在终端中使用 org-mode ,并且Shift和光标组合以、等Alt字符输入。我注意到和 终端也显示这种行为。2A2B3Avim

是否有一些终端设置可以更改此行为,或者是 emacs 和 vim 本身的设置吗?

跟进吉尔斯的建议:

终端模拟器是KDE 控制台。由于给出的一些建议,我进入菜单Settings->Configure Shortcuts并禁用了Shift+Left和的和Shift+Right选项。Previous TabNext Tab

Emacs

Shift+Left -> ^[2D

Shift+Right -> ^[2D

Alt+Left -> ^[3D

Alt+Right -> ^[3C

维姆

Shift+Left -> ^[[1;2D

Shift+Right -> ^[[1;2C

Alt+Left -> ^[[1;3D

Alt+Right -> ^[[1;3C

答案1

在遵循吉尔斯对这个问题的评论中的建议以及更多的网络搜索后,我发现了这个链接https://github.com/bendikro/emacs-conf/blob/master/emacs-conf/key-bindings.el有些部分适当地定义了键。

;; ;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;; Fix for screen / tmux
;; some snipped code

;; Fix ALT + arrow keys inside screen/tmux
(define-key input-decode-map "\e[1;3A" [M-up])
(define-key input-decode-map "\e[1;3B" [M-down])
(define-key input-decode-map "\e[1;3C" [M-right])
(define-key input-decode-map "\e[1;3D" [M-left])

我也复制并改编了它Shift,现在看起来效果不错。

答案2

它是应用程序本身的设置,与终端相结合。

Xterm 模仿的 DEC VT 行为将扩展按键事件作为带有参数的控制序列发送。许多幼稚的程序无法正确解码这些,因为它们错误地期望键盘控制序列是没有参数的简单控制序列。他们中的一些人是如此天真,以至于他们甚至没有正确地寻找中间和最终的字符。他们最终只解码控制序列的一部分,并将其余部分视为普通输入,从而导致奇怪的情况,例如您所看到的。

vim 能够正确解码此类键盘序列,并且如何确保它能够正确解码,请参阅xterm-modifier-keys其在线帮助部分。

nvim 也是如此,尽管它不需要像 vim 那样设置 termcap 变量。

不同之处在于像这样的应用程序要求终端认为它处于应用程序光标键模式应用程序键盘模式。通常,终端位于普通光标键模式正常键盘模式。这些应用程序通过向终端打印控制序列来告诉终端在持续时间内切换模式。

答案3

终端描述(假设您的TERM设置为“xterm”)提供了必要的信息(例如,请参阅之前的注释)xterm+pcfkeys入口)。

xterm自1999年以来(以及它的模仿者 konsole 和 gnome-terminal,几年后开始 - 请参阅xterm 常见问题解答) 使用shift-、control-、alt-和meta-修饰符提供一组扩展的功能键:

向功能键添加参数以指示是否设置了 Shift、Control 或 Alt。这些代码基于带有 PC 键盘的 DEC VT510 的描述

xterm 是否“模仿”DEC VT 当然是有争议的:当时,没有免费提供的手册,因此“描述”是通过电子邮件通过几行文字进行的。预计会有一些变化。

最初的行为被改变2002年,使 xterm 发送一个数字作为第二个参数来告诉使用哪些修饰符(在“1”之后,emacs 可能将其解释为重复计数)。

后续的 vim 和 emacs 引用 konsole 的例子很有趣:

  • 两者都是术语帽应用程序,这意味着(尽管详细信息已在术语信息描述了 10 多年,但这些程序实际上都不是用途终端描述,因为名字在 termcap 文件中找不到(并且可能永远不会)引用这些功能的文件。
  • 这两个程序都有一些解决方法,例如,vim 的文档xterm-shifted-键,xterm 修饰键,xterm 代码。对于 emacs,文档并不那么简洁(键位图的讨论例如),但它有助于阅读源代码,例如,lisp/term/xterm.el
  • 有趣的是,emacs 的回显与 vim 的回显不同,并且前者类似于较旧/过时的行为。它不仅已经过时,而且 konsole 和 gnome 终端开发人员复制了它,十多年来都懒得跟踪 xterm 的变化(导致大量错误报告)。 emacs 的解决方法可能就是这个结果。

相关内容