Est-il possible d'obtenir la chaîne correspondante après avoir appelé: search ()

14

Dans une fonction vimscript, j'ai besoin d'affecter une chaîne correspondante à une variable l:matchedaprès l'appel search()et je me demande s'il y a un moyen plus court que ce que je fais actuellement:

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)

Idéalement, je voudrais quelque chose comme

let l:matched = search_text(l:pattern)

sans recourir à getline(). Existe-t-il une telle fonction vim que je semble incapable de trouver?

René Nyffenegger
la source
1
Malheureusement, la réponse est non.
Sato Katsura
1
protip: les variables locales sont la valeur par défaut à l'intérieur des fonctions, vous pouvez donc probablement renoncer à la l:déclaration d'espace de noms.
Peter Rincker
1
dans une fonction que vous pouvez probablement faire: :let @/="pattern" | norm! ygnet avoir le contenu dans le registre 0 disponible.
Christian Brabandt

Réponses:

7

Puisque le curseur est placé sur la 1ère lettre de la correspondance, vous pourriez probablement faire un :normal! y$après la recherche et obtenir le contenu du registre dans votre variable locale.

Une autre approche, qui je pense fonctionnerait très bien ici, serait d'utiliser :substituteavec le ndrapeau (c'est-à-dire sans substitution réelle ):

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

... et que vous appelez comme ceci:

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

Cela fait pratiquement ActOnune fonction de rappel - elle sera évaluée pour chaque correspondance.

VanLaser
la source
1
Remarque: :savec une sous-expression de remplacement et l' nindicateur n'est disponible que depuis Vim 7.3.627+. Sinon, vous devez effectuer une substitution réelle (boiteux car cela marquera le tampon comme modifié). Vous souhaitez probablement également enregistrer et restaurer le registre de recherche @/, ou utiliser :keeppatterns.
Peter Rincker
1
Veuillez corriger la faute de frappe: keeppaterns-> keeppatterns. Il s'agit d'une cause E488: Trailing charactersqui est plutôt délicate à remonter à la cause. Merci!
artemave