2013-08-07 4 views
7

Ich versuche, ein neues Textobjekt in Evil zu erstellen. Zum Beispiel wird das Textobjekt iw nur Teilmengen von Strings auswählen, die Bindestriche enthalten. Ich möchte, dass das neue Textobjekt Wörter mit beliebigen Nicht-Leerzeichenzeichen abgleicht. Was ich bis jetzt bekommen habe ist:Emacs Evil-Modus: Wie erstellt man ein neues Textobjekt, um Wörter mit beliebigen Nicht-Leerzeichen auszuwählen?

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

Dieser Code stimmt nicht überein Wörter am Ende einer Zeile korrekt zu entsprechen. Es funktioniert für Wörter am Anfang einer Zeile dank \ n.

Ich habe viele Dinge versucht, die nicht funktionierten. Das Problem für mich ist, dass, wenn etwas nicht funktioniert, ich nicht weiß, ob es aufgrund einer falschen Regexp oder Einschränkungen im Bösen-Regexp-Bereich ist. Zum Beispiel meldet die Verwendung von \ s - einen Fehler, der im Bösen eine Einschränkung darstellt.

Antwort

1

Die richtige Regexp ist "\ |.? $". Der folgende Code implementiert ein neues Textobjekt, das einem beliebigen Nicht-Leerzeichen entspricht.

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

Ich füge hinzu, dass das aktuelle Übel bereits ein inneres WORD Textobjekt an "i W" gebunden hat. – PythonNut

+0

haha ​​Ich habe das bei Websuchen nicht gefunden ... Ich sollte eines Tages das vim-Handbuch lesen. Danke – lionel

13

aktualisieren: evil-regexp-range was recently replaced with evil-select-paren. Dies funktioniert auf dem gegenwärtigen Übel und hat die gleiche Nutzung wie die alten:

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

Ursprüngliche Antwort:

Wenn Sie mehr als ein neues Textobjekt am Ende definieren, kann die Wiederholung bekommen ärgerlich, vor allem, wenn Sie sowohl innere als auch äußere Objekte binden wollen. Wenn Sie diese Barriere treffen, versuchen Sie dies:

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

Verbrauch:

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

(Dies ist mehr als man wollte, aber ich werde es hier lassen, falls es jemand hilft :)

+1

Danke für das! Ich habe mich oft gewünscht, dass ich ein Textobjekt z. Übereinstimmung mit C++ - Deklaration ohne Chomping-Paren - z. passend zu '_foo :: bar :: baz _()', einschließlich ':' aber ignoriert '()'. Ihre Lösung hat dies sehr einfach gemacht: '(define-and-bind-text-object" k "" [[: Leerzeichen:] \ (\)] "" [[: Leerzeichen:] \ (\)] ")'. Muchos Gracias! –

+1

Es sieht so aus, als ob "evil-regexp-range" aus den neuesten Versionen von Evil entfernt wurde - ich glaube, wir müssen nun 'evil –

7

Ich glaube nicht, dass Sie ein neues Textobjekt erstellen müssen. Evil enthält das Symboltextobjekt. Die Symbolsyntax wird durch den Hauptmodus definiert und enthält normalerweise Bindestriche, Zahlen, Unterstriche und andere Nicht-Leerzeichen.

Das Symboltextobjekt ist an o gebunden. Die Definition ist um evil-maps.el at Bitbucket

+1

hmm no. Das Textobjekt, nach dem ich gesucht habe, ist tatsächlich in vim/evil implementiert, aber wie @PythonNut in einem Kommentar sagte, ist es an 'W' gebunden. Und in einigen Fällen funktioniert diese Implementierung besser als die von mir gepostete Version. – lionel

+0

lionel ist richtig, das beantwortet die Frage nicht genau - aber 'o' ist sehr nützlich, danke JoeS! –

Verwandte Themen