更新:
evil-regexp-range
最近被替换为 evil-select-paren
。这适用于当前的 evil,并且与旧版具有相同的用法:
(defmacro define-and-bind-text-object (key start-regex end-regex)
(let ((inner-name (make-symbol "inner-name"))
(outer-name (make-symbol "outer-name")))
`(progn
(evil-define-text-object ,inner-name (count &optional beg end type)
(evil-select-paren ,start-regex ,end-regex beg end type count nil))
(evil-define-text-object ,outer-name (count &optional beg end type)
(evil-select-paren ,start-regex ,end-regex beg end type count t))
(define-key evil-inner-text-objects-map ,key (quote ,inner-name))
(define-key evil-outer-text-objects-map ,key (quote ,outer-name)))))
如果你需要定义多个文本对象的话,重复操作可能会变得烦人,特别是当你想要绑定内部和外部对象时。如果你遇到这种情况,请尝试以下方法:
(defmacro define-and-bind-text-object (key start-regex end-regex)
(let ((inner-name (make-symbol "inner-name"))
(outer-name (make-symbol "outer-name")))
`(progn
(evil-define-text-object ,inner-name (count &optional beg end type)
(evil-regexp-range count beg end type ,start-regex ,end-regex t))
(evil-define-text-object ,outer-name (count &optional beg end type)
(evil-regexp-range count beg end type ,start-regex ,end-regex nil))
(define-key evil-inner-text-objects-map ,key (quote ,inner-name))
(define-key evil-outer-text-objects-map ,key (quote ,outer-name)))))
使用方法:
(define-and-bind-text-object "$" "\\$" "\\$")
(define-and-bind-text-object "|" "|" "|")
(define-and-bind-text-object "k" "b" "c")
(这里提供的内容可能超出您的需求,但如果有助于他人,我会保留下来 :))
_foo::bar::baz_()
,包括:
但忽略()
。你的解决方案使这变得非常容易:(define-and-bind-text-object "k" "[[:space:]\(\)]" "[[:space:]\(\)]")
。非常感谢! - Kevin Usheyevil-regexp-range
已经从最新版本的 Evil 中删除了 -- 我相信现在我们需要使用evil
。 - Kevin Ushey