क्या विम सिंटैक्स क्षेत्रों को स्पर्श / ओवरलैप करने के लिए बनाया जा सकता है?


13

इसलिए कुछ समय पहले मैंने यह जानने का फैसला किया था कि विम की सिंटैक्स फाइलें कैसे काम करती हैं, अपना खुद का निर्माण करके। मेरा लक्ष्य एक सरल वाक्यविन्यास फ़ाइल बनाना था जो फ़ाइल को 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) बनाने के लिए "रीजन एंड" ऑफसेट का उपयोग करके या फ़ाइल के अंत तक विस्तारित करने के लिए गिटलॉग क्षेत्र को बदलकर और डिफ क्षेत्र को पूरी तरह से गीटल क्षेत्र के अंदर करके संभव हो सकता है। । मैं इन विधियों में से किसी को भी काम करने के लिए नहीं मिल सका, हालांकि।
रिच

परीक्षण यह इस तथ्य से कुछ हद तक कठिन बना दिया गया था कि - जैसा कि आप ध्यान दें - git.vim पहले से ही हाइलाइट अलग आउटपुट है। तदनुसार अपने उदाहरण को बदलने का विचार हो सकता है!
रिच

जवाबों:


4

आप विम रेगेक्स इंजन को बता सकते हैं कि अगला मैच कहां शुरू किया जाए।

अब तक मुझे पता है कि 2 तरीके हैं:

  1. \zeएक मैच के अंत सेट करने के लिए उपयोग करें :

    syntax region GitLog
        \ start=/^===* Log/
        \ end=/\ze^===* Diff/
        \ contains=@gitlog
    
  2. सकारात्मक लुकहेड का उपयोग करें \@=, जिसे विम में मिलान-शून्य-चौड़ाई कहा जाता है:

    syntax region GitLog
        \ start=/^===* Log/
        \ end=/\(^===* Diff\)\@=/
        \ contains=@gitlog
    

तो अंत के मैच "सूचक" की शुरुआत करने के लिए rewinds की तरह ^===* Diffलाइन, जैसे कि region Diff'एस startमें इसके मिलान शुरू कर देंगे ^===* Diffफिर से लाइन।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.