2009-02-17 12 views
11

अधिकांश emacs मोड में उनकी विशेषताओं को सक्रिय करने के लिए कुछ प्रकार के उपसर्ग शामिल हैं। उदाहरण के लिए, का उपयोग करते समय GUD "अगला" "सी-सी सी-एन" है। इन तरीकों में से कई विशेष बफर प्रदान करते हैं जहां कोई उदाहरण के लिए जीएनयूएस में अगले/पिछले मेल को पढ़ने के लिए कुछ कार्यक्षमता (केवल 'एन' या 'पी' को सक्रिय करने के लिए एकल कुंजी का उपयोग कर सकता है)।सेमी-मोडल संपादन/ऑटो उपसर्ग कुंजी

सभी मोड ऐसे बफर प्रदान नहीं करते हैं, हालांकि, बार-बार उपसर्ग टाइप करना थकाऊ हो सकता है। क्या एलीस्प का एक प्रसिद्ध बिट है जो कुछ समय के लिए सभी इनपुट के लिए उपसर्ग कुंजी के विज्ञापन-प्रसार विनिर्देश के लिए अनुमति देगा? (उदाहरण के लिए ईएससी या कुछ अन्य स्वीकृत कुंजी को मारने तक)

+0

क्या आप मामूली-मोड या प्रमुख मोड बोल रहे हैं? क्या आप एक विशिष्ट उदाहरण दे सकते हैं? –

+0

असल में, मैं इससे भी कम संरचनात्मक से संतुष्ट हूं: उपसर्ग में प्रवेश करने का एक तरीका है और जब तक मैं उस मोड से बाहर निकलने के लिए कुछ विशेष श्रृंखला कुंजी दबाता हूं तब तक मैं उन सभी चाबियों पर लागू होता हूं जिन्हें मैं दबाता हूं। – fdr

उत्तर

15

मैं जो कैसाडोन्ते के उत्तर से सहमत हूं कि जाने का तरीका अपने स्वयं के नाबालिग (या प्रमुख) मोड को परिभाषित करना है।

कहा जा रहा है, आपके सवाल दिलचस्प है।

यहाँ एक समाधान है कि आप एक कुंजी क्रम के लिए संकेत देता है और यह उपसर्ग कीस्ट्रोक्स लेता है और शीर्ष स्तर पर है कि कीमैप बढ़ावा देता है।

उदा। मान लें निम्नलिखित कीमैप:

M-g ESC   Prefix Command 
M-g g   goto-line 
M-g n   next-error 
M-g p   previous-error 

जब आप M-x semi-modal-minor-mode चलाने के लिए, यह कुछ कीस्ट्रोक्स के लिए संकेत देगा। आप M-g n दर्ज करते हैं, उसके बाद निम्न कीबाइंडिंग सेट कर रहे हैं:

ESC   Prefix Command (same as M-g ESC) 
g   goto-line 
n   next-error 
p   previous-error 

तो अब n नहीं आत्म डालने करता है, लेकिन अगले त्रुटि के कूदता है। नीचे दिया गया कोड देखें।

नोट: जब इस नाबालिग मोड सक्षम होता है, <f12> एक कमांड जो मामूली मोड को निष्क्रिय करने के लिए बाध्य है। ऐसा इसलिए है क्योंकि कीबाइंडिंग आपके Emacs को बहुत अच्छी तरह अक्षम कर सकती है (उदाहरण के लिए, अगर M-x के लिए कोई नया कीबाइंडिंग हो)।

संपादित इन विचारों को जोड़ने के लिए: नाबालिग मोड चर मूल रूप से बनाया गया था बफर स्थानीय, लेकिन वह काम नहीं करता जब तक कि आप भी नाबालिग-मोड-alist चर बफर स्थानीय बनाना (डुह)। लेकिन, आप भी (संभवतः) इन बाइंडिंग को मिनीबफर में नहीं चाहते हैं ... इसलिए, मैं इसका परीक्षण नहीं कर रहा हूं b/c यह वास्तव में आप जो चाहते हैं उस पर निर्भर करता है, लेकिन मैंने कोड पर एक टिप्पणी जोड़ा है इस विचार को दर्शाता है।

आगे की हलचल के बिना

:

(defvar semi-modal-minor-mode-keymap (make-sparse-keymap) 
    "keymap holding the prefix key's keymapping, not really used") 
(defvar semi-modal-minor-mode-disable-key (kbd "<f12>") 
    "key to disable the minor mode") 
(defun semi-modal-minor-mode-disable() 
    "disable the minor mode" 
    (interactive) 
    (semi-modal-minor-mode 0)) 

(define-minor-mode semi-modal-minor-mode 
    "local minor mode that prompts for a prefix key and promotes that keymap to the toplevel 
e.g. If there are bindings like the following: 

M-g ESC   Prefix Command 
M-g g   goto-line 
M-g n   next-error 
M-g p   previous-error 

And you enter 'M-g n' when prompted, 
then the minor mode keymap has the bindings 
    g -> goto-line 
    n -> next-error 
    p -> previous-error 
    ESC -> Prefix Command (same as M-g ESC) 

The variable semi-modal-minor-mode-disable-key is bound to disable the minor mode map. 
This is provided because often the mappings make the keyboard unusable. 
Use at your own risk." 
    nil " Semi" semi-modal-minor-mode-keymap 
    (make-local-variable 'semi-modal-minor-mode) 
    (make-local-variable 'minor-mode-map-alist) 
    (let ((pair-holding-keymap-to-modify (assq 'semi-modal-minor-mode minor-mode-map-alist))) 
    (setcdr pair-holding-keymap-to-modify (make-sparse-keymap)) 
    (if semi-modal-minor-mode 
     (let (key 
       keymap) 
      ;; all but last (b/c we want a prefix 
      (setq key (substring (read-key-sequence "Enter a full key combination, the prefix will be used: ") 0 -1)) 
      (if (and (not (equal "" key)) 
        (not (equal (kbd "C-g") key)) 
        (let ((semi-modal-minor-mode nil)) 
        (keymapp (setq keymap (key-binding key))))) 
       (progn 
       (setcdr pair-holding-keymap-to-modify (copy-keymap keymap)) 
       (when semi-modal-minor-mode-disable-key 
        (define-key (cdr pair-holding-keymap-to-modify) 
        semi-modal-minor-mode-disable-key 'semi-modal-minor-mode-disable))) 
      (semi-modal-minor-mode 0)))))) 
+0

यही वह है जिसे मैं ढूंढ रहा हूं। मैं इसे अधिक ग्लोबल बनाने के लिए कुछ मामूली संशोधनों को कर सकता हूं (क्या आपके पास कोई सुझाव है? सेमी-मोडल बफर से बाहर निकलने वाले कोस्कोप का उपयोग करते समय मुझे मॉडेलिटी खो देगा ...) लेकिन स्थानीय-आईएसएच नाबालिग मोड लगता है कि भी उपयोगी लगता है। – fdr

+0

(ऐसा लगता है कि वैश्विक कीपैप पर्याप्त होगा, लेकिन मैंने सोचा कि मुझे चाहिए, अगर कुछ अन्य वैकल्पिक विचार हो तो पूछें) – fdr

+0

दोस्त, यह फ्रिगजिन 'कमाल है!मुझे नहीं पता कि मैं कभी इसका इस्तेमाल करता हूं, लेकिन यह कोड का एक बड़ा टुकड़ा है। अगर मैं आपको एक से अधिक वोट दे सकता हूं, तो निश्चित रूप से मैं चाहता हूं! –

1

Emacs में कुंजी-बाइंडिंग के मोड-विशिष्ट (मोडल?) भाग को विभिन्न स्थानीय मानचित्रों द्वारा महसूस किया जाता है जो सार्वभौमिक वैश्विक-मानचित्र को ढंकते हैं। अधिकांश प्रमुख और मामूली तरीके अपने स्थानीय मानचित्र परिभाषित करते हैं; उदाहरण के लिए, एक गड़बड़-मोड-मानचित्र है। स्थानीय कीमैप में कुंजी बाइंडिंग केवल तभी सक्रिय की जाएगी जब वर्तमान-बफर संबंधित मोड में हो। आप मोड के हुक के माध्यम से एक मोड विशिष्ट कीमैप को कस्टमाइज़ कर सकते हैं। उदाहरण के लिए, यदि आप अपने ~/.emacs

 
    (add-hook 'gud-mode-hook 
     (lambda() 
     (local-set-key (kbd "C-n") 
         (lookup-key (current-local-map) (kbd "C-c C-n"))))) 

अधिक keymaps के बारे में विवरण Elisp reference manual में पाया जा सकता में इस स्निपेट डाल सकता है।

+0

यह उपयोगी जानकारी है, लेकिन जो कुछ मैं ढूंढ रहा हूं वह काफी नहीं है। फोल्डिंग मोड पर विचार करें, जिसमें "सी-सी सी- @>" जैसी चीजें हैं। मैं अपने उपसर्ग के रूप में "सी-सी सी[email protected]" को जल्दी से निर्दिष्ट करना चाहता हूं, इसलिए मैं अपने .emacs में बाध्यकारी कुंजी के बिना एक गुना दर्ज करने के लिए ">" टाइप कर सकता हूं, प्रत्येक मोड एक-एक करके। – fdr

1

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

उदाहरण के लिए, आप एक मामूली मोड को परिभाषित कर सकते हैं जो तब तक करेगा जब तक कि मामूली मोड सक्रिय न हो। आप एक नया मामूली मोड my-gud-mode परिभाषित करते हैं जिसमें इसका स्वयं का कीमैप होगा। इसके बाद आपको इसके लिए अपने सभी महत्वपूर्ण मैपिंग को परिभाषित करना होगा (उदा। एन, पी, इत्यादि) और आपको उन सभी चाबियों को भी परिभाषित करना होगा जिन्हें आप काम नहीं करना चाहते थे ignore पर बाध्य होने के लिए। यह सभी का असली दर्द है, अन्य सभी कुंजियों को रीमेप करना। मामूली मोड चालू और बंद स्विच करना आसान है, हालांकि; यह फायदा है।

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

मैं इस स्थिति में क्या करता हूं एक आसान उपसर्ग परिभाषित करता है! सामानों के लिए मैं हर समय, हर दिन हर दिन उपयोग करता हूं, मैं उन्हें अपने आप पर एक फ़ंक्शन कुंजी देता हूं (उदा। मेरे पास F1 को मेरी जेबबर-मोड कुंजी के रूप में अलग किया गया है)। कम तत्काल उपयोगी चीजों के लिए, मेरे पास दो अन्य फ़ंक्शन कुंजियां अलग हैं, F3 और F12 (मुझे यकीन है कि मैंने उन्हें बहुत पहले चुना था, लेकिन मुझे अब याद नहीं है)। एफ 3 प्रमुख मोड के बावजूद, हमेशा उपलब्ध हैं कि कुंजी को परिभाषित करता है। एफ 12 कुंजी को परिभाषित करता है जो प्रमुख-मोड-निर्भर हैं। कुछ उदाहरण:

मैंने बड़े मोड (उदाहरण के लिए एफ 3-एमपी स्विच कोपरल मोड में स्विच करने के लिए एफएफ-एम-स्विच) और एफ 3-एम- को मामूली मोड के लिए उपसर्ग के रूप में एफ 3-एम- सेट किया है (उदाहरण के लिए एफ 3-एमवी टॉगल दृश्य मोड)। ये हमेशा उपलब्ध होते हैं, इसलिए आप कुछ ऐसा कर सकते हैं जैसे कि F3-g- अपने गड़बड़ उपसर्ग होने के लिए, और पिछले और इसी तरह के F3-g-p टाइप करें।

मेरी एफ 12 कुंजी मोड-निर्भर है। इसलिए, डियर मोड में F12-e वर्तमान फ़ाइल पर dired-nt-open-in-excel पर कॉल करेगा, और emacs-lisp-mode F12-e में elint-current-buffer पर कॉल करेगा। किसी भी तरह से मैं उन्हें भ्रमित नहीं करता।

आप इस तरह keymaps को परिभाषित करने में मदद की जरूरत है, मुझे पता है।

0

सांप मोड आप कुंजी या कुंजी दृश्यों जबकि दृश्य मोड ("Esc" कुंजी का उपयोग कर दर्ज की गई) में आदेशों को मैप करने के लिए अनुमति देता है। "I" के साथ सम्मिलित मोड पर वापस जाएं।
viper-in-more-modes.el
पर एक नज़र यह viper-modify-major-mode का उपयोग करता है।
मैं भी viper-vi-global-user-map का उपयोग करना पसंद करता हूं: मेरी .emacs फ़ाइल से snippet

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