我看到像邪恶变化或邪恶删除这样的函数在邪恶视觉状态的视觉区域的开头和结尾处。 我查看过" evil-commands.el"中的源代码。这些功能,但他们的乞求'并且'结束'参数似乎无处不在。而一些(如下面的那个)甚至不是互动的。
为什么会这样,以及我如何在自己的方法中做同样的事情?
以下是我看过的其中一种方法的示例:
;; Defined in ~/.emacs.d/elpa/evil-20170712.2350/evil-commands.el
(evil-define-operator evil-invert-char (beg end type)
"Invert case of character."
:motion evil-forward-char
(if (eq type 'block)
(evil-apply-on-block #'evil-invert-case beg end nil)
(evil-invert-case beg end)
(when evil-this-motion
(goto-char end)
(when (and evil-cross-lines
evil-move-cursor-back
(not evil-move-beyond-eol)
(not (evil-visual-state-p))
(not (evil-operator-state-p))
(eolp) (not (eobp)) (not (bolp)))
(forward-char)))))
答案 0 :(得分:1)
evil-invert-char
未定义使用常规defun
,而是使用宏evil-define-operator
,可在evil-macros.el
中找到。使用M-x describe-function RET evil-define-operator RET
:
evil-define-operator is a Lisp macro in ‘evil-macros.el’.
(evil-define-operator OPERATOR (BEG END ARGS...) DOC [[KEY VALUE]...] BODY...)
Define an operator command OPERATOR.
您可以使用优秀的macrostep
模式(在我的Spacemacs中绑定到, d m
,在emacs-lisp-mode
中)展开evil-define-operator
。第一次展开会将evil-define-operator
- 宏重写为evil-define-command
- 宏,其中包含对interactive
的调用。由于这个宏展开是由elisp解释器完成的,或者在字节编译之前完成,因此可以使用宏插入的BEG
调用来分配变量END
和interactive
。