รหัสด้านล่างใช้กฎตัวอักษรล็อคกับฟังก์ชั่นแทนการ regexp ฟังก์ชั่นการค้นหาสำหรับการเกิดขึ้น$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 ได้