जैसे ही आप इसे विकसित करते हैं, आप एक मामूली मोड परिभाषा को कैसे अपडेट करते हैं?


13

मैंने कुछ कीबाइंडिंग प्रदान करने के लिए एक मामूली मोड को कोड करना शुरू किया। मेरे शुरुआती प्रयास में एक टाइपो था:

(define-minor-mode borked-mode
  "A mode defined with a broken key binding"
  nil nil
  '(([b] . 'previous-line)))

मैंने bकुंजी का उपयोग करने का इरादा किया था , और तुरंत महसूस किया कि मुझे "b"इसके बजाय उपयोग करना चाहिए था [b]। इसलिए मैंने मामूली मोड को फिर से परिभाषित किया:

(define-minor-mode borked-mode
  "A mode defined with a broken key binding"
  nil nil
  '(("b" . 'previous-line)))

हालांकि, यह काम नहीं किया। इसने मुझे बाइंडिंग कीज (यानी, (kbd ...), [...], आदि के सभी विभिन्न तरीकों से एक जंगली हंस का पीछा करने पर रोक दिया। अंत में मुझे एहसास हुआ कि बस (define-minor-mode ...)फॉर्म का पुनर्मूल्यांकन करने से कुछ भी नहीं बदल रहा था, मैं मूल, टूटे हुए कुंजी नक्शे के साथ फंस गया था। मैंने तब सीधे केमैप को बदलने की कोशिश की (define-key borked-mode-map ...)और अभी भी सही किए गए कीमैप को लोड नहीं कर पाया। अंत में मैंने Emacs को फिर से शुरू किया, और मेरा मामूली मोड सही ढंग से लोड किया गया था।

मेरा सवाल यह है: आप इसे विकसित करते समय एक मामूली मोड परिभाषा कैसे अपडेट करते हैं? क्या किसी टूटी हुई परिभाषा को फ्लश करने का कोई तरीका है, या क्या आपको टूटे हुए बिट्स को दूर करने के लिए emacs को पुनरारंभ करना है?

जवाबों:


11

पहली बार जब आप अपना मूल्यांकन करते हैं तो define-minor-modeयह borked-mode-mapआपके द्वारा निर्दिष्ट प्रमुख बाइंडिंग के साथ एक चर को परिभाषित करता है । एक बार उस प्रतीक को परिभाषित कर दिया गया है, हालाँकि, आपका पुनर्मूल्यांकन करने से define-minor-modeयह नहीं बदलेगा।

आप विभिन्न borked-mode-xxxप्रतीकों का उपयोग करके हटा सकते हैं uninternऔर फिर अपने कोड का पुनर्मूल्यांकन कर सकते हैं। प्रयत्न:

(unintern 'borked-mode-map)

आप define-minor-modeमैक्रो को विस्तारित करने में दिलचस्पी ले सकते हैं कि यह वास्तव में क्या कर रहा है। अंत में बिंदु रखें और कॉल करें M-x pp-macroexpand-last-sexp। यह विस्तारित मैक्रो दिखा एक नया बफर खोल देगा। आपको defvarअपने मोड चर सेट करने के लिए उपयोग की जाने वाली कॉल दिखाई देंगी । यदि आप सहायता के लिए पढ़ते हैं, defvarतो आप देखेंगे कि प्रारंभिक मान का उपयोग केवल तभी किया जाता है जब परिभाषित किया जा रहा है कि प्रतीक शून्य है - एक बार मौजूद होने के बाद, बाद की defvarकॉल इसके मूल्य को नहीं बदलेगी।


13

मुझे लगता है कि सबसे अच्छा जवाब जो मैं आपको दे सकता हूं वह है "इनलाइन कीबाइंडिंग फीचर" से दूर रहना define-minor-mode। उपयोग

(defvar borked-mode-map
  (let ((map (make-sparse-keymap)))
    (define-key map [b] 'previous-line)
    ...
    map))

(define-minor-mode borked-mode
  "A mode defined with a broken key binding"
  :global nil
  ...)

बजाय। फिर आप C-M-xउन परिभाषाओं का पुनर्मूल्यांकन कर सकते हैं ।


1
defvarमूल्यांकन नहीं होगा यह फिर से के बाद मूल्य है C-M-x:) आप की आवश्यकता होगी defparameterया एक अलग setf
wvxvw

जैसा कि @wvxvw बताते हैं, यह वास्तव में मुद्दे को संबोधित नहीं करता है। आपका उदाहरण कोड वही कर रहा है जो define-minor-modeमैक्रो करता है: defvarमानचित्र को परिभाषित करने के लिए कॉल करना। उस दोष का मूल्यांकन दूसरी बार करने से कोई प्रभाव नहीं पड़ता है।
ग्लूकास

7
@wvxvw यदि आप उपयोग करते हैं तो C-M-x( eval-defun) defvarफिर से मूल्यांकन करने के लिए चर अद्यतन किया जाता है। यह एक विशेष मामला है eval-defun; यदि आप कॉल करते हैं eval-bufferया eval-regionफिर मौजूदा मूल्य नहीं बदला है।
गिल्स एसओ- बुराई को रोकना '

आह - कि प्रमुख बिंदु की तरह लगता है।
ग्लूकास

1
ध्यान दें कि C-M-xपर defvarप्रपत्र केवल अद्यतन करता है मोड-नक्शा चर ही। आपको बदले हुए नक्शे को मामूली मोड में 'इंस्टॉल' करने के लिए फॉर्म C-M-xपर भी रखना होगा define-minor-mode। मैंने यह जानने की कोशिश की कि मैक्रोज़ का विस्तार क्यों हुआ, लेकिन यह मेरे से परे है।
टायलर

0

आप अपने मोड मैप को इस तरह परिभाषित कर सकते हैं:

(defvar dnd-mode-map
  (let ((map (make-sparse-keymap)))
    (prog1 map
      (define-key map "q" 'dnd-quit)
      (when (eq this-command 'eval-defun)
        (let ((mmap (assq 'dnd-mode minor-mode-map-alist)))
          (when mmap
            (setcdr mmap map)))))))

अब आप उपयोग करके मानचित्र की परिभाषा का पुनर्मूल्यांकन करने में सक्षम हैं eval-defunऔर यह स्वचालित रूप से अंदर संग्रहीत नक्शे को अपडेट करेगा minor-mode-map-alist

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