邪恶模式 Emacs 中的键映射

Key mapping in Evil-mode Emacs

我是Emacs新手,一直在使用邪恶模式。我在重新映射 vim 中的某些映射时遇到了一些问题。在 vim 中,使用 map 函数很容易重新映射键。我想将 cw 重新映射到 ciw 并将 dw 重新映射到 diw。但是我对elisp了解不多。那么是否有任何插件或功能可以轻松映射。 谢谢。

首先是坏消息:在不影响其他运营商的情况下,开箱即用目​​前是不可能的。原因是 c 是一个运算符,所以 Emacs 在输入 c 后立即执行 evil-change。然后 Evil 进入 operator pending 状态并读取以下 w(或 iw)以找出正确的动作。

问题是所有运算符只有一个运算符状态,即只有一个共享键映射。因此,将 w 更改为 iw 将改变 所有 运算符的行为,而不仅仅是 cd

第一个好消息:如果这对你来说没问题,那么你可以简单地做

(define-key evil-operator-state-map "w" "iw")

现在有更好的消息了。如果您知道上面的内容,那么使用一点 Emacs lisp 魔法就可以相对容易地解决问题。传递给运算符的范围由函数 evil-operator-range 确定。如果当前运算符是 evil-changeevil-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)

实际上,此技术允许以通用方式实现特定于运算符的绑定。