นี่คือฟังก์ชั่นที่คุณสามารถลองได้ ฉันทดสอบเพียงเล็กน้อย แต่ดูเหมือนว่าจะใช้ได้
function! JJSyntaxSearch(pattern, syntaxitem)
while search(a:pattern, 'W') > 0
for id in synstack(line("."),col("."))
if synIDattr(id,"name") =~? a:syntaxitem
return line(".")
endif
endfor
endwhile
return 0
endfunc
command! -nargs=* JJSyntaxSearch call JJSyntaxSearch(<f-args>)
ฟังก์ชันเรียกฟังก์ชันการค้นหาของ Vim ในลูปจนกว่าจะพบการจับคู่ 'สามัญ' ที่ยังมีการจับคู่ 'ที่ผ่านการรับรอง' ไปยังรายการไวยากรณ์เฉพาะหรือจนกว่าจะถึงจุดสิ้นสุดของบัฟเฟอร์
มันต้องใช้สองข้อโต้แย้ง สิ่งแรกคือรูปแบบการค้นหาและมันถูกส่งผ่านไปยังsearch()
ฟังก์ชั่นของ Vim ไม่เปลี่ยนแปลง ดู:help search()
ว่าฟังก์ชั่นนั้นทำงานอย่างไร อาร์กิวเมนต์ที่สองคือชื่อของรายการไวยากรณ์ที่คุณต้องการกรองรายการที่ตรงกันเหล่านี้ นี่อาจเป็นรูปแบบและถูกเปรียบเทียบเป็นนิพจน์ทั่วไปที่ไม่ตรงตามตัวพิมพ์ใหญ่ - เล็ก
หากต้องการค้นหารูปแบบ 'อัลฟา' ในโซนคณิตศาสตร์ที่คุณสามารถทำได้
:JJSyntaxSearch alpha texMathZone.
ที่สิ้นสุดเป็นอะตอมรูปแบบสำหรับอักขระตัวเดียวดู.
:help /.
นี้เป็นเพราะมีรายการไวยากรณ์โซนคณิตศาสตร์หลายคนเรียกtexMathZoneA
, texMathZoneB
ฯลฯ
search()
ฟังก์ชั่นย้ายเคอร์เซอร์ไปถัดไป 'สามัญ' การแข่งขัน synstack()
จากนั้นฟังก์ชั่นของเราได้รับทุกรหัสรายการไวยากรณ์สำหรับที่ตำแหน่งของเคอร์เซอร์ใหม่ที่มี วนลูปผ่านมันเรียกชื่อของแต่ละรายการในทางกลับกันและทดสอบกับsyntaxitem
อาร์กิวเมนต์ ดูและ:help synstack()
:help synIDattr()
หากมีการจับคู่ 'ที่ผ่านการรับรอง' จะส่งคืนหมายเลขบรรทัด ถ้ามันถึงจุดสิ้นสุดของบัฟเฟอร์โดยไม่ต้องค้นหาใด ๆ ที่มีคุณภาพ 0
'การแข่งขันก็จะส่งกลับ จุดของฟังก์ชั่นคือการเลื่อนเคอร์เซอร์ไปที่การแข่งขัน 'ที่ผ่านการรับรอง' ครั้งต่อไปเพื่อให้คุณสามารถดำเนินการบางอย่างได้ แต่จะมีประโยชน์ในการส่งกลับ "หมายเลขบรรทัดหรือ 0" เพื่อระบุว่ามีความหมายที่จะเรียกใช้ฟังก์ชันอีกครั้งหรือไม่ อินสแตนซ์ถ้าคุณต้องการเรียกใช้ฟังก์ชั่นซ้ำ ๆ จากฟังก์ชั่นอื่นหรือแมโคร
ฉันเลือกที่จะใช้การW
ตั้งค่าสถานะสำหรับการsearch()
ป้องกันการ 'ล้อมรอบ' จุดสิ้นสุดของบัฟเฟอร์ มิฉะนั้นฟังก์ชั่นอาจจะติดอยู่เพราะมันค้นหาการแข่งขัน 'สามัญ' ที่เหมือนกัน แต่ไม่มีการจับคู่ 'ที่ผ่านการรับรอง'