为什么emacs会将PageDown(<;next>;)键与M-[?

为什么emacs会将PageDown(<;next>;)键与M-[?,emacs,Emacs,我发现标准的emacs nox和emacs gtk有很大的区别。 我知道emacs控制台版本(emacs nox)的一些键(如Shift Tab-)有问题,但PageDown没有问题 当我有空的.emacs文件,并尝试识别通过PageDown键(通过C-h C)运行的命令名时,emacs nox emacs gtk正常工作-按下PageDown键可向上滚动,而C-h C PageDown打印在minibuffer中向上滚动 当我尝试绑定“M-[”键时,问题就出现了。 在.emacs中,我只有一条

我发现标准的emacs nox和emacs gtk有很大的区别。 我知道emacs控制台版本(emacs nox)的一些键(如Shift Tab-)有问题,但PageDown没有问题

当我有空的.emacs文件,并尝试识别通过PageDown键(通过C-h C)运行的命令名时,emacs nox emacs gtk正常工作-按下PageDown键可向上滚动,而C-h C PageDown打印在minibuffer中向上滚动

当我尝试绑定“M-[”键时,问题就出现了。 在.emacs中,我只有一条语句:

(global-set-key (kbd "M-[") 'hippie-expand)
emacs nox无法识别按键运行的命令名-当C-h C向下翻页时,它不会在微型缓冲区中打印任何内容,而是将腕带插入缓冲区“~6”。 当我尝试 C-h k分页下降 我得到:M-[运行命令hippie expand

emacs gtk工作正常-按下PageDown可向上滚动,而C-h C PageDown打印可在微型缓冲区中向上滚动

所以我猜emacs nox将PageDown视为M-[并添加一些额外的内容

知道如何在emacs nox中解决此问题吗?

我使用EmacsV23.2

编辑:

我测试了其他情况:在.emacs中,我只有: (全局设置键(kbd“”)“嬉皮士扩展”
C-h C PageDown和C-h k PageDown都能正常工作(打印hippie expand),在缓冲区中,我按下PageDown也能正常工作。

这与终端仿真以及Emacs nox如何解释终端每次按键时发送给它的转义序列有关

因此,这取决于您的终端,但您可以尝试在.emacs文件中放入以下行:

(unless window-system
  (define-key input-decode-map "" [next])
  (define-key input-decode-map "" [prior]))
然后将光标移动到前两个
字符之间并键入C-q PageDown,然后将光标移动到下一行的
之间并键入C-q PageUp。结果如下所示:

(unless window-system
  (define-key input-decode-map "^[[6~" [next])
  (define-key input-decode-map "^[[5~" [prior]))
但是请注意,
^[
只是一个字符(转义)——这就是为什么您不能简单地从这个答案复制粘贴它


重新启动emacs nox后按键是否有效?

问题与终端发送给emacs的转义序列有关。您可以通过在终端窗口中键入C-v,然后键入组合键来检查转义序列。例如,如果您键入

C-v M-[

您应该在终端窗口中看到如下内容:

^[[
如果你打字

C-v调低

你应该看到

^[[6~
这就解释了问题:由M-[生成的密钥序列是由PageDown生成的密钥序列的前缀。因此,当您将该前缀绑定到函数时(例如,通过全局设置M-[到
'hippie-expand
),在点击PageDown时,您会得到以下效果:

PageDown转义序列的前两个字符(
^[
)被解释为前缀,因此调用
'hippie-expand
。然后剩下的两个字符像普通的按键一样是解释器,因此被插入到缓冲区中。这就是为什么按下PageDown时会看到“6~”


我认为改变这一点的唯一方法是说服终端为这些键发送不同的序列。但更简单的方法是使用不同于M-[(我建议M-/)

不,不起作用,效果是一样的:(.当我有空的.emacs文件时,一切都正常,但当我将一个函数绑定到M时-[不起作用。我有点误读了你原来的问题。我发布了另一个应该更切题的答案。我尝试了这个,但它不起作用。在Ubuntu 14.04上使用emacs 24.3.1。有什么建议吗?@sanatana很难提出任何关于“它不起作用”的建议作为唯一的信息。到底什么不起作用?当您按下
C-q PageDown
时,Emacs是否会像答案中所述插入控制序列?@Thomas是的,Emacs会在.Emacs文件中插入两个键“^[[6~”和“^[[5~”。我还尝试用[PageDown]替换[next]。行为没有任何变化。我使用的gtags绑定了M-[查找标记(参考)。当我按PageUp时,它会在小缓冲区中显示“查找标记(参考):(默认)5~”。它仍然不会将PageUp解释为一个键。这是当我以“emacs-nw”启动emacs时。它在窗口模式下工作正常。