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

时间:2010-01-27 09:01:28

标签: emacs viper viper-mode vimpulse

我正在使用Colemak键盘布局,并希望使用Vimpulse从here尝试Vim布局。但是,布局重新映射命令前缀Vim键'c'和'd'等等,并且这些键似乎不能使用标准Viper key remap命令轻松重映射。它们都映射到viper键映射中的“viper-command-argument”,实际的键函数似乎在Viper源的其他地方定义。

是否有更简单的方法将前缀命令重新绑定到其他键,而不是分配Viper源的本地副本并重新定义其中的魔术前缀键值?

2 个答案:

答案 0 :(得分:2)

Viper-mode命令前缀密钥通过两组间接设置。您找到了第一个,因为所有命令键都绑定到'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-prefix-arg-com的编码方式,如果不重新定义,就无法进行所需的更改。 viper-mode可能有3或4种其他不同类型的vi命令(这一个是'命令参数)。希望其他人更直接地重新定位...

答案 1 :(得分:1)

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