เมื่อไม่นานมานี้ฉันตัดสินใจที่จะเรียนรู้เพิ่มเติมเกี่ยวกับการทำงานของไฟล์ไวยากรณ์ของ vim โดยการสร้างของฉันเอง เป้าหมายของฉันคือการสร้างไฟล์ไวยากรณ์อย่างง่ายที่จะแบ่งไฟล์ออกเป็น 3 ส่วนตามตัวคั่นและรวมไฟล์ไวยากรณ์ที่มีอยู่ล่วงหน้าสำหรับสองในสามส่วนนั้น
นี่คือไฟล์ตัวอย่าง:
Some text, unstyled
==================== Log
(Output of git log)
==================== Diff
(Output of diff)
เป้าหมายคือนำไปใช้git.vim
กับบันทึกและdiff.vim
เพียงส่วนต่างไม่รวมสองหัว 1 นี่คือสิ่งที่ไฟล์ไวยากรณ์ของฉันดูเหมือน:
if exists("b:current_syntax")
finish
endif
syntax include @gitlog $VIMRUNTIME/syntax/git.vim
syntax region GitLog
\ start=/^===* Log/
\ end=/^===* Diff/
\ contains=@gitlog
syntax include @gitdiff $VIMRUNTIME/syntax/diff.vim
syntax region Diff
\ start=/^===* Diff/
\ end=/\n\n/
\ contains=@gitdiff
let b:current_syntax = "logdiff"
โปรดทราบว่าend
ในภูมิภาคแรกจะเหมือนกับstart
ภูมิภาคที่สองอย่างไร มันใช้งานไม่ได้ เห็นได้ชัดว่าไม่พบบริเวณที่สองและไม่ใช้การเน้นไวยากรณ์
ฉันสามารถทำให้มันทำงานโดยคลาย regex ไปend=/^===/
และstart=/=== Diff/
เพื่อไม่ให้ภูมิภาคสัมผัส แต่โดยเฉพาะอย่างยิ่ง - มันชัดเจนน้อยลงว่าควรจะเริ่มต้นที่ปลายอีกด้าน
มีวิธีให้สองคำจำกัดความภูมิภาคสัมผัสอักขระเดียวกัน (และ / หรือทำให้การจับคู่ขอบพิเศษแทนรวม) หรือฉันติดอยู่กับ loex regex?
1 (ใช่ฉันรู้ว่าgit.vim
มีdiff.vim
แต่นี่คือแบบฝึกหัดการเรียนรู้)
:h :syn-pattern-offset
) หรือโดยการเปลี่ยนภูมิภาค GitLog เพื่อขยายไปยังจุดสิ้นสุดของไฟล์และภูมิภาค Diff จะอยู่ในภูมิภาค GitLog ทั้งหมด . อย่างไรก็ตามฉันไม่สามารถใช้วิธีการใดวิธีการหนึ่งต่อไปนี้