เป็นไปได้ที่จะได้รับสายที่ตรงกันหลังจากโทร: ค้นหา ()


14

ในฟังก์ชั่น vimscript ฉันต้องกำหนดสตริงที่จับคู่ให้กับตัวแปร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)

withouth getline()หันไป มีฟังก์ชั่นที่เป็นกลุ่มที่ฉันดูเหมือนไม่สามารถหาได้หรือไม่?


1
น่าเศร้าคำตอบคือไม่
Sato Katsura

1
protip: ตัวแปรท้องถิ่นเป็นค่าเริ่มต้นภายในฟังก์ชั่นดังนั้นคุณอาจทิ้งการl:ประกาศเนมสเปซได้
Peter Rincker

1
ในฟังก์ชั่นที่คุณสามารถทำได้: :let @/="pattern" | norm! ygnและมีเนื้อหาใน register 0 ที่พร้อมใช้งาน
Christian Brabandt

คำตอบ:


7

เนื่องจากเคอร์เซอร์วางอยู่บนตัวอักษรตัวที่ 1 ของการแข่งขันคุณอาจจะ: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ด้วย sub-replace-expression และการnตั้งค่าสถานะสามารถใช้ได้ตั้งแต่ Vim 7.3.627+ มิฉะนั้นคุณต้องทำการทดแทนจริง ๆ (เช่นนี้จะทำเครื่องหมายว่าบัฟเฟอร์เป็นการแก้ไข) คุณอาจยังต้องการที่จะบันทึกและเรียกคืนการลงทะเบียนการค้นหาหรือการใช้งาน@/ :keeppatterns
Peter Rincker

1
โปรดแก้ไขพิมพ์ผิดไปนี้: ->keeppaterns keeppatternsมันเป็นสาเหตุE488: Trailing charactersที่ค่อนข้างยุ่งยากในการติดตามกลับไปที่สาเหตุ ขอบคุณ!
artemave
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.