2010-03-22 15 views
9

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

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

1) मैं और मामूली मोड में एक समारोह के लिए डेल कुंजी rebind सकता है तो जांच की स्थिति OT धारण नहीं करता है, तो। लेकिन फिर मुझे कैसे पता चलेगा कि डीएल के लिए डिफ़ॉल्ट कमांड क्या है?

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) 
      ))) 

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

+0

क्या डेल और बैकस्पेस समान हैं? – Amos

उत्तर

12

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

दिखाएं कि आपने 'do-thingy से DEL को बाध्य किया है। फिर इस चाल (हालत आप बंद ट्रिगर करना चाहते हैं यह सोचते हैं क्या करना होगा (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!"))) 

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

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

+0

बिल्कुल सही, धन्यवाद! – rejeep

+2

मनमाने ढंग से फॉलबैक के बारे में क्या, जहां आप पहले से नहीं जानते कि कुंजी किसकी बाध्यकारी है जिसे आप वापस गिरना चाहते हैं? आप मूल-func के मूल्य के लिए उपयोग करने के लिए बाध्यकारी कैसे प्रोग्राम कर सकते हैं? (कभी नहीं: ऐसा लगता है कि कोई इस कमांड-कुंजी-वेक्टर का उपयोग करता है)। –

-3

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

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

आप जो करना चाहते हैं वह Emacs के मॉडल को फिट करने के लिए महत्वपूर्ण बाध्यकारी कामों के अनुरूप नहीं है।

2

यह वही है मैं अपने smart-tab पैकेज है जो वास्तव में है कि करता है के लिए इस्तेमाल करते हैं।अगर वहाँ के लिए किसी भी नाबालिग मोड बाइंडिंग हैं

(if (smart-tab-must-expand prefix) 
    ;; use smart tab 
    (smart-tab-default)) 

यह पहली बार चेक:

(defun smart-tab-default() 
    "Indents region if mark is active, or current line otherwise." 
    (interactive) 
    (if mark-active 
     (indent-region (region-beginning) 
        (region-end)) 

    (call-interactively 
    (or 
     ;; Minor mode maps for tab (without smart-tab-mode) 
     (cdar (assq-delete-all 'smart-tab-mode (minor-mode-key-binding "\t"))) 
     (cdar (assq-delete-all 'smart-tab-mode (minor-mode-key-binding [(tab)]))) 
     (local-key-binding "\t") 
     (local-key-binding [(tab)]) 
     (global-key-binding "\t") 
     (global-key-binding [(tab)]))))) 

और आदेश smart-tab (जो नाबालिग मोड में टैब के लिए बाध्य एक है) में, यह निम्न है टैब ( smart-tab-mode सहित), फिर स्थानीय, और अंत में वैश्विक कीबाइंडिंग शामिल नहीं है।

संबंधित मुद्दे