Dans une fonction vimscript, j'ai besoin d'affecter une chaîne correspondante à une variable l:matched
aprè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?
l:
déclaration d'espace de noms.:let @/="pattern" | norm! ygn
et avoir le contenu dans le registre 0 disponible.Réponses:
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
:substitute
avec len
drapeau (c'est-à-dire sans substitution réelle ):... et que vous appelez comme ceci:
Cela fait pratiquement
ActOn
une fonction de rappel - elle sera évaluée pour chaque correspondance.la source
:s
avec une sous-expression de remplacement et l'n
indicateur 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
.keeppaterns
->keeppatterns
. Il s'agit d'une causeE488: Trailing characters
qui est plutôt délicate à remonter à la cause. Merci!