2011-11-23 19 views
5

मैं vim पर एक वाक्य रचना फ़ाइल को लागू कर रहा हूँ पर एक मैच के लिए पर प्रकाश डाला इसविम वाक्य रचना कई लाइनों

| text at level 1 
| | text at level 2 
| | text at level 2 
| | | text at level 3 
| text at level 1 

उदाहरण के लिए की तरह एक पदानुक्रम उजागर करने के लिए मैं

syn match myMatch +^\(| \)\++ 

का उपयोग स्तर संकेतक पर प्रकाश डाला। हालांकि, मैं इन

| text at level 1 
| | | text at level 3 

जैसे गलत पैटर्न को हाइलाइट करना भी चाहूंगा जो एक से अधिक स्तरों को बढ़ाते हैं। मैंने निम्नलिखित वाक्यविन्यास मिलान

syn match myWrongMatch +^\(\(| \)*\)\(\n\|[^|].*\n\)\1\(| \)\{2,}+ 

यह इष्टतम नहीं हो सकता है लेकिन यह काम करता है। समस्या यह है कि मिलान को उस लाइन पर विम द्वारा चेक किया जाता है जिसे संपादित किया जा रहा है ताकि अगर मैं दूसरी पंक्ति पर एक स्तर को हटाकर त्रुटि को ठीक कर दूं तो यह दूसरी पंक्ति को हाइलाइट करना बंद कर देगा, लेकिन जब तक मैं इसे संपादित नहीं करता तब तक पहले को हाइलाइट करें (जैसे किसी चरित्र को हटाएं और फिर से लिखना)।

यह समस्या यह है कि मैं केवल अगली पंक्ति की जानकारी का उपयोग कर लाइन से मेल खा सकता हूं लेकिन विपरीत नहीं। चूंकि यह रेगेक्स मैच के साथ संभव नहीं लगता है, इसलिए मैं जानना चाहूंगा कि वर्तमान में संपादित लाइन और पिछले एक (या एक व्यापक संदर्भ) दोनों में मैचों की जांच करने के लिए विम से पूछें? एक और समाधान यह एक क्षेत्र द्वारा कार्यान्वित किया जा सकता है जो संदर्भ की जांच करता है लेकिन मैं अब तक असफल रहा हूं।

संपादित करें: उत्तर वास्तव में विम सहायता में है: syn-sync-linebreaks (धन्यवाद सही खंड पर इंगित करने के लिए हर्बर्ट सिट्ज)।

एकाधिक लाइनों से मेल खाने वाले पैटर्न का उपयोग करते समय, एक पंक्ति में परिवर्तन हो सकता है कि किसी पैटर्न को पिछली पंक्ति में मिलान न किया जाए। इसका मतलब है कि ऊपर से शुरू किया गया है जहां परिवर्तन किया गया था। "लाइनब्रेक्स" तर्क के साथ कितनी लाइनें निर्दिष्ट की जा सकती हैं। उदाहरण के लिए, जब एक पैटर्न एक पंक्ति में शामिल हो सकते तोड़ इस का उपयोग करें:

:syntax sync linebreaks=1 

नतीजा यह है कि redrawing हमेशा जहां एक बदलाव किया गया था से पहले कम से कम एक लाइन शुरू होता है। "लाइनब्रेक्स" के लिए डिफ़ॉल्ट मान शून्य है। आमतौर पर "minlines" के लिए मान "लाइनब्रैक" से बड़ा है।

यह पूरी तरह से काम करता है।

उत्तर

2

आप सिंटैक्स सिंक ऑपरेशन को स्वचालित करने का प्रयास कर सकते हैं।

au InsertLeave * syntax synch minlines=50 

नहीं एक आदर्श समाधान: उदाहरण के लिए, InsertEnter autocmd, जो वाक्य रचना को सिंक करेगा जब भी आप डालने मोड से बाहर निकलने में इस डाल प्रयास करें। शायद अधिक autocmds जोड़ने में मदद मिलेगी। यह आंशिक रूप से निर्भर करता है कि आपके दस्तावेज़ किस तरह दिखने जा रहे हैं, वे कितने बड़े होंगे, आप कैसे संपादन कर रहे हैं। :h syn-sync यह सिंक्रनाइज़ की विशिष्ट उपयोग, मुख्य उद्देश्य के बाद से नहीं है के रूप में मैं इसे समझ, स्वचालित रूप से चारों ओर संपादित लाइनों खोज करने के लिए जब वे वाक्य रचना क्षेत्रों में हैं:

मदद के लिए वाक्य रचना सिंक्रनाइज़ के बारे में और अधिक पढ़ें।आप क्षेत्रों का उपयोग नहीं कर रहे हैं, इसलिए आपको autocmd का उपयोग करके सिंक शुरू करने की आवश्यकता है। हो सकता है कि आप यह सुनिश्चित करने के उद्देश्य से केवल एक क्षेत्र को परिभाषित कर सकें कि सिंटैक्स सिंक लाइनों के समूह पर सिंटैक्स का पुनर्मूल्यांकन करता है - बिना ऑटोकॉम की आवश्यकता के - भले ही क्षेत्र को हाइलाइट करने के लिए उपयोग नहीं किया जा रहा हो।

+0

संदर्भ के लिए धन्यवाद, मुझे वही मिला जो मैं चाहता था: एच syn-sync। मुझे इस हिस्से के बारे में पता नहीं था। Autocmds भी काफी शक्तिशाली लगते हैं, मैं उन्हें देख लूंगा जब मुझे ऐसा कुछ चाहिए जो पहले से लागू नहीं हुआ है (यदि यह कभी होता है)। यह मेरा पहला सवाल था इसलिए मेरे पास क्षमा करने के लिए पर्याप्त प्रतिष्ठा नहीं है। – udscbt

+0

@ user1061133 - हा, कोई समस्या नहीं। Syn-sync-linebreak विकल्प के बारे में जानने के लिए मेरे लिए अच्छा है। यह minlines का एक समकक्ष प्रतीत होता है। यही है, जबकि सिंटैक्स क्षेत्र में परिवर्तन किए जाने पर 'minlines' लाइनों की संख्या सेट करने के लिए सेट करता है, 'लाइनब्रेक' विकल्प सिंटैक्स मैच में परिवर्तन किए जाने पर वापस जांचने के लिए लाइन सेट करता है। वास्तव में आप क्या देख रहे थे। । । –

संबंधित मुद्दे