Czy możliwe jest uzyskanie dopasowanego ciągu po wywołaniu: search ()

15

W funkcji vimscript l:matchedpo wywołaniu muszę przypisać dopasowany ciąg do zmiennej search()i zastanawiam się, czy istnieje krótszy sposób niż to, co obecnie robię:

let l:pattern   = '\v^Foo: \zs.*'
let l:line      = search(l:pattern)
let l:line_text = getline(l:line)
let l:matched   = matchstr(l:line, l:pattern)

Idealnie chciałbym coś takiego

let l:matched = search_text(l:pattern)

bez uciekania się do getline(). Czy istnieje taka funkcja vima, której wydaje się nie być w stanie znaleźć?

René Nyffenegger
źródło
1
Niestety odpowiedź brzmi „nie”.
Sato Katsura,
2
protip: zmienne lokalne są domyślnymi funkcjami, więc prawdopodobnie możesz zrezygnować z l:deklaracji przestrzeni nazw.
Peter Rincker,
2
w funkcji prawdopodobnie możesz zrobić: :let @/="pattern" | norm! ygni mieć zawartość w rejestrze 0 dostępną.
Christian Brabandt,

Odpowiedzi:

7

Ponieważ kursor jest umieszczony na pierwszej literze dopasowania, prawdopodobnie możesz zrobić :normal! y$po wyszukiwaniu i uzyskać zawartość rejestru w zmiennej lokalnej.

Innym podejściem, które, jak sądzę, zadziałałoby tutaj bardzo dobrze, byłoby użycie :substitutez nflagą (tj. Bez faktycznej zamiany):

function! ActOn(match)
    " do something with the match
    echo a:match
    " [...]
endfunction

function! FindAndCall(regex, func_name)
    execute ':keeppatterns %s/' . a:regex . '/\=' . a:func_name. '(submatch(0))/gn'
endfunction

... i które nazywacie tak:

:call FindAndCall('^Foo: \zs.*', 'ActOn')

To praktycznie stanowi ActOnfunkcję oddzwaniania - będzie oceniana dla każdego dopasowania.

VanLaser
źródło
1
Uwaga: :sz pod-wyrażeniem zamień i nflaga jest dostępna tylko od Vima 7.3.627+. W przeciwnym razie musisz dokonać rzeczywistego podstawienia (kiepskie, ponieważ oznaczy to bufor jako zmodyfikowany). Prawdopodobnie chcesz również zapisać i przywrócić rejestr wyszukiwania @/lub użyć :keeppatterns.
Peter Rincker,
2
Popraw literówkę: keeppaterns-> keeppatterns. Jest przyczyną, E488: Trailing charactersktóra jest dość trudna do odnalezienia w przyczynie. Dzięki!
artemave