Eşleşen dizeyi çağırdıktan sonra almak mümkün mü: search ()


15

Bir vimscript işlevinde, l:matchedçağırdıktan sonra bir değişkene eşleşen bir dize atamanız gerekir search()ve şu anda ne yaptığımdan daha kısa bir yol olup olmadığını merak ediyorum:

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)

İdeal olarak, şöyle bir şey istiyorum

let l:matched = search_text(l:pattern)

olmadan başvurmak getline(). Bulamadığım bir vim işlevi var mı?


1
Ne yazık ki, cevap hayır.
Sato Katsura

2
protip: yerel değişkenler işlevlerin içindeki varsayılan değerdir, bu nedenle muhtemelen l:ad alanı bildirimini kaldırabilirsiniz .
Peter Rincker

2
bir işlevde şunları yapabilirsiniz: :let @/="pattern" | norm! ygnve 0 kaydındaki içeriğin kullanılabilir olmasını sağlayın.
Christian Brabandt

Yanıtlar:


7

İmleç eşleşmenin 1. harfine yerleştirildiğinden :normal! y$, aramadan sonra muhtemelen bir tane yapabilir ve kayıt içeriğini yerel değişkeninize alabilirsiniz.

Ben çok iyi burada işe yarar mı başka bir yaklaşım, kullanmak olacaktır :substituteile n(yani bir olmadan bayrağı fiili ikamesi):

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

... ve buna şöyle diyorsunuz:

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

Bu pratik olarak ActOnbir geri arama işlevi yapar - her maç için değerlendirilecektir.


1
Not: :sbir alt değiştirme ifadesiyle ve nbayrak yalnızca Vim 7.3.627+ sürümünden beri kullanılabilir. Aksi takdirde, gerçek bir ikame yapmanız gerekir (arabellek değiştirilmiş olarak işaretleneceğinden topal). Muhtemelen arama kaydını kaydetmek ve geri yüklemek @/veya kullanmak da istersiniz :keeppatterns.
Peter Rincker

2
Lütfen yazım hatasını düzeltin: keeppaterns-> keeppatterns. Neden olan E488: Trailing charactersbir nedene iz arkasına oldukça zor olan. Teşekkürler!
artemave
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.