Apakah mungkin untuk mendapatkan string yang cocok setelah memanggil: search ()

14

Dalam fungsi vimscript, saya perlu menetapkan string yang cocok ke variabel l:matchedsetelah memanggil search()dan saya bertanya-tanya apakah ada cara yang lebih pendek dari apa yang saya lakukan saat ini:

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)

Idealnya, saya ingin sesuatu seperti

let l:matched = search_text(l:pattern)

Withouth beralih ke getline(). Apakah ada fungsi vim yang sepertinya tidak dapat saya temukan?

René Nyffenegger
sumber
1
Sayangnya, jawabannya tidak.
Sato Katsura
1
protip: variabel lokal adalah fungsi default di dalam sehingga Anda mungkin bisa melupakan l:deklarasi namespace.
Peter Rincker
1
dalam suatu fungsi Anda mungkin dapat melakukan: :let @/="pattern" | norm! ygndan memiliki konten dalam register 0 tersedia.
Christian Brabandt

Jawaban:

7

Karena kursor ditempatkan pada huruf pertama pertandingan, Anda mungkin dapat melakukan :normal! y$setelah pencarian, dan mendapatkan konten register dalam variabel lokal Anda.

Pendekatan lain, yang saya pikir akan bekerja di sini dengan sangat baik, akan digunakan :substitutedengan nbendera (yaitu tanpa substitusi yang sebenarnya ):

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

... dan yang Anda sebut seperti ini:

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

Ini praktis membuat ActOnfungsi panggilan balik - itu akan dievaluasi untuk setiap pertandingan.

VanLaser
sumber
1
Catatan: :sdengan sub-ganti-ekspresi dan nbendera hanya tersedia sejak Vim 7.3.627+. Kalau tidak, Anda perlu melakukan substitusi sebenarnya (lumpuh karena ini akan menandai buffer telah dimodifikasi). Anda mungkin juga ingin menyimpan dan mengembalikan register pencarian @/,, atau menggunakan :keeppatterns.
Peter Rincker
1
Harap perbaiki kesalahan ketik: keeppaterns-> keeppatterns. Ini yang menyebabkan E488: Trailing charactersagak sulit untuk melacak kembali ke penyebabnya. Terima kasih!
artemave