Update: evil-regexp-range最近被替换为evil-select-paren https://bitbucket.org/lyro/evil/issue/454/evil-regexp-range-was-recently-removed。这适用于当前的邪恶,并且与旧的用法相同:
(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)))))
Usage:
; between dollar signs:
(define-and-bind-text-object "$" "\\$" "\\$")
; between pipe characters:
(define-and-bind-text-object "|" "|" "|")
; from regex "b" up to regex "c", bound to k (invoke with "vik" or "vak"):
(define-and-bind-text-object "k" "b" "c")
(这超出了你想要的,但我会把它留在这里,以防它对某人有帮助:)