2010-06-25 13 views
11

प्रश्न:कैसे Emacs में एक कस्टम नाबालिग मोड के लिए कीबाइंडिंग बनाने के लिए

मैं नाबालिग मोड के लिए कस्टम कीबाइंडिंग कैसे बनाऊं? Something like this

यहां तक ​​कि मेरे पास अब तक है।

(define-minor-mode num-mode 
     "Toggle the Num pad keys. 
    With no argument, this command toggles the mode. 
    Non-null prefix argument turns on the mode. 
    Null prefix argument turns off the mode. 

    When Num mode is enabled, the num pad inserts the 
    keys you see on the pad. This may over ried existing 
    definitions, and is probably only usefule if you aref 
    running Emacs through a terminal." 
     ;; The initial value. 
     nil 
     ;; The indicator for the mode line. 
     " NumPad" 
     ;; The minor mode bindings. 
     ;; This doesn't work right now!!!! 
     '(((kbd "<kp-1>") . "a")) 
     :global 1 
) 

जब मैं "1" संख्या पैड पर अपने कस्टम नाबालिग मोड, "संख्या-मोड" बुला और सत्यापन करने के बाद मारा यह मिनी में पर है: मैं काम करने के लिए सिर्फ एक कस्टम कुंजी बाइंडिंग पाने के लिए कोशिश कर रहा हूँ बफर, मुझे त्रुटि <kp-1> is undefined मिलती है। मैं क्या करना चाहता हूं a मुद्रित है जहां पॉइंटर तब होता है जब मैंने <kp-1> मारा। (सिर्फ एक परीक्षण)

प्रसंग:

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

डिफ़ॉल्ट रूप से, मेरे num-pad पर कुंजी अपरिभाषित हैं। मैं numpad कुंजी के लिए कीबाइंडिंग को परिभाषित करने के लिए <kp-0><kp-9> का उपयोग करता हूं।

मैं एक मामूली मोड बना सकता हूं जिसे मैं कॉल कर सकता हूं, लेकिन मैं किसी भी कीबाइंडिंग को संलग्न नहीं कर सकता। यह सभी कीबाइंडिंग्स के लिए सच है, जिसमें किसी और को परिभाषित नहीं किया गया है।

किसी भी मदद के लिए धन्यवाद!

उत्तर

20

लघु उत्तर

समस्या पंक्ति:

'(((kbd "<kp-1>") . "a")) 

समाधान (मैक्रो के मूल्यांकन के लिए मजबूर):

;; Single quote changed to back-quote and added a comma 
`((,(kbd "<kp-1>") . "a")) 

लांग उत्तर

define-minor-mode मैक्रो आपको अपेक्षाकृत आसानी से मामूली मोड बनाने की अनुमति देता है (जहां तक ​​Emacs) जाता है।

सबसे पहले मैं दिखाता हूँ कि यह कैसे हुआ, तो मैं समझाऊंगा कि यह कैसे काम करता है:

सामान्य रूप में:

(define-minor-mode NAME-mode 
    "DOCUMENTATION" 
    INIT-VALUE 
    "LIGHTER" 
    ;; keymap 
    '(
    (KEY-SEQUENCE . DEFINITION) 
    (KEY-SEQUENCE . DEFINITION) 
    ... ETC ... 
    ) 
    ;; other options 
    :KEYWORD-ARG VALUE 
    :KEYWORD-ARG VALUE 
    ... ETC ...  
) 

alist में मैक्रोज़ के लिए मजबूर मूल्यांकन के साथ विशिष्ट उदाहरण:

;; Custom Minor Mode 
(define-minor-mode custom-mode 
    "Doc description, yada yada yada." 
    ;; The initial value - Set to 1 to enable by default 
    nil 
    ;; The indicator for the mode line. 
    " CustomMode" 
    ;; The minor mode keymap 
    `(
    (,(kbd "C-c C-a") . some-command) 
    (,(kbd "C-c C-b") . other-command) 
    ("\C-c\C-c" . "This works too") 
    ) 
    ;; Make mode global rather than buffer local 
    :global 1 
) 

एक वैकल्पिक तरीका, आप कीमैप के लिए एक चर का उपयोग करना चाहते हैं तो टी से पहले कीमैप चर और कीमैप परिभाषित करने के लिए है

(define-key custom-mode-keymap (kbd "C-c C-b") 'other-command) 
;; Num pad enable 
(define-minor-mode custom-mode 
... 

     ;; The minor mode bindings. 
     custom-mode-keymap 

कैसे

(defvar custom-mode-keymap (make-keymap) "num-mode keymap.") 
(define-key custom-mode-keymap (kbd "C-c C-a") 'some-command) 

और फिर, अपनी नाबालिग मोड परिभाषा, सरल सूची चर नाम अपने कीमैप के लिए, alist के बजाय यह सब काम करता है: इस तरह वह नाबालिग मोड घोषणा कुछ

ऊपर से नीचे तक, परिभाषित करने के बाद दाएं-मामूली-मोड हम नाबालिग मोड को टॉगल करने के लिए कमांड नाम परिभाषित करते हैं। इस मामले में custom-mode (मोड को टॉगल करने के लिए M-x custom-mode)। यह एक ही नाम के एक चर को परिभाषित करता है।

कमांड नाम के ठीक बाद, हम उद्धरण में मामूली मोड के लिए प्रलेखन स्ट्रिंग सूचीबद्ध करते हैं। जब तक आप चाहें उतना अधिक हो सकता है।

अगला हमारे पास कई विकल्प हैं। सबसे आसान विकल्प केवल तीन चीजों को सूचीबद्ध करना है और फिर कोई अतिरिक्त विकल्प। तीन चीजों को नीचे दिए गए क्रम में सूचीबद्ध किया जाना है। ये तीन चीजें हैं:

  1. नाबालिग मोड चर के लिए initilization मान। nil डिफ़ॉल्ट रूप से मोड बंद होगा। nil के अलावा कुछ अन्य डिफ़ॉल्ट रूप से होगा।

  2. हल्का। हल्का बस आपके नाबालिग मोड चालू होने पर मोड लाइन में प्रदर्शित होता है। यह छोटा होना चाहिए, और यह अक्सर एक स्थान के साथ शुरू करने के लिए स्वरूपण के मामले में मदद करेगा।

  3. कीमैप। कीमैप या तो एक चर या एक alist (एसोसिएशन सूची) के रूप में परिभाषित किया जा सकता है। चूंकि alist का उपयोग करना सरल और छोटा है, उदाहरण के लिए मैंने यही उपयोग किया था। Alist (key-sequence . definition) रूप में होना चाहिए।

आप एक alist रूप कीमैप को परिभाषित करते हैं, तो आपको कुछ बातों का के लिए बाहर देखने के लिए, खासकर यदि आप वैश्विक कीबाइंडिंग को परिभाषित करने के लिए इस्तेमाल किया कर रहे हैं। सबसे पहले, कमांड नाम उद्धृत नहीं किए जाते हैं। दूसरा, यदि आप मैक्रो का उपयोग करना चाहते हैं, आपको force it to evaluate (and on SO) है। यह बैक-कोट (सिंगल कोट नहीं) और कॉमा के संयोजन के साथ किया जाता है। आप देख सकते हैं कि यह केबीआई मैक्रो के साथ उदाहरण में कैसे किया जाता है। यदि आप केबीडी मैक्रो का उपयोग नहीं करते हैं तो मैंने एक कीस्ट्रोक परिभाषा भी शामिल की है। यदि आप बस अपने कीमैप में एक स्ट्रिंग उद्धृत करते हैं, तो परिभाषित कुंजी संयोजन दबाए जाने पर प्रिंट आउट होगा (जैसे वैश्विक कुंजी बाइंडिंग को परिभाषित करने के लिए)।

कुंजीपैप केबीआई मैक्रोज़ के साथ काम नहीं करेगा यदि आप केबीई मैक्रोज़ के मूल्यांकन को पीछे उद्धरण और अल्पविराम के संयोजन के साथ मजबूर नहीं करते हैं। इस तरह:

`((,(kbd "C-c C-a") . some-command)) 

अंत में, आप अतिरिक्त विकल्प प्रपत्र :blah के कीवर्ड-आर्ग का उपयोग कर जोड़ सकते हैं। उदाहरण में मैंने :global का उपयोग किया। हम पूरे मोड को कीवर्ड-एर्ग के साथ परिभाषित कर सकते थे, लेकिन सही क्रम में केवल init value, लाइटर, और कीमैप को सूचीबद्ध करने के लिए यह छोटा है।

3

आप अपने नाबालिग मोड परिभाषा इस तरह कोड होना चाहिए:

(defvar your-mode-map 
    (let ((map (make-sparse-keymap))) 
    (set-keymap-parent map parent-mode-shared-map) 
    (define-key map "\C-c\C-a" 'some-defun) 
    (define-key map "\C-c\C-b" 'some-other-sexp) 
    map) 

(use-local-map your-mode-map) 

आप संदर्भ के लिए EmacsWiki में उपलब्ध कई मोड पर एक नज़र हो सकता था।

http://www.gnu.org/software/emacs/manual/html_node/emacs/Key-Bindings.html#Key-Bindings

http://www.gnu.org/software/emacs/manual/html_node/emacs/Local-Keymaps.html#Local-Keymaps

http://xahlee.org/emacs/reclaim_keybindings.html से::

खैर लिखा प्रमुख मोड अंत में हुक चलेंगे

+0

मैं यहां एक प्रारूपण का उपयोग करने की कोशिश कर रहा था: http://www.gnu.org/software/emacs/elisp/html_node/Defining-Minor-Modes.html उदाहरण में। यदि आप उस प्रारूप के लिए पूरी परिभाषा दिखा सकते हैं, तो यह बहुत अच्छा होगा। –

+1

क्लोजर-मोड स्थानीय कीबाइंडिंग सेट अप करने के लिए इस शैली का उपयोग करता है - यहां इसके स्रोत पर एक नज़र डालें - http://github.com/jochu/clojure-mode/blob/master/clojure-mode.el –

+0

धन्यवाद, यह अच्छा है देखने के लिए .el फ़ाइल उदाहरण। –

2

इस (बस कीबाइंडिंग के बारे में जानकारी के लिए) पर एक नज़र डालें। तो, आप अपने कीबाइंडिंग को परिभाषित करने के लिए एक हुक का उपयोग कर सकते हैं। मामूली मोड में आमतौर पर हुक नहीं होते हैं। उस स्थिति में, आप कॉल कर सकते हैं "(आवश्यकता है <मामूली मोड सुविधा प्रतीक>)" पहले, फिर अपने कीबाइंडिंग को परिभाषित करें। http://www.cs.utah.edu/dept/old/texinfo/emacs19/emacs_35.html#SEC347

शायद स्वीकार किए जाते हैं जवाब here भी मदद करता है:

इसके अलावा, आप पर एक नज़र हो सकता है।

+0

धन्यवाद कि पिछले उत्तर के आखिरी लिंक ने मुझे संकेत दिया था। –

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