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

时间:2011-07-11 12:27:39

标签: emacs

我在标准的emacs-nox和emacs-gtk中找到了很大的区别。 我知道emacs控制台版本(emacs-nox)的某些键有问题(例如Shift-Tab - ),但是没有PageDown。

当我有空的.emacs文件,并尝试识别由PageDown键运行的命令名(由Ch c)时,emacs-nox emacs-gtk正常工作 - 推送PageDown进行向上滚动,并且Ch c PageDown打印滚动 - 在迷你缓冲区。

当我尝试绑定“M- [”键时出现问题。 在.emacs中,我只有一个陈述:

(global-set-key (kbd "M-[") 'hippie-expand)

emacs-nox无法识别按键运行的命令名称 - 当C-h c PageDown时,它不会在迷你缓冲区中打印任何内容,并且会将缓冲区缓冲为“~6”。 当我尝试     C-h k PageDown 我得到: M- [运行命令hippie-expand

emacs-gtk正常工作 - 推送PageDown进行向上滚动,C-h c PageDown打印向上滚动迷你缓冲区。

所以我猜emacs nox将PageDown视为M- [并添加额外的东西。

知道如何在emacs-nox中修复此问题吗?

我使用emacs v23.2

编辑:

我测试了其他案例:在.emacs我只有:     (global-set-key(kbd“”)'hippie-expand) 并且C-h c PageDown和C-h k PageDown都能正常工作(打印嬉皮 - 扩展),当在缓冲区中我推送PageDown也很好。

2 个答案:

答案 0 :(得分:6)

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

C-v M - [

你应该在终端窗口看到这样的东西:

^[[

如果您输入

C-v PageDown

你应该看到

^[[6~

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

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

我认为改变这种情况的唯一方法是说服终端为这些密钥发送不同的序列。但更简单的方法就是使用与 M不同的捷径 - [。 (我建议 M - / 。)

答案 1 :(得分:1)

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

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

(unless window-system
  (define-key input-decode-map "" [next])
  (define-key input-decode-map "" [prior]))

然后在前两个""字符之间移动光标并输入 Cq PageDown ,然后在下面一行中的""之间移动它并输入 Cq PageUp 。结果应如下所示:

(unless window-system
  (define-key input-decode-map "^[[6~" [next])
  (define-key input-decode-map "^[[5~" [prior]))

但请注意^[只是一个字符(转义) - 这就是为什么你不能简单地复制&amp;从这个答案中粘贴它。

重启emacs-nox后,按键是否正常工作?