फ़ॉन्ट-लॉक-ऐड-कीवर्ड काम नहीं कर रहा है

Aug 18 2020

इसलिए मैं कस्टम सिंटैक्स हाइलाइटिंग का उपयोग करके अंकों को जोड़ने font-lock-add-keywordsऔर regex के लिए प्रयास कर रहा हूं ।

मैं ऐसा करने के लिए सभी Emacs संसाधनों को देख रहा हूं, और जब तक मैं सफलतापूर्वक एक चेहरे को परिभाषित करने में सक्षम रहा हूं, font-lock-add-keywordsकिसी भी स्पष्ट कारण के लिए काम नहीं कर रहा हूं ।

मैंने भी विभिन्न स्रोतों से उदाहरणों की नकल की है और बिना किसी स्पष्ट सफलता के साथ काम करने के लिए सीधे कोशिश की है। मुझे यह पता नहीं लग सकता है कि मेरे कोड में क्या गलत है। मुझे कोई त्रुटि नहीं मिल रही है, लेकिन जब मैं font-lock-add-keywords(के साथ C-x C-e) को निकालने की कोशिश करता हूं , तो यह बफर nilमें प्रिंट करता *Messages*है।

अपडेट करें

मैंने गिल्स की सलाह ली और एक मामूली मोड बनाया, font-lock-add-keywordsउस कस्टम माइनर मोड पर सेट किया, और चेहरे के लिए एक उद्धरण का उपयोग किया। जबकि मैं मोड लाइन में मामूली मोड को देख सकता हूं और यह जान सकता हूं कि यह काम कर रहा है, फिर font-lock-add-keywordsभी काम नहीं करता है। यहाँ मेरा अद्यतन कोड है:

(defgroup gio-group nil
  "Group for customization"
  :prefix "gio-")

(defface gio-highlight-numbers-face
  '((t :inherit (default)
       :foreground "#ffff00"))
  "Face for numbers"
  :group 'gio-group )

(define-minor-mode gio-minor-mode
  "Minor mode for customizaion"
  :init-value t
  :lighter " GioMode"
  :global t
  :group 'gio-group)

(font-lock-add-keywords 'gio-minor-mode '(("[0-9]+" . 'gio-highlight-numbers-face)))

मैं विंडोज 10 पर GNU Emacs 26.3 (1, x86_64-w64-mingw32 का निर्माण) चला रहा हूँ। कोई मदद बहुत सराहना की है! धन्यवाद!

जवाब

2 Gyo Aug 19 2020 at 17:00

आगे के शोधों और गाइल्स और लिंडिंसर की टिप्पणियों से कुछ मदद के साथ, मैंने पाया कि आप मामूली मोड में फ़ॉन्ट लॉक कीवर्ड नहीं जोड़ सकते हैं। इसके बजाय, आपको मामूली मोड लोड और अनलोड किए जाने पर कीवर्ड को प्रमुख मोड में जोड़ना और निकालना होगा।

यहां वह कार्य कोड दिया गया है जो मामूली मोड का उपयोग करके कीवर्ड को हाइलाइट करता है:

(defgroup gio-group nil
  "Group for customization"
  :prefix "gio-")

(defface gio-highlight-numbers-face
  '((t :inherit (default)
       :foreground "#ffff00"))
  "Face for numbers"
  :group 'gio-group )

(defvar gio-keywords '(("\\(\\b\\|[-]\\)\\([-]?\\([0-9]+\\)\\(\\.?[0-9]\\)*\\)\\b" . 'gio-highlight-numbers-face)) ;; Integers & Decimals
  "Keywords for gio-minor-mode highlighting")

(define-minor-mode gio-minor-mode
  "Minor mode for customization"
  :init-value 1
  :lighter " GioMode"
  :group 'gio-group
  (when (bound-and-true-p gio-minor-mode)
    (font-lock-add-keywords nil gio-keywords)
    (font-lock-fontify-buffer))
  (when (not (bound-and-true-p gio-minor-mode))
    (font-lock-remove-keywords nil gio-keywords)
    (font-lock-fontify-buffer)))

(define-globalized-minor-mode gio-global-minor-mode gio-minor-mode gio-minor-mode :group 'gio-group)
(gio-global-minor-mode 1)
Gilles'SO-stopbeingevil' Aug 19 2020 at 05:18

font-lock-add-keywordsएक विशिष्ट प्रमुख मोड के लिए कीवर्ड जोड़ता है , जैसे लिस्प मोड या सी मोड या HTML मोड। चूंकि font-lock-modeएक प्रमुख विधा (font-lock-add-keywords 'font-lock-mode …)नहीं है, इसलिए इसका कोई प्रभाव नहीं पड़ता है।

यदि आप वास्तव में फ़ॉन्ट लॉक कीवर्ड चाहते हैं जो हर प्रमुख मोड में लागू होते हैं, तो आपको एक मामूली मोड को परिभाषित करने की आवश्यकता है। इसी तरह से व्हॉट्सएप मोड काम करता है। बहुत सारे व्हाट्सएप मोड आपको जरूरत से ज्यादा जटिल हैं। आप शायद व्हॉट्सएप मोड में एक "डिजिट हाइलाइट" सेटिंग जोड़ सकते हैं, लेकिन अपने स्वयं के मोड को परिभाषित करना आसान हो सकता है। सुविधा फ़ंक्शन define-minor-modeमदद करता है, लेकिन आपको अभी भी कॉल (font-lock-add-keywords nil …)और द्वारा मोड चालू या बंद होने पर कीवर्ड को मैन्युअल रूप से जोड़ना और निकालना होगा (font-lock-remove-keywords nil …)। देखें Can मैं एक छोटी सी मोड में प्रकाश डाला जोड़ सकता हूँ? निर्देशों के लिए।

इसके अलावा, चेहरे का काम कैसे होता है, इसमें एक गमछा है: एक चेहरा नाम एक प्रतीक है जो एक चर नहीं है। (MATCHER . FACESPEC)के रूप font-lock-keywordsकी आवश्यकता है FACESPECएक अभिव्यक्ति जिसका मूल्य एक चेहरा निर्दिष्ट करता हो। custom-faces-highlight-numbers-faceकाम नहीं करता है क्योंकि यह एक वैध अभिव्यक्ति नहीं है क्योंकि प्रतीक custom-faces-highlight-numbers-faceबाध्य नहीं है। इसके दो समाधान हैं। पारंपरिक समाधान चेहरे के रूप में एक ही नाम के साथ एक चर को परिभाषित करना है; यह है कि यह कैसे काम करता है कि फॉन्ट लॉक मोड परिभाषित करता है, लेकिन

ध्यान दें कि नए कोड में, अधिकांश मामलों में चेहरे के नाम निर्दिष्ट करने वाले चर बनाने की आवश्यकता नहीं है। बस सीधे चेहरे का उपयोग करना पर्याप्त है। फॉन्ट-लॉक इस क्षेत्र में अनुसरण किए जाने वाला टेम्पलेट नहीं है।

प्रतीक को उद्धृत करने के लिए अनुशंसित लेकिन बोझिल समाधान है।

(font-lock-add-keywords 'gyo-highlight-numbers-mode '(("[0-9]+" . 'custom-faces-highlight-numbers-face)))