如何在Emacs viper-mode中重新映射前缀键'c'、'd'等。

5
我正在使用 Colemak 键盘布局,并想尝试来自这里的 Vim 布局与 Vimpulse 配合使用。然而,该布局重新映射了命令前缀 Vim 键 'c' 和 'd' 等,这些键似乎无法轻松地通过标准的 Viper 键重映射命令进行重映射。它们在 viper 键映射中都被映射到 "viper-command-argument",而实际的键功能似乎在 Viper 源代码的其他位置定义。

是否有一种更简单的方法可以将前缀命令重新绑定到其他键上,而不是分叉我的本地 Viper 源代码并在其中重新定义魔术前缀键值?

2个回答

3

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绑定将按预期工作。(或者,您可以像使用?c一样“添加”?t - 这也有效)。 我会提供源代码,但它有100行,不值得在此处包含(这是一个四个字符的更改)。 您可以通过执行M-x find-function viper-prefix-arg-com来获取源代码。
长话短说,如果您想要对viper进行全面的重新绑定键,则需要大量的工作,并且您将更加熟悉viper源代码。
查看'viper-prefix-arg-com的编码方式,您无法在重新定义它的情况下进行所需的更改。 Viper-mode实现了可能有3或4种不同类型的vi命令(其中之一是“command-argument”)。 其他命令应该更容易重新绑定...

我正在运行GNU Emacs 23.1.50.1。使用emacs -q启动它以忽略我的.emacs配置,我执行了“M-x viper-mode”并评估了aset ?t示例。现在,在viper-mode中按下't'键不再起作为删除前缀的作用,而是会打印错误:byte-code: Variable binding depth exceeds max-specpdl-size - rsaarelm
@rsaarelm,我没注意到你还需要修改“viper-prefix-arg-com”的源代码。我已经更新了我的答案。 - Trey Jackson
所以解决方案有点涉及到“分叉Viper”的领域,但至少我只需要重新定义一小部分代码。感谢你帮助集中注意力。 - rsaarelm

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接