2013-01-23 44 views
6

मैं एक elisp फ़ंक्शन लिख रहा हूं जो वर्तमान प्रमुख मोड के कीमैप में दिए गए आदेश को किसी दिए गए कुंजी को स्थायी रूप से बाध्य करता है। उदाहरण के लिए,वर्तमान स्थानीय कीमैप का Emacs नाम?

(define-key python-mode-map [C-f1] 'python-describe-symbol) 

कमांड और कुंजी अनुक्रम उपयोगकर्ता से इंटरैक्टिव रूप से एकत्र किए जाते हैं। हालांकि, मुझे KEYMAP (उदा। 'पायथन-मोड-मैप') का नाम बनाने में परेशानी हो रही है जो वर्तमान प्रमुख मोड से मेल खाती है।

मैंने फ़ंक्शन (वर्तमान-स्थानीय-मानचित्र) का प्रयास किया है, लेकिन यह फ़ंक्शन इसके नाम के बजाय कीमैप ऑब्जेक्ट को स्वयं देता है।

मैं समझता हूं कि कई प्रमुख मोड कीपैप्स को 'प्रमुख-मोड-नाम'-मोड-मैप 'के अनुसार नामित किया गया है, हालांकि, यह हमेशा मामला नहीं है (उदाहरण के लिए, पायथन-शेल-मैप), तो मैं बल्कि मेरा कोड इस सम्मेलन पर भरोसा नहीं करता। (मुझे यह भी यकीन नहीं है कि वर्तमान प्रमुख मोड के नाम तक कैसे पहुंचे)। इसलिए हालांकि

(define-key (current-local-map) key command)

काम करने के लिए लगता है, यह एक आरंभीकरण फ़ाइल पर कोड के रूप में काम नहीं करता है

(define-key ...), एक init फाइल करने के लिए जोड़ा जा रहा है।

+0

आप कोड क्यों लिख रहे हैं जो अन्य कोड उत्पन्न करता है? आप जिस गहरे मुद्दे को हल करने की कोशिश कर रहे हैं वह क्या है? क्या आप शायद कुछ पुस्तकालयों को लिख सकते हैं जिन्हें दूसरों को बस 'आवश्यकता' हो सकती है? क्या आप एक ऐसे मोड को लिखने में सक्षम होंगे जो इस प्रकार के कार्यों को 'जादुई-वर्णन-प्रतीक' करता है जो वर्तमान मोड के आधार पर सही चीज करता है? इत्यादि। –

+0

मेरा बिंदु/प्रश्न यह है कि, यदि आप प्रोग्रामिक रूप से इन्हें जोड़ सकते हैं, तो आप इसे अधिक सामान्य, अधिक सुरुचिपूर्ण तरीके से हल करने में सक्षम हो सकते हैं - जिसमें कोड के स्निपेट का एक गुच्छा शामिल नहीं है जो लगभग समान दिखता है मोड मैप ... –

+1

@ ट्रेजैकसन उन "स्निपेट्स का समूह" कोड के टुकड़े हो सकते हैं जो किसी के '.emacs' (उचित संख्या में, निश्चित रूप से) में हैं। कोड जो अन्य कोड उत्पन्न करता है वह लिस्प में नहीं है। – user4815162342

उत्तर

9

वर्तमान स्थानीय कीमैप का नाम खोजने का कोई सीधा तरीका नहीं है - अधिक सटीक, जिस प्रतीक का मूल्य बाध्य है-क्योंकि कीमैप को प्रतीक के लिए भी बाध्य नहीं होना चाहिए। हालांकि, मोड कीमैप्स आम तौर पर एक वैश्विक प्रतीक से बंधे होते हैं, और कोई भी यह देख सकता है कि यह सभी प्रतीकों के माध्यम से पुनरावृत्त कर रहा है और जिस पर मान eq कुंजीमैप ऑब्जेक्ट पर है।

इसे सभी प्रतीकों को देखना है (हालांकि यह प्रत्येक के साथ न्यूनतम काम करता है), लेकिन इसका कोई विशेष नामकरण सम्मेलन पर भरोसा नहीं करने का लाभ है।

(defun keymap-symbol (keymap) 
    "Return the symbol to which KEYMAP is bound, or nil if no such symbol exists." 
    (catch 'gotit 
    (mapatoms (lambda (sym) 
       (and (boundp sym) 
        (eq (symbol-value sym) keymap) 
        (not (eq sym 'keymap)) 
        (throw 'gotit sym)))))) 


;; in *scratch*: 
(keymap-symbol (current-local-map)) 
==> lisp-interaction-mode-map 
+0

धन्यवाद। मैंने इसे अंतिम उपाय के रूप में करने के बारे में सोचा, लेकिन मैं उम्मीद कर रहा था कि एक और तरीका है (भी, मुझे यकीन नहीं था कि कौन से प्रतीकों से मेल खाना है)।प्रदर्शन चिंता का विषय नहीं है, क्योंकि कोड केवल एक बार चलाया जाता है, इसलिए यह मेरे लिए एक समाधान है। – erjoalgo

1

शायद तुम कोशिश कर सकते:

(define-key (concat (symbol-name major-mode) "-map") [C-f1] 'python-describe-symbol)

संपादित करें: हालांकि इस सही STRING प्राप्त होते हैं, यह अभी भी एक प्रतीक करने के लिए वापस परिवर्तित किया जाना चाहिए।

+0

धन्यवाद। जैसा कि मैंने उल्लेख किया है, मैं इस सम्मेलन पर भरोसा नहीं करना चाहता, लेकिन यह एक अच्छा अनुमान है! मुझे लगता है कि ज्यादातर प्रमुख तरीके सम्मेलन का पालन करते हैं। – erjoalgo

+1

elisp हैकररी के कुछ वर्षों के बाद इस पर वापस आ रहा है, आप केवल '(इंटर्न (concat ...))' स्ट्रिंग को एक प्रतीक के रूप में प्रशिक्षित करने के लिए – erjoalgo

2

समारोह local-set-key वर्तमान स्थानीय कीमैप में कुंजी बाइंडिंग के उद्देश्य के लिए मौजूद है।

+1

धन्यवाद। मुझे इसके बारे में पता था। हालांकि, जैसा कि मैंने उल्लेख किया है, मेरा उद्देश्य कोड उत्पन्न करना है जिसे प्रारंभिक फ़ाइल में जोड़ा जाएगा। इसलिए, प्रारंभ करने के समय, 'स्थानीय-सेट-की' इच्छित कुंजी-मानचित्र की कुंजी को बाध्य नहीं करेगा। – erjoalgo