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?


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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.