【问题标题】:How can I remap the prefix keys 'c', 'd' etc. in Emacs viper-mode如何在 Emacs viper-mode 中重新映射前缀键 'c'、'd' 等
【发布时间】:2010-01-27 09:01:28
【问题描述】:

我正在使用 Colemak 键盘布局,并想通过 Vimpulse 尝试来自 here 的 Vim 布局。但是,布局重新映射命令前缀 Vim 键 'c' 和 'd' 等,这些键似乎不容易用标准 Viper 键重新映射命令重新映射。它们都映射到 viper 键盘映射中的“viper-command-argument”,而实际的键功能似乎在 Viper 源的其他地方定义。

有没有比复制我的 Viper 源的本地副本并在其中重新定义魔术前缀键值更简单的方法来将前缀命令重新绑定到其他键?

【问题讨论】:

    标签: emacs viper viper-mode vimpulse


    【解决方案1】:

    Viper 模式命令前缀键是通过两组间接设置的。您找到了第一个,因为所有命令键都绑定到'viper-command-argument。接下来要做的是查找变量viper-exec-array。目前是这样设置的:

    (aset viper-exec-array ?c 'viper-exec-change)
    (aset viper-exec-array ?C 'viper-exec-Change)
    (aset viper-exec-array ?d 'viper-exec-delete)
    (aset viper-exec-array ?D 'viper-exec-Delete)
    (aset viper-exec-array ?y 'viper-exec-yank)
    (aset viper-exec-array ?Y 'viper-exec-Yank)
    (aset viper-exec-array ?r 'viper-exec-dummy)
    (aset viper-exec-array ?! 'viper-exec-bang)
    (aset viper-exec-array ?< 'viper-exec-shift)
    (aset viper-exec-array ?> 'viper-exec-shift)
    (aset viper-exec-array ?= 'viper-exec-equals)
    

    所以,如果你想让键 t 像删除命令一样,你需要以下两件事:

    (aset viper-exec-array ?t 'viper-exec-delete)
    (define-key viper-vi-basic-map "t" 'viper-command-argument)
    

    (并且大概你会将动作从 t 重新绑定到某个地方,例如使用 c 键:

    (define-key viper-vi-basic-map "c" 'viper-goto-char-forward)
    

    最后,你必须修改例程'viper-prefix-arg-com,我不假装完全理解。话虽如此,如果您将所有?c 替换为?t,那么 t 绑定将按预期工作。 (或者,您可以添加 ?t,就像使用 ?c 一样 - 这也有效)。我会提供源代码,但它有 100 行长,而且不值得在这里包含(这是一个 4 个字符的变化)。您可以通过执行 M-x find-function viper-prefix-arg-com 找到源代码。

    长话短说,如果您想对 viper 的密钥进行大规模重新绑定,这将是一项相当大的工作量,并且您会更加熟悉 viper 源代码。

    查看'viper-prefix-arg-com 的编码方式,如果不重新定义,您就无法进行所需的更改。 viper-mode 实现的可能还有 3 或 4 种其他不同类型的 vi 命令(这个是“命令参数”)。希望其他人更容易重新绑定......

    【讨论】:

    • 我正在运行 GNU Emacs 23.1.50.1。从 emacs -q 开始以忽略我的 .emacs 配置,我执行了“M-x viper-mode”并评估了 aset ?t 示例。现在不是作为删除前缀工作,而是在 viper 模式下按 't' 打印错误:byte-code: Variable binding depth exceeds max-specpdl-size
    • @rsaarelm 确实如此,我没有注意到您还必须修改'viper-prefix-arg-com 的来源。我已经更新了我的答案。
    • 所以解决方案确实有点进入“fork Viper”领域,但至少我需要重新定义的代码数量有限。感谢您帮助集中注意力。
    【解决方案2】:

    看起来Evil-mode 甚至支持重新映射命令前缀键。我会用它来代替。

    【讨论】:

      猜你喜欢
      • 2010-10-05
      • 1970-01-01
      • 2011-03-28
      • 2013-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多