2011-09-26 12 views
8

मान लीजिए मैं निम्न शॉर्टकट को परिभाषितपहली कुंजी दबाने के बिना emacs में दो महत्वपूर्ण शॉर्टकट?

(global-set-key (kbd "C-d C-j") "Hello!")

यह Emacs कॉन्फ़िगर करना संभव ताकि अगर मैं "C-d C-j C-j C-j" टाइप मैं मिल जाएगा है "नमस्कार! नमस्कार! हैलो!" "C-d C-j C-d C-j C-d C-j" टाइप करने के बजाए?

उत्तर

11

से भी कम keypresses मुझे नहीं लगता कि आप Emacs कॉन्फ़िगर कर सकते हैं कि वह सभी आदेशों के लिए करता है कि है। हालांकि, आप स्वयं को कमांड में इस कार्यक्षमता को कार्यान्वित कर सकते हैं। यह सी-एक्स ई के लिए किया जाता है।

(defmacro with-easy-repeat (&rest body) 
    "Execute BODY and repeat while the user presses the last key." 
    (declare (indent 0)) 
    `(let* ((repeat-key (and (> (length (this-single-command-keys)) 1) 
          last-input-event)) 
      (repeat-key-str (format-kbd-macro (vector repeat-key) nil))) 
    ,@body 
    (while repeat-key 
     (message "(Type %s to repeat)" repeat-key-str) 
     (let ((event (read-event))) 
     (clear-this-command-keys t) 
     (if (equal event repeat-key) 
      (progn ,@body 
        (setq last-input-event nil)) 
      (setq repeat-key nil) 
      (push last-input-event unread-command-events)))))) 

यहाँ आप कैसे उपयोग है: यहाँ एक मैक्रो मैं सिर्फआपके स्वयं के आदेशों को यह कार्यक्षमता जोड़ने के लिए बनाता है (जीएनयू Emacs 23.1.1 में kmacro-call-macro की मानक परिभाषा के द्वारा निर्देशित) ने लिखा है यह:

(defun hello-world() 
    (interactive) 
    (with-easy-repeat 
    (insert "Hello, World!\n"))) 

(global-set-key (kbd "C-c x y z") 'hello-world) 

अब आप प्रतिलिपि xyzzzHello, World! तीन बार सम्मिलित करने के लिए लिख सकते हैं। इस तरह

+0

पूरी तरह से काम करता है। धन्यवाद! – TheEzEzz

+4

Emacs 'repeat' पैकेज भी देखें। –

+0

@event_jr अच्छा !! पारितोषिक के लिए धन्यवाद। –

1

सं अनुक्रम "Ctrl-D ctrl-j" क्या स्ट्रिंग के लिए बाध्य है कि "हैलो!" Emacs पूरे स्ट्रिंग को अनुक्रम को बांधता है। यहाँ विषय पर कुछ अच्छी जानकारी है:

http://xahlee.org/emacs/keyboard_shortcuts.html

दूसरी ओर, यदि आप बस की "! हैलो" तीन मामलों चाहता था, आप कि अनुक्रम C-d C-j C-d C-j C-d C-j के रूप में "नमस्ते नमस्ते निर्धारित कर सकते हैं! हैलो! ", लेकिन यह आपके लिए इच्छित स्ट्रिंग के लिए एक सरल अनुक्रम को परिभाषित करने के लिए छोटा होगा।

+0

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

+0

यदि आप ऐसा करने जा रहे हैं, तो क्यों न केवल सी-जे को "हैलो!" ? –

+0

क्योंकि जब मैं 'सी-एस सी-जे' दबाता हूं तो मुझे कुछ अलग होना चाहिए। – TheEzEzz

4

यदि आप किसी सामान्य चीज़ की तलाश में हैं जो सभी आदेशों पर काम करता है तो मैं नहीं देख सकता कि यह कैसे काम करेगा - अगर आप एक नया आदेश शुरू कर रहे हैं या पिछले दोहराना चाहते हैं तो emacs कैसे जानेंगे। एक बेहतर उदाहरण "सी-सी एच" होगा, यदि आप उसके बाद "एच" टाइप करते हैं, तो क्या emacs कमांड दोहराएं या एच डालें? सार्वभौमिक तर्क -

जिसके अनुसार, Emacs पहले से ही इस के लिए एक तंत्र है।

इस कुंजी अनुक्रम का प्रयास करें:

C-u 3 C-d C-j 

यह सी डी सी जे सी जे सी जे सी जे

+0

मेरा खिलौना उदाहरण शायद खिलौना-आई भी था। मैं अपनी नेविगेशन कुंजी होने के लिए जेकेएलआई को रीमेप करने की कोशिश कर रहा हूं, ताकि 'सी-जे' कर्सर को छोड़ दिया जाए, 'सी-एल' दाएं, 'सी-आई' ऊपर, 'सी-के' नीचे और इसी तरह। मैं इस व्यवहार को ओवरराइड करना चाहता हूं ताकि अगर 'डी' दबाया जाए तो 'सी-जे' हटा दिया गया है, 'सी-एल' सही हटा देता है, आदि – TheEzEzz

2

कोशिश कुछ:

(global-set-key (kbd "C-c C-j") (lambda() 
            (interactive) 
            (insert "Hello!") 
            (message "Type j to print Hello!") 
            (while (equal (read-event) ?j) 
            (insert "Hello!")) 
            (push last-input-event unread-command-events))) 

आइडिया से kmacro-call-macro

+0

मुझे लगता है कि आपको उस कुंजीपटल को खोने के लिए, अंतिम लूप को समाप्त करने वाली अंतिम घटना को वापस धक्का देना चाहिए। डैनियल ब्रॉकमैन का जवाब देखें, हालांकि मुझे अन्यथा इस जवाब की कुरकुरा पसंद है। – tripleee

+0

हां, आप सही हैं, आपके सुधार के लिए धन्यवाद –

0

मैं यह सब समय का उपयोग लिया। इसका उपयोग करने के लिए आपको पुस्तकालय repeat.el (जीएनयू Emacs का हिस्सा) की आवश्यकता होगी।

 
    (defun make-repeatable (command) 
     "Repeat COMMAND." 
     (let ((repeat-message-function 'ignore)) 
     (setq last-repeatable-command command) 
     (repeat nil))) 

    (defun my-hello() 
     "Single `hello'." 
     (interactive) 
     (insert "HELLO!")) 

    (defun my-hello-repeat() 
     (interactive) 
     (require 'repeat) 
     (make-repeatable 'my-hello)) 

अब my-hello-repeat बाँध:

(वैश्विक सेट-कुंजी (kbd "") 'मेरे-हैलो-दोहराने)

अब बस घरदोहराने के लिए नमस्ते कुंजी को दबाए रखें !

मैं Bookmark+, thing-cmds, और wide-n सहित कई पुस्तकालयों में इसी तकनीक का उपयोग करता हूं।

0

smartrep सब आप चाहते हैं

(require 'smartrep) 

(defvar ctl-d-map (make-keymap)) ;; create C-d map 
(define-key global-map "\C-d" ctl-d-map) 


(smartrep-define-key 
    global-map "C-d" 
    '(("C-j" . (insert "hello")))) 
संबंधित मुद्दे