क्या मैं पुरानी बाइट-संकलित क्विक फाइल से बच सकता हूं?


27

कभी-कभी, जब मैं Emacs शुरू करता हूं, तो मुझे एक संदेश मिलता है।

स्रोत फ़ाइल `/ home/USER/.emacs.d/elpa/Inel 'बाइट-संकलित फ़ाइल की तुलना में नई है

इसके अलावा, मैं कभी-कभी एक ऐसे पैकेज को संपादित करता हूं जिसे मैं विकसित कर रहा हूं और इसे फिर से जोड़ना भूल जाता हूं। जब मैं नई फ़ाइल को लोड करने का प्रयास करता हूं, तो मुझे यह महसूस करने में थोड़ा समय लगता है कि Emacs अभी भी पुरानी संकलित फ़ाइल का उपयोग कर रहा है।

क्या कोई ऐसा तरीका है जो मैं एमएसीएस को बाइट-संकलित फ़ाइलों से पूरी तरह से बचने के लिए कह सकता हूं जो उनके संबंधित स्रोत फ़ाइलों से पुराने हैं?

जवाबों:


35

एमएसीएस 24.3 या उससे नीचे

इन पुरानी फ़ाइलों को लोड होने से रोकने का कोई अंतर्निहित तरीका नहीं है, लेकिन इनसे छुटकारा पाने के आसान तरीके हैं।

  • आप कॉल करके पूरी एल्पा निर्देशिका को फिर से जोड़ सकते हैं
    M-x byte-recompile-directory RET ~/.emacs.d/elpa/:।
    यह पुरानी फ़ाइलों से छुटकारा पाना चाहिए।
  • आप ऑटो-संकलित पैकेज का उपयोग कर सकते हैं और सक्रिय auto-compile-on-load-modeकर सकते हैं जो फ़ाइलों को लोड करने से पहले संकलित कर सकते हैं।

एमएसीएस 24.4

हां, और यह सरल नहीं बल्कि निकला। load-prefer-newer चर ठीक इस उद्देश्य कार्य करता है।

(setq load-prefer-newer t)

दुर्भाग्य से, यह तब काम नहीं करेगा जब कुछ कोड विशेष रूप से .elcफ़ाइल को लक्षित करते हैं, जैसे कि (load "server.elc")। लेकिन यह तब तक पर्याप्त होना चाहिए जब तक आप बिना प्रत्यय के उपयोग requireया कॉल कर रहे हों load, जो आपको चाहिए।

डॉक्टर से:

लोड-पसंद-नया, lread.c में परिभाषित एक चर है।
इसका मूल्य शून्य है

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


1
मैं लोगों से auto-compileEmacs 24.4+ में उत्कृष्ट (उत्कृष्ट!) लाइब्रेरी का उपयोग करने का आग्रह करूंगा, साथ ही नीचे भी। यह एक वास्तविक कॉन्फ़िगर-एंड-भूल समाधान है। load-prefer-newerकेवल यह सुनिश्चित करता है कि आपके संकलित कोड के आउट होने के बाद आप धीमे अनलॉक्ड कोड चलाना जारी रखेंगे
phils

1
@ एफिल्स आजकल बाइट कोड सादे स्रोत कोड की तुलना में बहुत तेज नहीं है, उत्सुक मैक्रो विस्तार के लिए धन्यवाद।
22

मैंने ऑर्ग-एजेंडा-सॉर्टिंग-स्ट्रेटजी (ऑर्ग-एजेंडा.एल) में किए गए बदलावों को फिर से शुरू करने के बाद परिलक्षित नहीं किया जा रहा था, लेकिन जवाब में वर्णित के रूप में .elc फ़ाइलों को पुनः स्थापित करने से समस्या हल हो गई।
इयरलियो

17

यदि आप केवल सेट करते हैं load-prefer-newer(जहां उपलब्ध है), तो सही कोड लोड हो जाएगा, लेकिन यह बाइट-संकलित नहीं हो सकता है, इसलिए थोड़ा सा प्रदर्शन जुर्माना हो सकता है।

आप जोनास बर्नौली की उत्कृष्ट ऑटो-कंपाइल लाइब्रेरी का उपयोग कर सकते हैं ताकि यह सुनिश्चित हो सके कि यह समस्या उत्पन्न न हो। विशेष रूप से, उन्हें लोड करने से पहले auto-compile-on-load-modeपुरानी .elcफ़ाइलों को फिर से जोड़ देगा ।


3

मुझे यह इंटरनेट पर बहुत पहले मिला था:

;; If you're saving an elisp file, likely the .elc is no longer valid:
(add-hook 'emacs-lisp-mode-hook 'esk-remove-elc-on-save)
(defun esk-remove-elc-on-save ()
  "If you're saving an elisp file, likely the .elc is no longer valid."
  (make-local-variable 'after-save-hook)
  (add-hook 'after-save-hook
            (lambda ()
              (if (file-exists-p (concat buffer-file-name "c"))
                  (delete-file (concat buffer-file-name "c"))))))

यदि आप FILEemacs-lisp-mode में काम करते हैं और आप इसे सहेजते हैं - तो ऊपर वाला कोड FILEcमौजूद होने पर हटा देता है।


0

इसके अलावा, मैं कभी-कभी एक ऐसे पैकेज को संपादित करता हूं जिसे मैं विकसित कर रहा हूं और इसे फिर से जोड़ना भूल जाता हूं। जब मैं नई फ़ाइल को लोड करने का प्रयास करता हूं, तो मुझे यह महसूस करने में थोड़ा समय लगता है कि Emacs अभी भी पुरानी संकलित फ़ाइल का उपयोग कर रहा है।

क्या मुझे आपकी इनिट फ़ाइल में हुक जोड़ने का सुझाव देना चाहिए?

(add-hook 'after-save-hook 'byte-compile-current-buffer)

या, यदि आप केवल एल फाइलों पर हुक लागू करना चाहते हैं:

(add-hook 'emacs-lisp-mode-hook (lambda () (add-hook 'after-save-hook 'byte-compile-current-buffer nil t)))

9
वाह, कि गैर-अपरिहार्य बफ़र्स को बाइट-संकलित करने का प्रयास करेंगे। आदर्श नहीं! ऐसा करने का सबसे मजबूत तरीका ऑटो-कंपाइल पैकेज है।
पवित्र
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.