2013-08-07 16 views
7

Próbuję utworzyć nowy obiekt tekstowy w Evil. Na przykład obiekt tekstowy i wybierze tylko podzbiory ciągów zawierających myślniki. Chcę, aby nowy obiekt tekstowy dopasowywał słowa do dowolnych znaków spoza przestrzeni. Do tej pory otrzymałem:Tryb Emacs Evil: jak utworzyć nowy obiekt tekstowy, aby wybrać wyrazy z dowolnymi znakami spoza przestrzeni?

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

Ten kod nie może poprawnie dopasować słów na końcu wiersza. Działa na słowa na początku wiersza dzięki \ n.

Próbowałem wielu rzeczy, które nie działały. Problem polega na tym, że gdy coś nie działa, nie wiem, czy jest to spowodowane złym wyraże- niem regexp, czy ograniczeniami zakresu zła-regexp. Na przykład użycie \ s- zgłasza błąd, który wydaje się być ograniczeniem Zła.

Odpowiedz

1

Poprawne wyrażenie regexp to "\ |.? $". Poniższy kod implementuje nowy obiekt tekstowy pasujący do dowolnego znaku spoza obszaru.

(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

Dodam, że obecne zło ma już wewnętrzny obiekt tekstowy WORD związany z "i W". – PythonNut

+0

haha ​​Nie znalazłem tego przy wyszukiwaniu w Internecie ... Powinienem przeczytać instrukcję vim jednego z tych dni. Dzięki – lionel

13

Aktualizacja: evil-regexp-range was recently replaced with evil-select-paren. Działa to na obecnym zła i ma takie samo użycie jako starego:

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

Original Odpowiedź:

Jeśli kończy się zdefiniowanie więcej niż jeden nowy obiekt tekstowy, powtarzanie może uzyskać denerwujące, zwłaszcza jeśli chcesz związać zarówno obiekty wewnętrzne, jak i zewnętrzne. Jeśli trafisz tej bariery, spróbuj tego:

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

Zastosowanie:

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

(To jest więcej niż chcieliśmy, ale będę go tu zostawić na wypadek, gdyby ktoś pomaga :)

+1

Dziękuję za to! Często żałuję, że nie mam obiektu tekstowego do np. dopasuj deklarację C++ bez chomping parens - np. pasujące '_foo :: bar :: baz _()', w tym ':', ale ignorowanie '()'. Twoje rozwiązanie sprawiło, że było to bardzo proste: '(define-and-bind-text-object" k "" [[: space:] \ (\)] "" [[: space:] \ (\)] ")'. Muchos gracias! –

+1

Wygląda na to, że 'zło-regexp-range' zostało usunięte z najnowszej wersji Zła - uważam, że musimy teraz użyć' evil –

7

Nie sądzę, że musisz utworzyć nowy obiekt tekstowy. Zło obejmuje obiekt tekstowy symbolu. Składnia symbolu jest definiowana przez tryb główny i zwykle zawiera myślniki, liczby, podkreślenia i inne znaki, które nie są spacjami.

Obiekt tekstowy symbolu jest powiązany z o. Definicja to: evil-maps.el at Bitbucket

+1

hmm no. Obiekt tekstowy, którego szukałem, jest rzeczywiście zaimplementowany w vim/evil, ale jak @PythonNut powiedział w komentarzu, jest on związany z 'W'. A w niektórych przypadkach ta implementacja działa lepiej niż opublikowane wyrażenie regularne. – lionel

+0

Lionel ma rację, to nie jest dokładnie odpowiedź na pytanie - ale 'o' jest bardzo przydatne, dzięki JoeS! –