2010-12-26 6 views
7

मैं सिर्फ Emacs जानने के लिए शुरू कर (वाह!) और मैं काफी खुशी से मेरी .emacs में चारों ओर mucking किया गया है। दुर्भाग्यवश, मुझे अभी तक लिस्प नहीं पता है, इसलिए मुझे मूल बातें के साथ समस्याएं हैं।मैं "समारोह में निम्नलिखित प्रमुख अनुक्रम का प्रतिनिधित्व करती" के लिए एक महत्वपूर्ण कैसे बाँध करते हैं?

मैं पहले से ही कुछ कुंजी पुनः मानचित्रित किया है जब तक मैं अपने मांसपेशी स्मृति को ठीक:

(global-set-key (kbd "<f9>") 'recompile) 

यही ठीक है। लेकिन मैं 'कई चाबियाँ दबाकर अनुकरण' करने के लिए एक कुंजी कैसे बता सकता हूं? उदाहरण के लिए, मैं, पता नहीं (दो वर्ण द्वारा बफर चौड़ा) <f1>C-u 2 C-x } के रूप में भी ऐसा ही कर सकता हूँ।

एक तरीका यह है कि C-x }shrink-window-horizontally पर कॉल करें, और कुछ प्रकार की लैम्ब्डा चीज़ करें। यह निश्चित रूप से साफ और सुरुचिपूर्ण तरीका है (आप यह कैसे करते हैं?)। लेकिन निश्चित रूप से वहाँ कीस्ट्रोक्स C-u 2 C-x } भेजने के लिए <f1> परिभाषित करने के लिए एक रास्ता है?

उत्तर

8

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

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

यहाँ सारांश मैं अपने आप को सबसे महत्वपूर्ण बिट के बारे में लिखा है:

;;;; * Keyboard macros 
;; C-x (   or F3 Begin recording. 
;;      F3 Insert counter (if recording has already commenced). 
;; C-u <n> C-x ( or F3 Begin recording with an initial counter value <n>. 
;; C-x)   or F4 End recording. 
;; C-u <n> C-x) or F4 End recording, then execute the macro <n>-1 times. 
;; C-x e   or F4 Execute the last recorded keyboard macro. 
;;  e   or F4 Additional e or F4 presses repeat the macro. 
;; C-u <n> C-x e or F4 Execute the last recorded keyboard macro <n> times. 
;; C-x C-k r    Apply the last macro to each line of the region. 
;; C-x C-k e    Edit a keyboard macro (RET for most recent). 
;; C-x C-k b    Set a key-binding. 
;; 
;; If you find yourself using lots of macros, you can even name them 
;; for later use, and save them to your init file. 
;; M-x name-last-kbd-macro RET (name) RET 
;; M-x insert-kbd-macro RET (name) RET 
;; 
;; For more documentation: 
;; C-h k C-x (
;; M-: (info "(emacs) Keyboard Macros") RET 

अगर हम सवाल से उदाहरण के साथ खेलते हैं, आप कैसे इन बातों में से कुछ एक साथ टाई देखेंगे ...

के साथ शुरू करने के लिए, आप F3 साथ मैक्रो परिभाषित कर सकते हैंCuCx}F4

फिर आप यह अस्थायी रूप से एफ 1 करने के लिए बाध्य कर सकता है साथ Cxसीकेबीएफ 1 (वास्तव में यह सच नहीं है कि F1 वर्तमान में मौजूदा कीमैप के लिए एक उपसर्ग कुंजी है, क्योंकि इसे इंटरैक्टिव टाइप करने के लिए बस बाकी के लिए संकेत मिलेगा। आप (global-set-key (kbd "<f1>") ...) के साथ कोड में इसे बाधित कर सकते हैं, लेकिन मैं reserved bindings पर चिपकने का सुझाव दूंगा)।

आप तो का उपयोग करते हैं describe-key (सी एचकश्मीर) की जांच के लिए क्या है कि कुंजी के लिए बाध्य है, Emacs आप एक (lambda) अभिव्यक्ति जो आप अपने init फाइल करने के लिए नकल कर सकता है यदि आप ऐसा चाहते दिखाएगा।

वैकल्पिक रूप से, आप मैक्रो नाम और वर्तमान बफर में कोड डालना Emacs पूछ सकते:

एमएक्सname-last-kbd-macroआरईटी (नाम) आरईटी
एमएक्सinsert-kbd-macroआरईटीआरईटी

यह कोड describe-key द्वारा दिखाए गए लैम्ब्डा अभिव्यक्ति से अलग दिखाई देगा, लेकिन यदि आप सम्मिलित मैक्रो का मूल्यांकन करते हैं, तो आप समकक्ष देखेंगे। आप भी इसी प्रकार दिखा सकते हैं कि (kbd "...") अभिव्यक्ति भी उसी मान का मूल्यांकन करती है, और इसलिए ये वही काम करने के सभी वैकल्पिक तरीके हैं।

(आप सम्मिलित करने के लिए अभिव्यक्ति के अंत के बाद बिंदु से आगे बढ़, और या तो टाइपिंग CxCe minibuffer में मूल्य, या दिखाने के लिए मुख्य न्यायाधीश द्वारा कोड का मूल्यांकन करने के * खरोंच * बफर उपयोग कर सकते हैं बफर में मूल्य)।

ध्यान दें कि 'डाला गया' कोड प्रतीक के लिए मैक्रो असाइन करने के लिए fset का उपयोग करता है। आप (fset) निष्पादित करके या फिर उस प्रतीक को (global-set-key) के साथ एक कुंजी पर असाइन करके, या आप (fset) को अनदेखा कर सकते हैं और केवल मैक्रो मान को सीधे असाइन कर सकते हैं। यह, ज़ाहिर है, सीधे एंगस के जवाब के बराबर है।

संपादित करें: मैं सिर्फ देखा है कि वहाँ एक kmacro-name-last-macro समारोह Cx करने के लिए बाध्यसी.के.n जो name-last-kbd-macro के रूप में लगभग समान है, लेकिन जो लैम्ब्डा अभिव्यक्ति प्रपत्र देखा kmacro-bind-to-key (Cx का उपयोग करते समय उत्पन्न करता हैसीकेबी) और describe-key

+0

बहुत धन्यवाद! मुझे इस तरह की चीज करने का सामान्य तरीका दिखाने के लिए +1। – katrielalex

17

ज़रूर है, और यह स्पष्ट तरीका है:

(global-set-key (kbd "<f1>") (kbd "C-u 2 C-x }")) 
+3

आपको बहुत बहुत धन्यवाद। जैसा कि आप सोचते हैं उतना स्पष्ट नहीं है। :) एक लंबे समय के लिए इस के लिए खोज रहे थे। – spk

8

मैं उदाहरण के समारोह के रूप में shrink-window-horizontally इस्तेमाल करेंगे, लेकिन आप किसी भी बाइंडिंग आप को परिभाषित करना चाहते हैं उनके विचार सामान्यीकरण कर सकते हैं।

आप एक से, खिड़की हटना नहीं बल्कि डिफ़ॉल्ट राशि के रूप में दो का उपयोग करना चाहते हैं, तो कोशिश निम्नलिखित:

(global-set-key [f9] 
    (lambda (&optional n) 
    (interactive "P") 
    (shrink-window-horizontally (or n 2)))) 

एक इंटरैक्टिव समारोह एक उपसर्ग तर्क को स्वीकार करने के लिए F9 कुंजी बांधता है कि। तुम सिर्फ F9, you'll pass no argument, जो 2 का डिफ़ॉल्ट मान सम्मन, के रूप में पैरामीटर n एक तर्क के रूप nil प्राप्त होगा दबाते हैं। हालांकि, अगर आप दबाते हैं, कहते हैं, सी-यू 10 F9, आप दस n के लिए तर्क के रूप में पारित करेंगे। यह आपको अपने बाध्यकारी को अधिक लचीला रूप से उपयोग करने की अनुमति देता है।

+0

मेरी इच्छा है कि मैं एक से अधिक उत्तर स्वीकार कर सकूं ... +1। – katrielalex