2011-10-17 19 views
21

मैं विशिष्ट पैकेज को ठीक से स्थापित करते समय पर्यावरण को कस्टमाइज़ करना चाहता हूं। कैसे जांचें कि कुछ पैकेज elisp में स्थापित है या नहीं? कुछ इस तरहयह निर्धारित करने के लिए कि क्या elisp में कोई पैकेज स्थापित है या नहीं?

(if (require 'ecb) 
    (progn (setq ....)) 
    (message "ECB not installed!")) 

उत्तर

32

tripleee के जवाब त्रुटि के एक आसान उदाहरण है हैंडलिंग, लेकिन इस उदाहरण में अनावश्यक।

(when (require 'some-library nil 'noerror) 
    do-things) 

'noerror किसी भी गैर शून्य मान हो सकता है यही कारण है, लेकिन निश्चित रूप से यह इस तरह से अधिक वर्णनात्मक है। मैं अक्सर :noerror भी उपयोग करता हूं, लेकिन मुझे कोई जानकारी नहीं है कि किसी प्रतीक पर कीवर्ड तर्क का उपयोग करने के लिए कोई विशेष लाभ है (टिप्पणियां, कोई भी? मुझे जानने में काफी दिलचस्पी है)।

C source code में एक अंतर्निहित फ़ंक्शन है।

FEATURE सुविधा लोड नहीं है, तो FILENAME से इसे लोड (सुविधा & वैकल्पिक FILENAME NOERROR आवश्यकता होती है)।
यदि फीचर features सूची का सदस्य नहीं है, तो सुविधा
लोड नहीं है; तो FILENAME फ़ाइल लोड करें।
FILENAME शामिल न करने पर, सुविधा की printname फ़ाइल नाम के रूप में प्रयोग किया जाता है,
और load इसी क्रम में, इस नाम प्रत्यय .elc या
.el साथ संलग्न लोड करने के लिए कोशिश करेंगे। संलग्न प्रत्यय के बिना नाम का उपयोग नहीं किया जाएगा।
प्रत्यय की पूरी सूची के लिए get-load-suffixes देखें।
यदि वैकल्पिक तीसरा तर्क NOERROR गैर-शून्य है,
फिर त्रुटि को सिग्नल करने के बजाय फ़ाइल नहीं मिली है तो शून्य वापस लौटें।
आम तौर पर वापसी मूल्य फ़ीचर है।
FILENAME को लोड करने की शुरुआत और अंत में सामान्य संदेश दबाए जाते हैं।

+1

इसके लायक होने के लिए, चेक केवल यह देखने के लिए है कि '' आतंक 'परिभाषित किया गया है, इसलिए कोई गैर-शून्य मूल्य काम करेगा। मैं खुद 'टी' का उपयोग कर रहा हूं। – clintm

+4

: कोई आतंक आम-लिस्पी शैली नहीं है। जो अच्छा है :-)। – user239558

+0

यह 'AUCTEX' के साथ काम नहीं कर रहा है क्योंकि' AUCTEX' की आवश्यकता नहीं हो सकती है। आपको 'AUCTEX' –

6

(require) ?: अगर यह विफल एक त्रुटि फेंक देते हैं। यह वास्तव में आपको चाहिए।

यदि आप उपलब्ध होने पर ईसीबी के व्यवहार को कॉन्फ़िगर करना चाहते हैं, तो मुख्य रूप से ecb-hook पर सामग्री जोड़ने में देखें - यह एक Emacs पैकेज को सशर्त रूप से कॉन्फ़िगर करने का सामान्य तरीका है।

यदि कोई हुक उपलब्ध है, या आप हाथ से किसी कारण से यह रोल करने, जैसे

(eval-after-load 'ecb '(setq ecb-be-more-like-better-yes-p t)) 

कुछ कोशिश तुम सच में वास्तव में हाथ से यह रोल करना चाहते हैं चाहते हैं, आप जाल एक से त्रुटि कर सकते हैं

(condition-case nil 
    (progn 
     (require 'ecb) 
     (setq ecb-be-more-like-better-yes-p t)) 
    (file-error (message "ECB not available; not configuring"))) 

ध्यान दें कि condition-caseprogn अंदर से किसी भी file-error पकड़ेगा तो आप आप किसी भी अन्य फ़ाइल आपरेशनों के अंदर ऐसा नहीं करते हैं यह सुनिश्चित करना चाहते: require इस तरह विफल रहा है। अंत में आप एक condition-case अंदर सिर्फ require रख दिया और का उपयोग करें कि अपने मूल if फार्म के लिए शर्त के रूप में कर सकते हैं, लेकिन यह पहले से ही हाथ से बाहर हो रही है ...

(if (condition-case nil (require 'ecb) (error nil)) 
    (setq ecb-be-more-like-better-yes-p t) 
(message "ECB not available; not configuring")) 
+0

'eval-after-load' पैकेज लोड नहीं करता है। तो मैंने नीचे दिए गए उत्तर में बदल दिया: (जब (...)) – Vivodo

+0

हाँ, 'eval-after-load' का उद्देश्य निष्पादित करने के लिए एक स्थगित कार्रवाई निर्दिष्ट करना है जब आप निर्दिष्ट पैकेज लोड करते हैं। जब आप किसी कार्य के लिए Emacs लॉन्च करते हैं तो अनावश्यक सेटअप से बचने के लिए यह उपयोगी होता है जिसमें 'ecb' लोड नहीं होता है (बैच बाइट संकलन एक बारहमासी उदाहरण है)। – tripleee

3

"फीचरपी" का उपयोग क्यों नहीं करते?

(featurep FEATURE &optional SUBFEATURE) 

अगर इस Emacs में फीचर मौजूद है तो वापसी करें।

(if (featurep 'ecb) 
    (message "ECB is there!")) 
+1

यह केवल उन सुविधाओं पर लागू होता है जो पहले ही लोड हो चुके हैं (और इसलिए इस विशेष प्रश्न से कम प्रासंगिक है)। – phils

1

सरल जवाब require और eval-after-load उपयोग करने के लिए के रूप में अन्य उत्तर में कहा गया है।

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

Emacs संकुल स्टार्टअप समय को बेहतर बनाने के लिए तेजी से ऑटोलोड का उपयोग करते हैं। यदि आप require का उपयोग कर पैकेज की उपस्थिति के लिए परीक्षण करते हैं तो आप फ़ाइल लोड करने की लागत पहन रहे हैं। यदि ईएलपीए/एमईएलपीए/मार्मलेड पैकेज (संस्करण 24 के बाद से डिफ़ॉल्ट रूप से उपलब्ध) का उपयोग करते हैं तो कई पैकेज एक असीमित स्थिति में उपलब्ध हो सकते हैं, लेकिन ऑटोलोड के साथ पैकेज foo एक सुविधा foo-autoloads प्रदान करेगा। मैंने एक ऐसा फ़ंक्शन लिखा है जो यह जांचने के लिए उपयोगी है कि पैकेज पहले से लोड होने या ऑटोलोड करने के लिए सेट है या नहीं।

 
(defun autofeaturep (feature) 
    "For a feature symbol 'foo, return a result equivalent to: 
(or (featurep 'foo-autoloads) (featurep 'foo)) 
Does not support subfeatures." 
    (catch 'result 
    (let ((feature-name (symbol-name feature))) 
     (unless (string-match "-autoloads$" feature-name) 
     (let ((feature-autoloads (intern-soft (concat feature-name "-autoloads")))) 
      (when (and feature-autoloads (featurep feature-autoloads)) 
      (throw 'result t)))) 
     (featurep feature)))) 
0

इस प्रश्न पर चार साल देर से, लेकिन ... यहां एक साधारण मैक्रो है जो आपके लिए यह करेगा।

(defmacro when-feature-loaded (feature &rest body) 
    "Executes BODY if and only if FEATURE is loaded." 
    (declare (indent defun)) 
    `(when (featurep ,module) 
    @,body)) 

उदाहरण के लिए:

(when-feature-loaded 'foo 
    (message "foo is loaded!")) 

यहाँ एक "और" मामले के साथ एक और संस्करण के मामले में आपको लगता है कि संभाल करने के साथ-साथ की जरूरत है,।

(defmacro if-feature-loaded (module then-form else-form) 
    "Executes THEN-FORM if and only if MODULE is already loaded, otherwise executes ELSE-FORM." 
    (declare (indent 2)) 
    `(if (featurep ,module) 
     ,then-form 
    ,else-form)) 
1

सोच एक package.el पैकेज स्थापित किया गया है, तो, package-installed-p का उपयोग जांच करने का तरीका लोगों के लिए।

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

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