终端下,如何使用shift+key组合键?

似乎终端会不识别shift,怎么解决?

现象是:shift + enter跳到下一行,类似vim的o。在终端下似乎不能正常使用。

终端不识别的话,Emacs 自然就不可能识别。

如果你所使用的终端支持调整按键对应的行为,比如 iTerm2 就行,可以尝试让 <S-return> 发出 S-return,之后就应该可以使用它了:

(global-set-key [S-return] #'some-cool-command)

(这里有个相对较小的问题是:我没能在 Emacs 的手册中看出,终端需要发出怎样的 bytes,Emacs 才认为它是 S-return

还是不太明白 Emacs 按键是如何处理的,不过 Emacs SE 上有个相关的问题,其中有提到如何让 Emacs 映射 bytes 至 Emacs 按键

首先设置终端(以 ITerm2 为例)按 <S-return> 时发出 ESC O E 这三个 Bytes(是我随便编的,不清楚有没有跟已有的按键有冲突):

然后设置 Emacs 使用这个按键:

(define-key input-decode-map "\e[OE" [S-return])
(global-set-key [S-return] #'emacs-version)

现在 Enter 运行 newline,Shift + Enter 运行 emacs-version

是的,应该是终端没有发出对应的指令字节编码。gnome上会有这个问题,在xterm上正常的。不过没找到如何配置gnome的按键映射 - -

哦,确实在 xterm 上 Emacs 直接能识别出 <S-return>,对应的序列是 ^[[27;2;13~,所以应该设置终端发送这个 序列(以 iTerm2 为例):

之后直接 (global-set-key [S-return] #'emacs-version) 就行了,用不着其它的设置了。

不清楚,我猜测主要终端的问题,跟桌面环境关系不大?在是否能够定制按键发送的 bytes 上, gnome-terminal 不行,konsole 可以。

请问下,您是如何查询 “Emacs 直接能识别出 ,对应的序列是 ^[[27;2;13~” 这个对应的序列的? AND 十分感谢帮忙定位问题,嘿嘿。

看图,用 iTerm2 查的按键序列

在 xterm 中打开 Emacs,按 C-q (quoted-insert) 和 <S-return>,就会得到 ^[[27;2;13~

还有别的办法,比如下面是从 Emacs 自带的 xterm.el 中推测出来的。

| S-tab      | \e[27;2;9~  |
| S-return   | \e[27;2;13~ |
| C-S-tab    | \e[27;6;9~  |
| C-S-return | \e[27;6;13~ |
| S-up       | \e02A       |
| S-down     | \e02B       |
| S-right    | \e02C       |
| S-left     | \e02D       |
| S-end      | \e02F       |
| S-home     | \e02H       |
| S-insert   | \e[2;2~     |

我在gnome终端和xterm打出来的是“^M”这个转义符 - -,不知道该怎么设置了。

gnome-terminal 本来就不区别 Enter 和 Shift+Enter,所以 C-q RETC-q S-return 自然应该得到都是字符 ^M(即C-m、 13)。如你前面所说,xterm 区别它俩,所以等到的结果会不一样。

我在windows 10下有一个奇怪的现象, emacs版本26.1

C-q S-return 输入的是^@也就是Ctrl-@, 然而我使用S-return时是会被emacs识别为ret. 按C-@的时候是正常的进入标记模式