क्या कॉलिंग के बाद मिलान स्ट्रिंग प्राप्त करना संभव है: खोज ()


15

एक विमिस्क्रिप्ट-फ़ंक्शन में, मुझे l:matchedकॉल करने के बाद एक मिलान किए गए स्ट्रिंग को एक वैरिएबल में असाइन करने की आवश्यकता होती है search()और मैं सोच रहा हूं कि क्या मैं वर्तमान में कर रहा हूँ की तुलना में एक छोटा तरीका है:

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)

आदर्श रूप से, मुझे कुछ ऐसा चाहिए

let l:matched = search_text(l:pattern)

के साथ सहारा लेना getline()। क्या ऐसा कोई विम फंक्शन है जो मुझे लगता है कि नहीं मिल पा रहा है?


1
अफसोस की बात है कि इसका जवाब नहीं है।
सातो कैटुरा

2
प्रोटिप: स्थानीय चर कार्यों के अंदर डिफ़ॉल्ट होते हैं इसलिए आप शायद l:नाम स्थान की घोषणा को वापस कर सकते हैं ।
पीटर रिंकेर

2
एक समारोह में आप शायद कर सकते हैं: :let @/="pattern" | norm! ygnऔर रजिस्टर में सामग्री उपलब्ध 0 है।
क्रिश्चियन ब्रेबांट

जवाबों:


7

चूंकि कर्सर को मैच के पहले अक्षर पर रखा गया है, आप शायद :normal! y$खोज के बाद कर सकते हैं, और अपने स्थानीय चर में रजिस्टर सामग्री प्राप्त कर सकते हैं।

एक और दृष्टिकोण, जो मुझे लगता है कि यहां बहुत अच्छी तरह से काम करेगा, ध्वज के :substituteसाथ उपयोग करना होगा n(अर्थात वास्तविक प्रतिस्थापन के बिना ):

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

... और जिसे आप इस तरह कहते हैं:

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

यह व्यावहारिक रूप से ActOnकॉलबैक फ़ंक्शन करता है - इसका मूल्यांकन प्रत्येक मैच के लिए किया जाएगा।


1
नोट: :sउप-प्रतिस्थापित-अभिव्यक्ति और nध्वज केवल Vim 7.3.627+ के बाद से उपलब्ध है। अन्यथा आपको वास्तव में प्रतिस्थापन करने की आवश्यकता है (लंगड़ा के रूप में यह बफर को संशोधित के रूप में चिह्नित करेगा)। आप शायद खोज रजिस्टर को सहेजना और पुनर्स्थापित करना चाहते हैं @/, या उपयोग करना चाहते हैं :keeppatterns
पीटर रिंकेर

2
कृपया टाइपो ठीक करें: keeppaterns-> keeppatterns। यह कारण है E488: Trailing charactersजो कारण के लिए वापस ट्रेस करने के लिए मुश्किल है। धन्यवाद!
कलामेव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.