इसलिए कुछ समय पहले मैंने यह जानने का फैसला किया था कि विम की सिंटैक्स फाइलें कैसे काम करती हैं, अपना खुद का निर्माण करके। मेरा लक्ष्य एक सरल वाक्यविन्यास फ़ाइल बनाना था जो फ़ाइल को 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/
है, ताकि क्षेत्रों को छूने नहीं है, लेकिन विशेष रूप से उस तरह नहीं है - यह कम स्पष्ट है कि एक जहां शुरू करने के लिए अन्य समाप्त होता है माना जाता है है।
क्या दो क्षेत्रों की परिभाषाओं को एक ही वर्ण को छूने की अनुमति देने का एक तरीका है (और / या मेल खाने वाले किनारों को समावेशी के बजाय अनन्य बना सकता है) या क्या मैं शिथिल रेगेक्स के साथ फंस गया हूं?
1 (हां, मुझे पता है कि git.vim
इसमें शामिल हैं diff.vim
, लेकिन यह सीखने का अभ्यास था)
:h :syn-pattern-offset
) बनाने के लिए "रीजन एंड" ऑफसेट का उपयोग करके या फ़ाइल के अंत तक विस्तारित करने के लिए गिटलॉग क्षेत्र को बदलकर और डिफ क्षेत्र को पूरी तरह से गीटल क्षेत्र के अंदर करके संभव हो सकता है। । मैं इन विधियों में से किसी को भी काम करने के लिए नहीं मिल सका, हालांकि।