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 に答える
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 に答える