È possibile ottenere la stringa corrispondente dopo aver chiamato: search ()


14

In una funzione vimscript, l:matcheddopo aver chiamato ho bisogno di assegnare una stringa corrispondente a una variabile search()e mi chiedo se c'è un modo più breve di quello che sto facendo attualmente:

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)

Idealmente, vorrei qualcosa del genere

let l:matched = search_text(l:pattern)

senza ricorrere a getline(). Esiste una funzione VIM che non riesco a trovare?


1
Purtroppo, la risposta è no.
Sato Katsura,

1
protip: le variabili locali sono quelle predefinite all'interno delle funzioni, quindi puoi probabilmente rinunciare alla l:dichiarazione dello spazio dei nomi.
Peter Rincker,

1
in una funzione puoi probabilmente fare: :let @/="pattern" | norm! ygne avere il contenuto nel registro 0 disponibile.
Christian Brabandt,

Risposte:


7

Dal momento che il cursore si trova sulla prima lettera della corrispondenza, è possibile che tu possa fare un :normal! y$dopo la ricerca e ottenere il contenuto del registro nella tua variabile locale.

Un altro approccio, che penso funzionerebbe molto bene qui, sarebbe quello di usare :substitutecon la nbandiera (cioè senza una sostituzione effettiva ):

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

... e che chiami così:

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

Questo praticamente rende ActOnuna funzione di richiamata: verrà valutata per ogni partita.


1
Nota: :scon un'espressione sub-sostituisci e il nflag è disponibile solo da Vim 7.3.627+. Altrimenti è necessario effettuare una sostituzione effettiva (zoppo in quanto questo contrassegnerà il buffer come modificato). Probabilmente vuoi anche salvare e ripristinare il registro di ricerca @/, o usare :keeppatterns.
Peter Rincker,

1
Correggi l'errore di battitura: keeppaterns-> keeppatterns. Sta causando ciò E488: Trailing charactersche è piuttosto complicato da ricondurre alla causa. Grazie!
artemave
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.