10

我正在尝试在 Evil 中创建一个新的文本对象。例如,文本对象iw将只选择包含连字符的字符串子集。我希望新的文本对象匹配任何非空格字符的单词。到目前为止我得到的是:

(evil-define-text-object evil-inner-space (count &optional beg end type)
  "Select inner space."
  :extend-selection nil
  (evil-regexp-range count beg end type "[ \n]" " " t))

(define-key evil-inner-text-objects-map " " 'evil-inner-space)

此代码无法正确匹配行尾的单词。由于\n,它适用于行首的单词。

我尝试了很多没有用的东西。对我来说麻烦的是,当某些东西不起作用时,我不知道是由于错误的正则表达式还是邪恶正则表达式范围的限制。例如,使用 \s- 会报错,这似乎是 Evil 中的一个限制。

4

3 回答 3

20

更新evil-regexp-range最近被替换为evil-select-paren. 这适用于当前的邪恶,并且与旧的用法相同:

(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)))))

用法:

; 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")

(这比你想要的要多,但我会把它留在这里以防它帮助某人:)

于 2014-03-15T02:58:57.303 回答
10

我认为您不需要创建新的文本对象。Evil 包括符号文本对象。符号语法由主模式定义,通常包括连字符、数字、下划线和其他非空白字符。

符号文本对象绑定到o。定义位于 Bitbucket 的 evil-maps.el

于 2014-07-31T19:54:09.783 回答
1

正确的正则表达式是“\|.?$”。下面的代码实现了一个匹配任何非空格字符的新文本对象。

(evil-define-text-object evil-inner-space (count &optional beg end type)
  "Select inner space."
  :extend-selection nil
  (evil-regexp-range count beg end type "[ \n]" " \\|.?$" t))
于 2013-09-08T19:59:10.693 回答