Emacs M-S-<;左>;未按预期处理

Emacs M-S-<;左>;未按预期处理,emacs,Emacs,当我在这样一个终端中启动一个新的emacs时 emacs -nw -Q 我可以通过键入C-hk来检查某个键盘快捷键绑定到了什么。当我在启动Emacs后立即在*scratch*缓冲区中对快捷方式M-S执行此操作时,我得到: 运行命令left word(在全局映射中找到),这是一个 “bindings.el”中的交互式编译Lisp函数 这是必然的 [……] 请注意,在已识别的键序列中没有“Shift”修饰符 现在,第一个直觉是终端(在我的例子中是gnome终端)不会产生正确的转义序列,但它会产生:

当我在这样一个终端中启动一个新的emacs时

emacs -nw -Q
我可以通过键入C-hk来检查某个键盘快捷键绑定到了什么。当我在启动Emacs后立即在
*scratch*
缓冲区中对快捷方式M-S执行此操作时,我得到:

运行命令left word(在全局映射中找到),这是一个 “bindings.el”中的交互式编译Lisp函数

这是必然的

[……]

请注意,在已识别的键序列中没有“Shift”修饰符

现在,第一个直觉是终端(在我的例子中是gnome终端)不会产生正确的转义序列,但它会产生:在终端中键入CTRL-V ALT SHIFT left(即,在Emacs中不是)会产生正确的转义序列

在Emacs中键入C-qc-S-inside将相同的内容插入当前缓冲区。(请注意,
^[
是单个字符,即ASCII 27(“转义”))

检查
input decode map
会显示以下值(为了简洁起见,省略了某些部分(标记为
):

使用以下代码验证两个密钥序列可获得预期结果:

(mapc)(lambda(c)(插入(格式“%c”c)))(279149595168));^[1;3D
(mapc)(lambda(c)(插入(格式"c))(279149595268);(1 ; 4D)
然而,我不明白为什么这些序列被嵌入到二级内部
(keymap…
列表中

它变得更奇怪了

当我键入时,返回到
*scratch*

M-x local-set-key
然后M-S-,它被正确识别,正如minibuffer中的下一个提示所示:

Set key <M-S-left> locally to command:
将本地键设置为命令:
如果我继续并提供一个随机函数,比如说,
行的开头
,随后调用C-hk,后跟M-S,那么确实会给出:

运行命令行的开头(在中找到) lisp交互模式映射),这是一个交互式内置函数 在“C源代码”中

这是必然的

[……]

本地将M-S-设置为
nil
将恢复C-h k将M-S-报告为
的初始行为

这是怎么回事?这是一个配置问题,还是它的预期行为,还是涉及到一些其他键映射,它们透明地添加了另一层重新映射?

这是一个功能

M-x
elisp索引搜索
RET
shift translation
表示:

如果输入字符为大写(或具有shift修饰符),并且 没有键绑定,但是它的小写等价物有一个键绑定,那么 “读取键序列”将字符转换为小写。请注意 “查找键”不会以这种方式执行大小写转换

当读取输入导致这种“移位翻译”时,Emacs设置 变量“this command keys shift”转换为非“nil”值。 如果Lisp程序需要修改其 由shift转换键调用时的行为。例如 函数“handle shift selection”检查此变量的值以 确定如何激活或停用区域(*注意 手柄换档选择:标记。)


这是哪个版本的Emacs?对我来说,Emacs 26.1报告
(翻译自)运行命令left word
。您可能看到了相同的行为,但没有被明确告知这是一个翻译序列。GNU Emacs 25.2.2FYI我刚刚在25.3中测试过(IIRC只是25.2之上的一个安全补丁),我看到了“翻译自”文本也在那里。我觉得它已经存在很长时间了(可能是自从引入shift translation功能以来),所以我仍然有点困惑,为什么你自己没有看到。我确实记得自己在过去看到过“翻译自”消息(较旧的Emacs版本)。这就是我引用我得到的输出的前几行的原因,因为我的版本中显然没有提到它。非常感谢交叉引用。我想,你在较新的Emacs中得到的
(翻译自)
消息也会解决我的问题。想想看,这有点愚蠢。”功能“-除非我碰巧无意中按下了Shift键,否则可能是因为我没有键入键盘快捷键的“小写”版本。它也不一致:在我的键盘上,
+
s-=
相同,但当我
(全局设置键“+”nil)
我得到“+时,是未定义的“在微型缓冲区中,而不是插入一个
=
。我不确定这是否准确,但您可能会将其解释为“移位转换影响字母a-Z以及尚未具有移位行为的键”。如果您还没有使用,请参见
shift-select-mode
,我不使用它,但我认为这就是为什么这个功能首先存在的原因。请写出您最后的评论,@phils:No。我很确定这个行为很旧,
shift-select-mode
相对较新。是的,它最初是关于字母的,被认为是一种方便默认情况下,使Shift键与字母键绑定无关。
M-x local-set-key
Set key <M-S-left> locally to command: