邪恶模式 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
将改变 所有 运算符的行为,而不仅仅是 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)
实际上,此技术允许以通用方式实现特定于运算符的绑定。
我是Emacs新手,一直在使用邪恶模式。我在重新映射 vim 中的某些映射时遇到了一些问题。在 vim 中,使用 map
函数很容易重新映射键。我想将 cw
重新映射到 ciw
并将 dw
重新映射到 diw
。但是我对elisp了解不多。那么是否有任何插件或功能可以轻松映射。
谢谢。
首先是坏消息:在不影响其他运营商的情况下,开箱即用目前是不可能的。原因是 c
是一个运算符,所以 Emacs 在输入 c
后立即执行 evil-change
。然后 Evil 进入 operator pending 状态并读取以下 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)
实际上,此技术允许以通用方式实现特定于运算符的绑定。