我是Emacs的新手并且一直在使用邪恶模式。我在重新映射一些我在vim中的映射时遇到了一些麻烦。在vim中,使用map
函数重新映射密钥很容易。我想将cw
重新映射到ciw
,将dw
重新映射到diw
。但我对elisp没有多少了解。那么是否有任何允许轻松映射的插件或功能。
感谢。
答案 0 :(得分:3)
首先是坏消息:开箱即用,如果不影响其他运营商,目前这是不可能的。原因是c
是一个运算符,因此只要输入evil-change
,Emacs就会执行c
。然后Evil进入操作员暂挂状态,并读取以下w
(或iw
)以找出正确的动作。
问题是所有运算符只有一个运算符状态,即只有一个共享键映射。因此,将w
更改为iw
将改变所有运算符的行为,不仅仅是c
或d
。
第一个好消息:如果这对你没问题,那么你就可以做到
(define-key evil-operator-state-map "w" "iw")
现在更好的消息。如果您知道上面的内容,那么使用一点Emacs lisp魔法解决问题相对容易。传递给运算符的范围由函数evil-operator-range
确定。我们的想法是建议此功能,并在当前运算符为evil-change
或evil-delete
时临时更改键绑定。您可以在几个候选键盘中放置新绑定,但evil-operator-state-local-map
是合理的选择。
(defun my/evil-motion-range (orig-fun &rest args)
(if (not (memq this-command '(evil-delete evil-change)))
(apply orig-fun args)
(let* ((orig-keymap evil-operator-state-local-map)
(evil-operator-state-local-map (copy-keymap orig-keymap)))
(define-key evil-operator-state-local-map "w" "iw")
(apply orig-fun args))))
(advice-add 'evil-operator-range :around #'my/evil-motion-range)
实际上,这种技术允许以通用方式实现运营商特定的绑定。