似乎终端会不识别shift,怎么解决?
现象是:shift + enter跳到下一行,类似vim的o。在终端下似乎不能正常使用。
似乎终端会不识别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 RET
和 C-q S-return
自然应该得到都是字符 ^M
(即C-m
、 13)。如你前面所说,xterm 区别它俩,所以等到的结果会不一样。
我在windows 10下有一个奇怪的现象, emacs版本26.1
C-q S-return
输入的是^@
也就是Ctrl-@, 然而我使用S-return时是会被emacs识别为ret. 按C-@的时候是正常的进入标记模式