मैं अपने सिर को चारों ओर लपेटने की कोशिश कर रहा हूं font-lock-keywords
प्रारूप, विशेष रूप से MATCH-ANCHORED
वैरिएंट, लेकिन मैं यह नहीं देखता कि मैं एक regexp से उत्पन्न मैचों का पुन: उपयोग कैसे करूंगा। नीचे चित्रण के लिए मेरा सेटअप है:
(defvar fmt-font-lock-keywords
;; no-args
`(("~\\(@:?\\|:@?\\)?[]>()}aswvcp;_]"
(0 font-lock-keyword-face))
;; numeric-arg
("~\\([0-9]*\\|#,?\\)\\(@:?\\|:@?\\)?[i*%&|~{[]"
(0 font-lock-keyword-face))
;; decimal
("~\\([0-9]*\\|#\\(,[0-9]*\\|#\\)\\{0,3\\}\\)?\\(@:?\\|:@?\\)?[rdbox]"
(0 font-lock-keyword-face))
;; floating-point f
(,(concat
"~\\(\\(\\([0-9]*\\|#\\)\\(,\\([0-9]*\\|#\\)\\)\\{3\\}\\(,'\\w\\)\\{1,2\\}\\)\\|"
"\\(\\([0-9]*\\|#\\)\\(,\\([0-9]*\\|#\\)\\)\\{0,3\\}\\)\\)"
"?\\(@:?\\|:@?\\)?f")
(0 font-lock-keyword-face))
;; floating-point e, g
(,(concat
"~\\(\\(\\([0-9]*\\|#\\)\\(,\\([0-9]*\\|#\\)\\)\\{3\\}\\(,'\\w\\)\\{1,3\\}\\)\\|"
"\\(\\([0-9]*\\|#\\)\\(,\\([0-9]*\\|#\\)\\)\\{0,3\\}\\)\\)"
"?\\(@:?\\|:@?\\)?[eg]")
(0 font-lock-keyword-face))
;; currency
(,(concat
"~\\(\\(\\([0-9]*\\|#\\)\\(,\\([0-9]*\\|#\\)\\)\\{2\\}\\(,'\\w\\)\\)\\|"
"\\(\\([0-9]*\\|#\\)\\(,\\([0-9]*\\|#\\)\\)\\{0,2\\}\\)\\)"
"?\\(@:?\\|:@?\\)?[$]")
(0 font-lock-keyword-face))
;; tabulation
("~\\(\\([0-9]*\\|#\\)\\(,\\([0-9]*\\|#\\)\\)?\\)?\\(@:?\\|:@?\\)?t"
(0 font-lock-keyword-face))
;; escape
("~\\(\\([0-9]*\\|#\\)\\(,\\([0-9]*\\|#\\)\\)\\{0,2\\}\\)?\\(@:?\\|:@?\\)?^"
(0 font-lock-keyword-face))
;; logical block
("~\\(\\([0-9]*\\|#\\)\\(,\\([0-9]*\\|#\\)\\)\\{0,3\\}\\)?\\(@:?\\|:@?\\)?<"
(0 font-lock-keyword-face))
;; custom function
(,(concat
"~\\(\\([0-9]+\\|'\\w\\|#\\)\\(,\\([0-9]+\\|'\\w\\|#\\)+\\)*\\)?"
"\\(@:?\\|:@?\\)?\\/[^\\s\\n,#@]+\\/")
(0 font-lock-keyword-face))))
और, इस मोड को शुरू करते समय:
(define-derived-mode fmt-mode fundamental-mode
. . .
(set (make-local-variable 'font-lock-defaults)
'(fmt-font-lock-keywords)) . . .)
क्षमा करें, मुझे पता है कि यह क्यूनिफॉर्म की तरह दिखता है, लेकिन यह वास्तव में बहुत सरल है ... यह आम लिस्प प्रारूप मिनी भाषा को पार्स कर रहा है।
अब यह क्या करता है: यह कीवर्ड चेहरे का उपयोग करके सभी विशेष उप-स्ट्रिंगों को रंग देता है, लेकिन जो मैं करना चाहता हूं, वह कुछ भागों को अलग-अलग रंग देना है (संख्यात्मक तर्क अलग-अलग रंग के होंगे, कस्टम फ़ंक्शन कॉल अलग-अलग रंग में रंगी जाएगी, और - शायद अलग तरह से, चरित्र डेटा - शायद अलग भी)।
मैं, तकनीकी रूप से, एक अलग समूह निकालने के लिए इन regexps की नकल कर सकता हूं, लेकिन यह बहुत ही अशुभ है, इसके अलावा, उन मामलों में जहां तर्कों के चर संख्या को पारित करना संभव है, दहनशील विस्फोट के पास होगा ...
मुझे एहसास है कि नियमित अभिव्यक्ति का उपयोग न करने पर पार्सिंग को अधिक आसानी से हल किया जा सकता है, लेकिन मुझे नहीं पता कि इसे फ़ॉन्ट-लॉक मोड के साथ कैसे संयोजित किया जाए। लेकिन अगर आप जानते हैं कि यह कैसे करना है w / o regexps, जबकि अभी भी रंग के लिए फ़ॉन्ट-लॉक यांत्रिकी का उपयोग करना, तो यह भी एक महान जवाब होगा!
("\\(group one\\)\\(group two\\)" (1 face-one) (2 face-two))
लगता है कि मैंने ऊपर क्या पूछा, लेकिन यह मूल समस्या को हल नहीं करता है, क्योंकि दोहराए जाने वाले समूहों (जैसे कि सीमांकित सूचियों से मेल खाते हुए) को निकालने से लंबी निश्चित लंबाई सूचियों के साथ बहुत थकाऊ हो जाता है और मनमानी लंबाई की सूचियों के साथ असंभव होता है। तो, हाँ, मैं खोज-आधारित फॉन्टिफिकेशन पर शोध करने जा रहा हूं)।