Emacs邪恶模式:如何创建一个新的文本对象来选择任何非空格字符的单词



我正在尝试在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)

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

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

更新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")

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

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

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

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

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

最新更新