【问题标题】:Why emacs confuse PageDown (<next>) key with M-[?为什么 emacs 将 PageDown (<next>) 键与 M-[ 混淆?
【发布时间】:2011-10-02 18:23:05
【问题描述】:

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

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

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

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

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

emacs-gtk 正常工作 - 按下 PageDown 会向上滚动,而 C-h c PageDown 在 minibuffer 中打印向上滚动。

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

知道如何在 emacs-nox 中解决这个问题吗?

我使用 emacs v23.2

编辑:

我测试了其他情况:在 .emacs 中我只有: (global-set-key (kbd "") 'hippie-expand) 并且 C-h c PageDown 和 C-h k PageDown 都可以正常工作(打印 hippie-expand),当在缓冲区中时,我推送 PageDown 也可以正常工作。

【问题讨论】:

    标签: emacs


    【解决方案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]))
    

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

    重启 emacs-nox 后密钥是否有效?

    【讨论】:

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

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

    C-v M-[

    您应该在终端窗口中看到类似这样的内容:

    ^[[
    

    如果你输入

    C-v PageDown

    你应该看到

    ^[[6~
    

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-01
      • 1970-01-01
      • 2012-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多