मैं <style>
(सीएसएस) और <script>
(जावास्क्रिप्ट, आदि) ब्लॉक को हाइलाइट करने के लिए एक साधारण प्रमुख मोड की रूपरेखा तैयार करूंगा। बहु फ़ॉन्ट ताला काफी अच्छा काम कर पाने के लिए, आपको पहले font-lock-extend-region-functions
जो प्रासंगिक खोज क्षेत्र का विस्तार होगा पाठ के बड़े ब्लॉकों को रोकने के लिए में जोड़ने के लिए font-lock-multiline
t
को निर्धारित करके सक्षम करना होगा और एक समारोह लिखने के लिए की आवश्यकता होगी। फिर, आपको मल्टीलाइन मैचर्स लिखना होगा-या तो नियमित अभिव्यक्ति या फ़ंक्शन-और उन्हें font-lock-defaults
पर जोड़ें।
यहाँ, एक बुनियादी प्रमुख मोड परिभाषा यह है कि नाम फॉन्ट ताला कीवर्ड सूची (यहाँ, test-font-lock-keywords
) है बहु फ़ॉन्ट ताला सक्षम बनाता है, और इस क्षेत्र विस्तार समारोह test-font-lock-extend-region
कहते हैं।
(define-derived-mode test-mode html-mode "Test"
"Major mode for highlighting JavaScript and CSS blocks."
;; Basic font lock
(set (make-local-variable 'font-lock-defaults)
'(test-font-lock-keywords))
;; Multiline font lock
(set (make-local-variable 'font-lock-multiline) t)
(add-hook 'font-lock-extend-region-functions
'test-font-lock-extend-region))
क्षेत्र विस्तार समारोह कुछ इस तरह दिखना चाहिए:
(defun test-font-lock-extend-region()
"Extend the search region to include an entire block of text."
;; Avoid compiler warnings about these global variables from font-lock.el.
;; See the documentation for variable `font-lock-extend-region-functions'.
(eval-when-compile (defvar font-lock-beg) (defvar font-lock-end))
(save-excursion
(goto-char font-lock-beg)
(let ((found (or (re-search-backward "\n\n" nil t) (point-min))))
(goto-char font-lock-end)
(when (re-search-forward "\n\n" nil t)
(beginning-of-line)
(setq font-lock-end (point)))
(setq font-lock-beg found))))
इस समारोह वैश्विक चर font-lock-beg
और font-lock-end
है, जो शुरू करने और के समाप्त होने के पदों खोज क्षेत्र शामिल पर लग रहा है, और इस क्षेत्र को टेक्स्ट के पूरे ब्लॉक (रिक्त रेखाओं से अलग, या "\n\n"
) शामिल करने के लिए विस्तारित करता है।
अब Emacs बड़े क्षेत्रों में मैचों की खोज करेगा, हम को test-font-lock-keywords
सूची सेट अप करने की आवश्यकता है। मल्टीलाइन संरचनाओं के मिलान के बारे में जाने के लिए दो उचित तरीके हैं: एक नियमित अभिव्यक्ति जो लाइनों से मेल खाती है और फ़ंक्शन से मेल खाती है। मैं दोनों के उदाहरण दूंगा।
(defvar test-font-lock-keywords
(list
(cons test-style-block-regexp 'font-lock-string-face)
(cons 'test-match-script-blocks '((0 font-lock-keyword-face)))
)
"Font lock keywords for inline JavaScript and CSS blocks.")
सूची में पहला आइटम सीधा है:: इस कीवर्ड सूची <script>
ब्लॉक मिलान के लिए <style>
ब्लॉक और एक समारोह मिलान के लिए एक रेगुलर एक्सप्रेशन शामिल एक रेगुलर एक्सप्रेशन और है कि नियमित रूप से मेल खाता है पर प्रकाश डाला के लिए एक चेहरा अभिव्यक्ति। दूसरा थोड़ा अधिक जटिल दिखता है, लेकिन को फ़ंक्शन द्वारा निर्दिष्ट मिलान डेटा में परिभाषित विभिन्न समूहों के लिए अलग-अलग चेहरे निर्दिष्ट करने के लिए सामान्यीकृत किया जा सकता है। यहां, हम font-lock-keyword-face
का उपयोग करके समूह शून्य (संपूर्ण मिलान) को हाइलाइट करते हैं। ( इन matchers के लिए प्रासंगिक दस्तावेज Emacs मैनुअल की Search-based fontification खंड में है।)
<style>
ब्लॉक मिलान के लिए एक बुनियादी नियमित अभिव्यक्ति होगा:
(defconst test-style-block-regexp
"<style>\\(.\\|\n\\)*</style>"
"Regular expression for matching inline CSS blocks.")
नोट है कि हम \n
डाल करने के लिए आंतरिक समूह में .
मिलान न्यूलाइन नहीं है।
मिलान समारोह, दूसरे हाथ पर,, एकल दिया तर्क को बिंदु से इस क्षेत्र में पहले <script>
ब्लॉक के लिए देखो की जरूरत है last
:
(defun test-match-script-blocks (last)
"Match JavaScript blocks from the point to LAST."
(cond ((search-forward "<script" last t)
(let ((beg (match-beginning 0)))
(cond ((search-forward-regexp "</script>" last t)
(set-match-data (list beg (point)))
t)
(t nil))))
(t nil)))
इस समारोह मैच डेटा सेट , जो begin-0 end-0 begin-1 end-1 ...
की एक सूची है शून्य समूह, पहला समूह, और इसी तरह की शुरुआत और अंत दे रही है। यहां, हम केवल पर मिलान किए गए पूरे ब्लॉक पर सीमाएं देते हैं, लेकिन आप कुछ और परिष्कृत कर सकते हैं, जैसे कि टैग के लिए अलग-अलग चेहरे और सामग्री सेट करना।
आप एक एकल फाइल में इस कोड के सभी गठबंधन और M-x test-mode
चलाते हैं, तो यह इन दो प्रकार के ब्लॉक के पर प्रकाश डाला के लिए काम करना चाहिए। जबकि मेरा मानना है कि यह नौकरी करता है, यदि इसके बारे में जाने का कुशल या उचित तरीका है, तो मैं भी को जानकर उत्सुक हूं।
इस [थ्रेड] (http://lists.gnu.org/archive/html/help-gnu-emacs/2004-09/msg00534.html) में, स्टीफन मोनियर कहते हैं कि फ़ॉन्ट-लॉक-मल्टी-लाइन है आमतौर पर सिंगल लाइन वाली चीजों के लिए उपयुक्त, लेकिन कभी-कभी बहु-पंक्ति। टिप्पणियाँ? –
खैर, स्टीफन मोनियर एक निश्चित संदर्भ है जब यह किसी भी फ़ॉन्ट-लॉक से संबंधित होता है, इसलिए उसके द्वारा कोई सलाह अच्छी तरह से योग्य है। सिंटैक्टिक सिस्टम का उपयोग करते हुए, जैसा कि वह सुझाव देता है, ऐसा करने का एक तरीका है। एक अन्य regexp के बजाय "मैच फ़ंक्शन" का उपयोग करना है, जो पूरे ब्लॉक से मेल खा सकता है। आपको मेरे उत्तरों को प्रश्न के सीधा जवाब के रूप में देखना चाहिए (बहु-पंक्ति फ़ॉन्ट-लॉक सुविधा का एक उदाहरण प्रदान करें) और शायद मूल पोस्टर के बारे में पूछे जाने वाले किसी भी काम को पूरा करने के लिए सबसे अच्छा तरीका नहीं है। – Lindydancer