Emacs कुंजी बाध्यकारी fallback




elisp (2)

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

यह निश्चित नहीं है कि मैं इसे कैसे हल कर सकता हूं। लेकिन मुझे लगता है कि मैं इसे दो तरीकों से कर सकता हूं:

1) मैं छोटी सी विंडो में एक फ़ंक्शन में DEL कुंजी को रिबिंड कर सकता हूं और फिर जांच कर सकता हूं कि क्या स्थिति ओटी नहीं है। लेकिन फिर मुझे कैसे पता चलेगा कि डीएल के लिए डिफ़ॉल्ट कमांड क्या है?

2) मैं इस तरह एक पूर्व कमान हुक जोड़ सकता है आदेश निष्पादित करें और फिर श्रृंखला को तोड़ें। लेकिन मैं श्रृंखला को कैसे तोड़ूं?

(add-hook 'pre-command-hook
          (lambda()
            (when (equal last-input-event 'backspace)
              ;; Do something and then stop (do not execute the
              ;; command that backspace is bound to)
              )))

आप किस तरह से इसे हल करेंगे? धन्यवाद!


ऐसा करने का तरीका अस्थायी रूप से अपने नाबालिग मोड को अक्षम करना है, फिर कुंजी बाइंडिंग देखें।

बहाना है कि आप 'do-thingy DEL करने के 'do-thingy बाध्य किया है फिर यह चाल (यह शर्त संभालने पर होता है कि आप को ट्रिगर करना चाहते हैं (equal last-input-event 'backspace) :

(defun do-thingy ()
  "Do something, unless last event was backspace."
  (interactive)
  (if (equal last-input-event 'backspace)
      (let* ((my-minor-mode nil)
             (original-func (key-binding (kbd "DEL"))))
        ;; original-func is whatever DEL would be if
        ;; my-minor-mode were disabled
        (call-interactively original-func))
    (message "Here's my minor mode behavior!")))

नोट: यह व्यवहार मानता है कि आपने अपनी कुंजी बाइंडिंग को मानक तरीके से मामूली मोड की स्थापना की है। विशेष रूप से, आपको एक तत्व (my-minor-mode . my-minor-mode-keymap) को जोड़कर चर minor-mode-map-alist अपना कीमैप जोड़ना चाहिए। इसके बाद के संस्करण बयान कैसे काम करता है, यह बाध्यकारी दिखता है जो आप अपने मोड के साथ अस्थायी रूप से अक्षम हैं।

यदि आप अपने मामूली define-minor-mode को परिभाषित define-minor-mode लिए define-minor-mode का उपयोग करते हैं, तो कुंजीपैप को "सही तरीके से" स्वचालित रूप से सेट किया जाता है


ऐसा करने के लिए एक तरीका नहीं लगता है जो आप मज़बूती से चाहते हैं। यदि आपका नया आदेश DEL के लिए बाध्य है, तो मौजूदा कुंजीपैम से पहले DEL को बाध्य किया गया था अब और नहीं है। आपके द्वारा प्रस्तावित अन्य तरीका काम नहीं करेगा क्योंकि पूर्व-कमान-हुक निम्नलिखित कार्रवाई को होने से रोक नहींते हैं। आप ^ जी (कीबोर्ड-छोड़ो) के साथ और निष्पादन में बाधा करने पर भी सोच सकते हैं, लेकिन यह एक अनियंत्रित इंटरप्ट है जो आप की अपेक्षा अधिक चीजें रोक सकता है।

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

आप क्या करना चाहते हैं, एमएसीएस के मॉडल को कैसे बाध्यकारी कार्य करता है





elisp