नीचे दिया गया कोड एक रेन्जएक्सपी के बजाय एक फ़ंक्शन के साथ एक फॉन्ट-लॉक नियम का उपयोग करता है, फ़ंक्शन $VAR
केवल घटनाओं के लिए खोज करता है, लेकिन केवल जब वे दोहरे-उद्धृत स्ट्रिंग के अंदर होते हैं। (syntax-ppss)
इसे निर्धारित करने के लिए फ़ंक्शन का उपयोग किया जाता है।
फ़ॉन्ट-लॉक नियम prepend
ध्वज का उपयोग मौजूदा स्ट्रिंग हाइलाइटिंग के ऊपर खुद को जोड़ने के लिए करता है। (ध्यान दें कि कई पैकेज इसके लिए उपयोग t
करते हैं। दुर्भाग्य से, यह मौजूदा हाइलाइटिंग के सभी पहलुओं को अधिलेखित करता है। उदाहरण के लिए, prepend
फोरग्राउंड रंग को बदलने के दौरान एक स्ट्रिंग बैकग्राउंड रंग (यदि कोई है) को बरकरार रखेगा।)
(defun sh-script-extra-font-lock-is-in-double-quoted-string ()
"Non-nil if point in inside a double-quoted string."
(let ((state (syntax-ppss)))
(eq (nth 3 state) ?\")))
(defun sh-script-extra-font-lock-match-var-in-double-quoted-string (limit)
"Search for variables in double-quoted strings."
(let (res)
(while
(and (setq res
(re-search-forward
"\\$\\({#?\\)?\\([[:alpha:]_][[:alnum:]_]*\\|[-#?@!]\\)"
limit t))
(not (sh-script-extra-font-lock-is-in-double-quoted-string))))
res))
(defvar sh-script-extra-font-lock-keywords
'((sh-script-extra-font-lock-match-var-in-double-quoted-string
(2 font-lock-variable-name-face prepend))))
(defun sh-script-extra-font-lock-activate ()
(interactive)
(font-lock-add-keywords nil sh-script-extra-font-lock-keywords)
(if (fboundp 'font-lock-flush)
(font-lock-flush)
(when font-lock-mode
(with-no-warnings
(font-lock-fontify-buffer)))))
आप पिछले फ़ंक्शन को उपयुक्त हुक में जोड़कर इसका उपयोग कर सकते हैं, उदाहरण के लिए:
(add-hook 'sh-mode-hook 'sh-script-extra-font-lock-activate)
sh-mode
? शायद इसे Emacs में ही जोड़ा जा सकता है।