मैं एक हेरेडोक के अंदर भाषा-विशिष्ट सिंटैक्स कैसे सक्षम कर सकता हूं?


19

जब मैं एक PHP फ़ाइल को संपादित करता हूं और मैं एक स्ट्रिंग को एक heredoc में परिभाषित करता हूं, तो सिंटैक्स हाइलाइटिंग को heredoc के अंदर सक्षम किया जाएगा यदि यह जावास्क्रिप्ट सिंटैक्स या HTML सिंटैक्स या SQL सिंटैक्स है। हालांकि यह CSS सिंटैक्स के लिए काम नहीं करेगा।

उदाहरण (यदि हम hello.phpनिम्नलिखित कोड के साथ एक नई PHP फ़ाइल बनाते हैं ):

<?php
$foo = <<<"JAVASCRIPT"
var hello = "hello";
JAVASCRIPT;

$bar = <<<"CSS"
/* This code below should be syntax-highlighted. */
.hello {
  font-weight: bold;
}
CSS;

JAVASCRIPTब्लॉक सही ढंग से प्रकाश डाला गया है, लेकिन CSSब्लॉक नहीं है। इसके अलावा, अगर मैं चलाने SynStackपर varजावा स्क्रिप्ट कोड खंड पर कीवर्ड, मैं ['phpRegion', 'phpHereDoc', 'javaScriptIdentifier'], लेकिन अगर मैं सीएसएस ब्लॉक में किसी भी स्थान पर भी ऐसा ही, मैं केवल प्राप्त ['phpRegion', 'phpHereDoc']है, इसलिए मैं कुछ सीएसएस सिंटैक्स नियमों पर प्रकाश डाला जोड़ने की जरूरत है। इन सिंटैक्स नियमों को कहां परिभाषित किया जा रहा है, और मैं उन्हें कैसे जोड़ूं?


1
नोट: // This should be syntax-highlightedएक वैध सीएसएस टिप्पणी नहीं है, और इसलिए सिंटैक्स को एक टिप्पणी के अलावा किसी अन्य चीज़ के रूप में हाइलाइट किया जाना चाहिए। CSS केवल /* */मल्टी-लाइन टिप्पणियों का समर्थन करता है । //एकल-पंक्ति टिप्पणियों का समर्थन केवल तभी किया जाता है यदि आप Sass या Stylus जैसी पूर्वप्रक्रमक भाषाओं का उपयोग करते हैं।
रोरी ओ'केन

तुम सही हो। मैंने उस परिवर्तन को दर्शाने के लिए कोड अपडेट किया है।
MrSnrub

मैं भी सीएसएस heredoc सिंटैक्स हाइलाइटिंग के लिए एक समाधान पाने के लिए देख रहा हूँ। मैंने कई परिदृश्यों की कोशिश की, लेकिन इसे काम करने के लिए नहीं मिला। किसी के पास कोई हल है?
केन

जवाबों:


3

टी एल; डॉ:

यह विम के PHP और HTML सिंटैक्स फ़ाइलों में परिभाषित किया गया है। यह देखने के लिए कि सीएसएस के लिए नियम कैसे जोड़े जाएं, अनुभाग पर जाएं और मैं उन्हें कैसे जोड़ूं? नीचे, या यह कैसे काम करता है, इसकी व्याख्या के लिए पढ़ें।

इन वाक्यविन्यास नियमों को कहाँ परिभाषित किया जा रहा है?

जावास्क्रिप्ट हेरेडोक को विम के सिंटैक्स contains1 फीचर का उपयोग करके हाइलाइट किया गया है , जो सिंटैक्स समूहों को अन्य सिंटैक्स समूहों को शामिल करने की अनुमति देता है।

यह कहाँ परिभाषित किया गया है यह जानने के लिए, पहले PHP के लिए सिंटैक्स हाइलाइटिंग फ़ाइल खोलें:

:e $VIMRUNTIME/syntax/php.vim

अब, संभवतः वाक्यविन्यास फ़ाइल स्ट्रिंग "जावास्क्रिप्ट" के एक मैच के आधार पर जावास्क्रिप्ट हेरेडोक ढूंढ रही है, इसलिए उसको खोजने का प्रयास करें:

/javascript

तीसरा मैच यह टिप्पणी है:

" including HTML,JavaScript,SQL even if not enabled via options

उम्मीद तो दिखती है! आइए प्रासंगिक सिंटैक्स रेखा पर एक नज़र डालें:

syn region  phpHereDoc  matchgroup=Delimiter
\ start="\(<<<\)\@<=\(\"\=\)\z(\(\I\i*\)\=\(javascript\)\c\(\i*\)\)\2$"
\ end="^\z1\(;\=$\)\@="
\ contained
\ contains=@htmlJavascript,phpIdentifierSimply,phpIdentifier,phpIdentifierComplex,phpBackslashSequences,phpMethodsVar,@Spell
\ keepend extend

( आसान पढ़ने के लिए लाइन निरंतरता )

ठीक है, इसलिए यह वाक्यविन्यास क्षेत्र एक नियमित रूप से अभिव्यक्ति के साथ जावास्क्रिप्ट हेरेडोक पाता है, और तर्क के भीतर जावास्क्रिप्ट को @htmlJavascriptसिंटैक्स cluster2 को शामिल करके क्षेत्र के भीतर हाइलाइटिंग की अनुमति देता containsहै।

लेकिन CSS heredocs की कोई समान परिभाषा नहीं है! एक जोड़ देता है। इसलिए पहली बात यह है कि startनियमित अभिव्यक्ति। सीधे शब्दों में बदलने javascriptमें css:

start="\(<<<\)\@<=\(\"\=\)\z(\(\I\i*\)\=\(css\)\c\(\i*\)\)\2$"

यह आसान है!

लेकिन हम नहीं चाहते हैं कि हमारे सीएसएस heredoc में जावास्क्रिप्ट हाइलाइटिंग हो। इसलिए हमें @htmlJavascriptसीएसएस समकक्ष को भी बदलना होगा । लेकिन CSS समतुल्य क्या है ? (आप अनुमान लगाने में सक्षम हो सकते हैं, लेकिन आइए सुनिश्चित होने के लिए गतियों के माध्यम से चलते हैं।)

यह देखने के लिए htmljavascript3 खोजें कि कहां परिभाषित किया गया है:

/htmljavascript

हममम। अन्य कोई परिणाम नहीं। इसे कहीं और परिभाषित किया जाना चाहिए! चलो फ़ाइल के शीर्ष पर एक त्वरित नज़र रखते हैं कि क्या हम किसी को भी शामिल कर सकते हैं:

runtime! syntax/html.vim

ऐसा लग रहा है कि यह 4 हो सकता है ।

:e $VIMRUNTIME/syntax/html.vim

इस फ़ाइल में फिर से खोज चलाएँ, और हमें यह पंक्ति 5 मिली :

syn cluster htmlJavaScript      add=@htmlPreproc

तो htmlJavaScript एक clusterपरिभाषित है , में है html.vim। क्या सीएसएस के लिए एक समान क्लस्टर है जिसका हम उपयोग कर सकते हैं?

/htmlcss

हाँ!

syn include @htmlCss syntax/css.vim

तो हम बस प्रतिस्थापित करने की आवश्यकता @htmlJavascriptके साथ @htmlCssमें containsतर्क:

contains=@htmlCss,phpIdentifierSimply,phpIdentifier,[...]

और मैं उन्हें कैसे जोड़ूं?

फ़ाइल में नीचे दिए गए पूरे सिंटैक्स कमांड को सेव करें ~/after/syntax/php.vimताकि यह शेष PHP सिंटैक्स प्रोसेसिंग के बाद चलाया जाए, और आपका काम हो गया!

syn region  phpHereDoc  matchgroup=Delimiter
\ start="\(<<<\)\@<=\(\"\=\)\z(\(\I\i*\)\=\(css\)\c\(\i*\)\)\2$"
\ end="^\z1\(;\=$\)\@="
\ contained
\ contains=@htmlCss,phpIdentifierSimply,phpIdentifier,phpIdentifierComplex,phpBackslashSequences,phpMethodsVar,@Spell
\ keepend extend

1: :help :syn-containsविवरण के लिए देखें।
2: देखें :help :syn-cluster
3: मैंने 'ignorecase'स्विच ऑन कर लिया है । इसके बिना, आपको 4 htmlJavascriptया खोज करने की आवश्यकता होगी \chtmljavascript
: वास्तव में, विम सिंटैक्स फ़ाइलों में उपयोग की जाने वाली नामकरण योजना के आधार पर, हम शायद इसे केवल htmlJavascriptनाम के आधार पर समझ सकते हैं।
5: "जावास्क्रिप्ट" के साथ इस बार अलग-अलग पूंजीकृत। भाग्यशाली हम 'ignorecase'पर बदल गया है, एह?

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