Ist es möglich, die übereinstimmende Zeichenfolge nach dem Aufruf von search () abzurufen?

14

In einer Vimscript-Funktion muss ich einer Variablen l:matchednach dem Aufruf einen passenden String zuweisen search()und frage mich, ob es einen kürzeren Weg gibt als den, den ich gerade mache:

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)

Im Idealfall möchte ich so etwas

let l:matched = search_text(l:pattern)

ohne Rückgriff auf getline(). Gibt es eine solche vim-Funktion, die ich anscheinend nicht finden kann?

René Nyffenegger
quelle
1
Leider lautet die Antwort nein.
Sato Katsura
1
protip: lokale Variablen sind die Standardeinstellungen in Funktionen, sodass Sie wahrscheinlich auf die l:Namespace-Deklaration verzichten können .
Peter Rincker
1
In einer Funktion können Sie wahrscheinlich Folgendes tun: :let @/="pattern" | norm! ygnund den Inhalt in Register 0 verfügbar haben.
Christian Brabandt

Antworten:

7

Da sich der Cursor auf dem ersten Buchstaben der Übereinstimmung befindet, könnten Sie wahrscheinlich :normal! y$nach der Suche eine ausführen und den Registerinhalt in Ihrer lokalen Variablen abrufen.

Ein anderer Ansatz, von dem ich denke, dass er hier sehr gut funktionieren würde, wäre die Verwendung :substitutemit der nFlagge (dh ohne tatsächliche Ersetzung):

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

... und was du so nennst:

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

Das macht praktisch ActOneine Rückruffunktion - es wird für jedes Match ausgewertet.

VanLaser
quelle
1
Hinweis: :smit einem Sub- nReplace -Ausdruck und dem Flag ist nur ab Vim 7.3.627+ verfügbar. Andernfalls müssen Sie eine tatsächliche Ersetzung vornehmen (da dies den Puffer als geändert markiert). Sie möchten wahrscheinlich auch das Suchregister speichern und wiederherstellen @/oder verwenden :keeppatterns.
Peter Rincker
1
Bitte korrigieren Sie den Tippfehler: keeppaterns-> keeppatterns. Es ist eine E488: Trailing charactersUrsache , die ziemlich schwierig ist, auf die Ursache zurückzugehen. Vielen Dank!
Artemave