मैं अपने फ़ंक्शन को कुंजी से बाँध नहीं सकता या इसे Mx के साथ क्यों कॉल करूं?


13

मैंने एक फ़ंक्शन लिखा है, और मैं इसे एमएक्स के माध्यम से कॉल करना चाहता हूं, और इसे एक कुंजी से बांधता हूं। यह मेरा कार्य है:

(defun my-function ()
    (message "This is a great function"))

यदि मैं इसके साथ कॉल करने का प्रयास करता M-x my-functionहूं, तो मुझे त्रुटि मिलती है: [no match]मिनी-बफर में।

यदि मैं इसे एक कुंजी (या माउस क्लिक) से बाँधने का प्रयास करता हूँ:

(global-set-key (kbd "C-c a") 'my-function)

यह काम करने के लिए प्रकट होता है, लेकिन जब मैं इसे कॉल करने की कोशिश करता C-c aहूं, तो मुझे त्रुटि मिलती है

गलत प्रकार का तर्क: कमांड, मेरा कार्य

मैं अपने फ़ंक्शन का उपयोग क्यों नहीं कर सकता / सकती?


5
मैं इस प्रश्न को इस विषय पर अक्सर पूछे जाने वाले सामान्य प्रतिक्रिया के रूप में स्वेच्छा से देता हूं। इसी तरह की समस्याओं वाले लोगों के लिए उपयोगी और उपयोगी प्रश्न और जवाब देने के लिए समझ में आता है, लेकिन विस्तार या स्पष्ट करने के लिए स्वतंत्र महसूस करें!
टायलर

1
यह करने के लिए धन्यवाद, टायलर। मैंने एक मध्यस्थ के लिए क्यू को झंडी दिखाकर रवाना किया, कृपया इसे सामुदायिक प्रश्न में बदलें।
आकर्षित किया

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

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

1
@ मुझे यकीन नहीं था कि यह शीर्षक में 'विज्ञापन' करने के लिए कितना अच्छा है। कमांड त्रुटि केवल कीबाइंडिंग के साथ पॉप अप होती है, इसलिए Mx दिशा से इसे चलाने वाले लोगों को कनेक्शन दिखाई नहीं देगा। सुनिश्चित नहीं है कि स्पष्ट, संक्षिप्त शीर्षक और एक शीर्षक के बीच सबसे अच्छा संतुलन क्या है जो सभी प्रासंगिक खोज प्रश्नों के लिए पॉप अप होगा। आप की तरह के रूप में tweak करने के लिए स्वतंत्र महसूस करो!
टायलर

जवाबों:


22

मुख्य बिंदु यह है कि एक फ़ंक्शन और कमांड के बीच अंतर होता है

Emacs लिस्प में, फ़ंक्शंस डिफ़ॉल्ट रूप से अंतःक्रियात्मक रूप से कॉल करने योग्य नहीं होते हैं। इसका मतलब है कि आप M-xउन्हें एक कुंजी या माउस क्लिक के माध्यम से एक्सेस नहीं कर सकते या उन्हें बाँध नहीं सकते। यदि आप ऐसा करना चाहते हैं, तो आपको फ़ंक्शन को स्पष्ट रूप से घोषित करने की आवश्यकता है interactive, जिसे आप (interactive)शरीर में पहली पंक्ति के रूप में जोड़कर करते हैं (प्रलेखन स्ट्रिंग के बाद)। एक इंटरैक्टिव फ़ंक्शन को एक कमांड कहा जाता है यह मैनुअल में समझाया गया है: (info "(elisp) Using Interactive") (ऑनलाइन संस्करण)

त्रुटि संदेश जिसे आप देखते हैं, Wrong type argument: commandp, my-functionयह इंगित कर रहा है कि आप किसी फ़ंक्शन को अंतःक्रियात्मक रूप से कॉल करने का प्रयास कर रहे हैं, लेकिन वह फ़ंक्शन एक कमांड नहीं है ।

वास्तविक त्रुटि की व्याख्या करने के लिए, पत्र pका उपयोग अक्सर लिपि में एक विधेय या परीक्षण को इंगित करने के लिए किया जाता है। इस मामले में, Emacs my-functionयह देखने के लिए परीक्षण कर रहा है कि क्या यह परीक्षण का उपयोग करने वाला एक आदेश है commandp। यह नहीं है, जो त्रुटि की ओर जाता है। जब भी आप गलत प्रकार के ऑब्जेक्ट का उपयोग करते हैं, तो समान त्रुटियां पॉप अप होती हैं: यदि Emacs एक स्ट्रिंग की अपेक्षा करता है और आप एक प्रतीक पास करते हैं, तो आप stringpउदाहरण के लिए , एक संदर्भ देख सकते हैं ।

पूछे गए प्रश्न का उत्तर देने के लिए, आपको (interactive)परिभाषा में लाइन जोड़ने की आवश्यकता है :

(defun my-function ()
    (interactive)
    (message "This is a great function"))

वहाँ एक हैं बहुत कुछ के लिए विकल्पों में से interactiveफार्म, अपने कार्य करने के लिए जानकारी गुजर के तरीके के सभी प्रकार का समर्थन। सभी विवरणों के लिए मैनुअल की जाँच करें।

इस संदर्भ में कीबोर्ड मैक्रो एक विशेष मामला है। एक कीबोर्ड मैक्रो इनपुट घटनाओं का एक क्रम है, जिसे एक स्ट्रिंग के रूप में दर्शाया गया है। कीबोर्ड मैक्रोज़ कमांड की तरह व्यवहार करता है, इसलिए आप interactiveघोषणा को जोड़ने के बारे में चिंता किए बिना उन्हें चाबियों से बांध सकते हैं । उदाहरण के लिए, निम्नलिखित में:

(global-set-key (kbd "C-c l") "λ")

"λ"एक कीबोर्ड मैक्रो है, इसलिए हम इसे C-c lबिना किसी समस्या के बांध सकते हैं । यदि हम किसी फ़ंक्शन के साथ ऐसा ही करने का प्रयास करते हैं, तो हमें फ़ंक्शन को परिभाषित करना सुनिश्चित करना होगा interactive:

(global-set-key (kbd "C-c k") 
  (lambda () (insert "λ"))
;; C-c k is undefined! We tried to bind it to a function

(global-set-key (kbd "C-c m") 
  (lambda () (interactive) (insert "λ"))
;; C-c m is bound to a command that inserts λ

एक सुझाव मैं जोड़ना चाहूंगा, यह स्पष्ट करें कि आपको अपने उदाहरण में करने से पहले Cx Ce करने की आवश्यकता है M-x my-function। एमएसीएस की शुरुआत करने वाले के रूप में, मैं वास्तव में 100% स्पष्ट नहीं हूं कि अभी तक वास्तव में क्या C-x C-eहै या आपको इसे चलाने की आवश्यकता है, लेकिन ऐसा प्रतीत होता है कि उह ... जब आप इसे चलाते हैं, तो यह बफर को पार्स करता है और my-functionमेमोरी में ओवरराइट करता है क्योंकि अगर मैं C-x C-e M-xअंतिम बार जब मैं भागा तो रन नहीं चलाC-x C-e
jrh

ऐसा प्रतीत होता है कि यह C-x C-e बफर का मूल्यांकन करता है , ऐसा लगता है कि defunफ़ंक्शन का पंजीकरण करने वाले बफर के मूल्यांकन का परिणाम फ़ंक्शन दर्ज कर रहा है, हालांकि यह लेख मुझे लगता है कि यह सिर्फ फ़ंक्शन चलाना चाहिए, और अभी तक केवल मिनीबफ़र में दिखाया गया है। my-function(इसे लागू करने से फ़ंक्शन लौटता है?), नहीं This is a great function। मैं यहाँ कुछ मिस कर रहा हूँ।
jrh

1
आपकी टिप्पणी के लिए धन्यवाद, @jrh यह प्रश्न और उत्तर एक विशिष्ट पहलू को संबोधित कर रहे हैं, कि कैसे एक फ़ंक्शन को इंटरएक्टिव बनाया जाए (यानी, कमांड में फ़ंक्शन को चालू करें)। आप elisp के अधिक मूलभूत पहलुओं के बारे में पूछ रहे हैं, और इस प्रश्न के दायरे से परे हैं। मैं Emacs लिस्प इंट्रो के माध्यम से काम करने की सलाह देता हूं। आप फ़ंक्शन परिभाषा का मूल्यांकन करने के बीच के अंतर के बारे में भ्रमित होने लगते हैं, जो (फिर से) एक फ़ंक्शन को परिभाषित करता है, लेकिन वास्तव में इसे कॉल नहीं करता है, और फ़ंक्शन को कॉल करता है, जो फ़ंक्शन कोड चलाता है।
टायलर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.