मामूली मोड में हाइलाइटिंग जटिल सिंटैक्स कैसे जोड़ें?


10

मैं एक मामूली मोड में विभिन्न चेहरों के साथ कोड को उजागर करना चाहता हूं।

यहाँ एक स्क्रीनशॉट है जो मैं चाहता हूँ के करीब है:

अजगर-वाक्य रचना-प्रकाश डाला

एक बात जो मुझे याद आ रही है, वह है टिप्पणी चार्ट #में font-lock-comment-face। यह विचार उन टिप्पणियों का है जो "टेक्स्ट" से संबंधित हैं, जिन्हें सादे पाठ के रूप में रेखांकित किया गया है, इसलिए इसे पढ़ना आसान है। जबकि उनके सामान्य रूप से कम प्रमुख चेहरे के साथ नियमित टिप्पणी।

यहाँ कोड है कि मैं इस्तेमाल किया है:

(setq-local font-lock-defaults
            '(python-font-lock-keywords
              nil nil nil nil
              (font-lock-syntactic-face-function
               . lpy-font-lock-syntactic-face-function)))

(defun lpy-font-lock-syntactic-face-function (state)
  "Return syntactic face given STATE.
Returns 'defalt face for comments that belong to an outline."
  (cond ((nth 3 state)
         (if (python-info-docstring-p state)
             font-lock-doc-face
           font-lock-string-face))
        ((save-excursion
           (while (and (> (point) (point-min))
                       (progn (move-beginning-of-line 0)
                              (eq (char-after) ?\#))))
           (forward-line 1)
           (looking-at "#\\*+ "))
         'default)
        (t
         font-lock-comment-face)))

बात यह है कि, मेरे पास उस इंटरफ़ेस के बारे में कोई सुराग नहीं है जिस पर font-lock-syntactic-face-functionसंचालित होता है, इसके अलावा यह एक जटिल डेटा संरचना प्राप्त करता है state, अलग-अलग बिंदु स्थिति होती है, और एक चेहरा देता है।

कोई इस इंटरफ़ेस की व्याख्या कर सकता है? वहाँ एक बेहतर शायद है?

जवाबों:


6

font-lock-syntactic-face-functionफ़ॉन्ट लॉक से एक नियमित चर है, विशेष रूप से Syntactic फ़ॉन्ट लॉक चरण (जोर मेरा) से:

यदि यह चर गैर-शून्य है, तो यह निर्धारित करने के लिए एक फ़ंक्शन होना चाहिए कि किसी दिए गए वाक्यविन्यास तत्व (एक स्ट्रिंग या एक टिप्पणी) के लिए किस चेहरे का उपयोग किया जाए। मूल्य आम तौर पर फ़ॉन्ट-लॉक-डिफॉल्ट्स में अन्य-vars तत्व के माध्यम से सेट किया जाता है।

फ़ंक्शन को एक तर्क के साथ कहा जाता है, बिंदु पर पार्स राज्य द्वारा लौटाया जाता है parse-partial-sexp, और एक चेहरा वापस करना चाहिए । डिफ़ॉल्ट मान, टिप्पणियों के लिए फ़ॉन्ट-लॉक-कमेंट-फेस और स्ट्रिंग्स के लिए फॉन्ट-लॉक-स्ट्रिंग-फेस (फॉन्ट लॉक के लिए चेहरे देखें) देता है।

parse-partial-sexpबदले में एक सूची देता है जो Emacs की वर्तमान वाक्यात्मक स्थिति का वर्णन करता है, जो अनिवार्य रूप से वर्तमान बफर के लिए सिंटैक्स तालिका के आवेदन का परिणाम है। सूची बल्कि जटिल है, इसलिए मैं इसे यहाँ छोड़ दूँगा; आप के संदर्भ में पूरा संदर्भ देख सकते हैं parse-partial-sexp। इस फ़ंक्शन का उद्देश्य कुछ नियमों के तहत एक सिंटैक्टिक तत्व पर लागू चेहरे को बदलना है। आपके फ़ंक्शन की शुरुआत यह प्रदर्शित करती है: यदि वर्तमान स्ट्रिंग एक डॉकस्ट्रिंग है, तो इसके लिए एक अलग चेहरे का उपयोग करें।

हालांकि, चेहरा हमेशा पूरे सिंटैक्टिक तत्व पर लागू होता है , अर्थात संपूर्ण स्ट्रिंग या टिप्पणी। आप इस फ़ंक्शन के साथ अलग-अलग हिस्सों को हाइलाइट नहीं कर सकते हैं, और आपको केवल stateइस उद्देश्य के लिए दिए गए विवरण को देखना चाहिए - जैसे (python-info-docstring-p state)आपके कोड में है। करो नहीं इस जगह बिंदु का उपयोग करें; मुझे यह भी पता नहीं है कि क्या pointफ़ॉन्ट-लॉकिंग के इस स्तर पर मूल्य को ठीक से परिभाषित किया गया है।


टुकड़ों को एक साथ रखकर, आप अपने उद्देश्य के लिए गलत फ़ंक्शन का उपयोग कर रहे हैं, यही कारण है कि आप इसे काम करने के लिए नहीं प्राप्त कर सकते हैं।

मैंने आपके इच्छित हाइलाइटिंग को लागू करने की कोशिश नहीं की है, लेकिन मुझे लगता है कि आपने अपने उद्देश्य के लिए बहुत गहराई से रास्ता खोदा। अगर मुझे चीजें समझ में आती हैं, तो आप एक टिप्पणी में मुख्य बिंदुओं को उजागर करना चाहेंगे।

अगर मैं सही हूं, तो आपको बस font-lock-keywordsएक विशेष तरीके से, अर्थात्:

(my/find-outline-in-comment-p 0 'outline-face t)

वह स्थान कहां outline-faceहै जिसे आप शीर्षक पर लागू करना चाहते हैं t, इस स्थान पर किसी भी पूर्व फ़ॉन्ट-लॉकिंग को ओवरराइड करने का मतलब है, और my/find-outline-in-commentएक मिलान समारोह है (डॉकस्ट्रिंग देखें font-lock-defaults) जो एक स्थिति लेता है और एक टिप्पणी में पहली रूपरेखा खोजता है बीच (point)और उस स्थिति में, मैच डेटा में उल्लिखित रूपरेखा के विस्तार को वापस करना।

रूपरेखा का पता लगाने के लिए, आप टिप्पणियों के लिए आगे (स्कैन font-lock-comment-faceया सिंटैक्टिक स्थिति) स्कैन करेंगे और फिर looking-atयह जांचने के लिए उपयोग करेंगे कि टिप्पणी की रूपरेखा है या नहीं।


1

इस font-lock-syntactic-face-functionतरह परिभाषित करने पर विचार करें :

(setq font-lock-syntactic-face-function
      (lambda (state)
    (cond ((nth 3 state)
           font-lock-string-face)
          ((and (nth 4 state)(nth 8 state))
            MY-COMMENT-FACE
          (t  font-lock-comment-face))))

यह अजगर-मोड के साथ परीक्षण किया गया था। बिना टिप्पणी-चेहरे के "# *" से शुरू होने वाला एक भाग छोड़कर:

(setq py--font-lock-syntactic-face-function
      (lambda (state)
    (cond ((nth 3 state)
           font-lock-string-face)
          ((and (nth 4 state)(nth 8 state)
            (progn (save-excursion
                 (goto-char (nth 8 state))
                 (looking-at (concat comment-start (regexp-quote "*"))))))
           nil)
          (t font-lock-comment-face))))

हालांकि यह मोड के साथ प्रशासित है:

(font-lock-syntactic-face-function
                    . py--font-lock-syntactic-face-function)

इसके बजाय nilकिसी भी वैध चेहरे को काम करना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.