क्या फॉन्ट-लॉक के साथ एक बार में कई समूहों को निकालना संभव है?


0

मैं अपने सिर को चारों ओर लपेटने की कोशिश कर रहा हूं 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, जबकि अभी भी रंग के लिए फ़ॉन्ट-लॉक यांत्रिकी का उपयोग करना, तो यह भी एक महान जवाब होगा!

जवाबों:


1

अपने कोड को देखने के बिना एक त्वरित आंशिक प्रतिक्रिया (क्षमा करें) - इसलिए यह नाव को अच्छी तरह से याद कर सकती है।

  1. यदि आप जो पूछ रहे हैं उसका एक हिस्सा है कि किसी चीज़ को हाइलाइट कैसे किया जाए f-l-k प्रवेश भले ही यह बाद में भी मेल खाता हो f-l-k प्रवेश, उस का उत्तर का उपयोग करना है keep। (यह भी देखें क्या t करता है, जो बहुत विपरीत है।)

  2. यदि आप जो पूछ रहे हैं उसका हिस्सा रीगेक्स का उपयोग किए बिना फ़ॉन्ट-लॉक करने के लिए कैसे है, या केवल रेगेक्स का उपयोग किए बिना, इसका उत्तर फ़ंक्शन का उपयोग करना है।

यदि आप पहले से ही नहीं है, तो Elisp मैन्युअल, नोड देखें Search-based Fontification -- निम्न को खोजें keep तथा FUNCTION


उत्तर के लिए धन्यवाद, मुझे एक आंशिक उत्तर भी मिला: उपयोग करना ("\\(group one\\)\\(group two\\)" (1 face-one) (2 face-two)) लगता है कि मैंने ऊपर क्या पूछा, लेकिन यह मूल समस्या को हल नहीं करता है, क्योंकि दोहराए जाने वाले समूहों (जैसे कि सीमांकित सूचियों से मेल खाते हुए) को निकालने से लंबी निश्चित लंबाई सूचियों के साथ बहुत थकाऊ हो जाता है और मनमानी लंबाई की सूचियों के साथ असंभव होता है। तो, हाँ, मैं खोज-आधारित फॉन्टिफिकेशन पर शोध करने जा रहा हूं)।
wvxvw
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.