2013-03-11 7 views
13

अब मैं एमईएलपीए और मार्मलाडे के माध्यम से जितना कर सकता हूं उतना स्थापित कर रहा हूं, और मैं गिट का उपयोग करके अपने ~/.emacs.d का प्रबंधन करता हूं। हालांकि, मुझे गिट अनदेखा * .elc फाइलें हैं।मैं स्वचालित रूप से (पुनः) ईएलपीए संकुल कैसे संकलित करूं?

इसका मतलब है कि जब मैं एक सिस्टम पर एक पैकेज स्थापित करता हूं और फिर किसी अन्य सिस्टम का उपयोग करना शुरू करता हूं, तो git pull केवल मुझे * .el फ़ाइलें देता है। इन फ़ाइलों का उपयोग अक्सर * .elc का उपयोग करने से धीमा होता है।

मैं ~/.emacs.d/init.el के लिए निम्न जोड़ने का प्रयास:

;; load the packages we've installed. Note that package-install 
;; byte-compiles the packages, but .elc is ignored by git so we force recompilation here 
(byte-recompile-directory (expand-file-name "~/.emacs.d/elpa") 0) 
(package-initialize) 

दुर्भाग्य से, इस संकलन package.el के द्वारा किया के बराबर नहीं है। उदाहरण के लिए, अगर मैं Emacs-eclim स्थापित करते हैं, package.el संकलन नहीं है Emacs-eclim/कंपनी-Emacs-eclim.el, और मैं निम्नलिखित त्रुटि मिलती है: मैं Emacs byte- कैसे कर सकता हूँ

Leaving directory `/home/wilfred/.emacs.d/elpa' 

Compiling file /home/wilfred/.emacs.d/elpa/emacs-eclim-20130310.1237/company-emacs-eclim.el at Mon Mar 11 15:40:01 2013 
Entering directory `/home/wilfred/.emacs.d/elpa/emacs-eclim-20130310.1237/' 
company-emacs-eclim.el:35:1:Error: Cannot open load file: eclim 
Warning: reference to free variable `multiple-cursors-mode' 
Warning: reference to free variable `mc--read-char' 
Warning: assignment to free variable `mc--read-char' 
Warning: reference to free variable `multiple-cursors-mode' 
Warning: reference to free variable `mc--read-quoted-char' 
Warning: assignment to free variable `mc--read-quoted-char' 
Warning: reference to free variable `rectangular-region-mode' 
Warning: reference to free variable `rectangular-region-mode' 

पैकेज.ल के रूप में केवल वही फाइल संकलित करें?

उत्तर

6

पैकेज.ल वास्तव में एक ही विधि का उपयोग करता है, यह स्टार्टअप पर बस पुन: संकलित करता है त्रुटियों को और अधिक उल्लेखनीय बनाता है।

(byte-recompile-directory pkg-dir 0 t) 

तो सवाल में मूल कोड सही है:

इस्तेमाल किया समारोह जो कहता है package--make-autoloads-and-compile है। हालांकि, एक निर्देशिका है कि अभी तक संकलित नहीं है पुन: संयोजित करने के लिए, आप निम्न कर सकते हैं:

(require 'dash) 
(require 'f) 

(defun was-compiled-p (path) 
    "Does the directory at PATH contain any .elc files?" 
    (--any-p (f-ext? it "elc") (f-files path))) 

(defun ensure-packages-compiled() 
    "If any packages installed with package.el aren't compiled yet, compile them." 
    (--each (f-directories package-user-dir) 
    (unless (was-compiled-p it) 
     (byte-recompile-directory it 0)))) 

(ensure-packages-compiled) 
2

मुझे बाइट-संकलन पैकेजों के बारे में आपके विशिष्ट मुद्दे का उत्तर बिल्कुल ठीक नहीं है package.el होगा।

हालांकि, मेलपा या मर्मेल के माध्यम से एक्सटेंशन इंस्टॉल करते समय गिट में अपनी emacs कॉन्फ़िगरेशन निर्देशिका को बनाए रखने के बारे में आपकी सामान्य समस्या के लिए, मेरा सुझाव है कि आप pallet पर एक नज़र डालें, जिसे इस समस्या को हल करने के लिए डिज़ाइन किया गया है।

+1

धन्यवाद, मैं पैलेट के बारे में पता नहीं था। हालांकि, मैं वास्तव में अपने .emacs.d को स्वयं निहित होने के लिए पसंद करूंगा - मुझे अतीत में दुःख हुआ है, शायद ही कभी अपडेट की गई elisp फ़ाइलें उपलब्ध नहीं हैं जहां मैंने मूल रूप से उन्हें डाउनलोड किया था। –

8

मैं संकुल को संस्करण नियंत्रण में रखने की अनुशंसा नहीं करता (आप संशोधन फ़ाइलों के तहत .o फाइल नहीं डालेंगे, क्या आप?)। यहाँ कोड मैं सिंक में मेरी संकुल रखने के लिए उपयोग करते हैं:

(setq jpk-packages 
     '(
     ac-dabbrev 
     ... 
     yasnippet 
     )) 

(package-initialize) 
(add-to-list 'package-archives 
      '("melpa" . "http://melpa.milkbox.net/packages/")) 
(add-to-list 'package-archives 
      '("org" . "http://orgmode.org/elpa/")) 

(when (not package-archive-contents) 
    (package-refresh-contents)) 

(dolist (pkg jpk-packages) 
    (when (and (not (package-installed-p pkg)) 
      (assoc pkg package-archive-contents)) 
    (package-install pkg))) 

(defun package-list-unaccounted-packages() 
    "Like `package-list-packages', but shows only the packages that 
    are installed and are not in `jpk-packages'. Useful for 
    cleaning out unwanted packages." 
    (interactive) 
    (package-show-package-list 
    (remove-if-not (lambda (x) (and (not (memq x jpk-packages)) 
          (not (package-built-in-p x)) 
          (package-installed-p x))) 
        (mapcar 'car package-archive-contents)))) 

मैं init.el (जो निश्चित रूप से संस्करण नियंत्रण में है) में ऊपर डाल दिया, और यह किसी भी संकुल मौजूद नहीं है कि स्थापित करता है अभी तक जब emacs शुरू होता है। बफर package-list-packages से अद्यतन किया जाता है। package-list-unaccounted-packages इंस्टॉल किए गए सभी संकुल दिखाता है लेकिन मेरे jpk-packages सूची में नहीं, और सूची में से निकाले गए लोगों को निकालना आसान बनाता है।

अपने विशिष्ट प्रश्न का उत्तर देने के लिए, मैं केवल elpa निर्देशिका को हटा दूंगा और सबकुछ पुनः इंस्टॉल करूँगा (उपरोक्त कोड का उपयोग करके)।

+0

ऐसा लगता है कि आपके जेपीके-पैकेज कार्टन मेनिफेस्ट के बराबर हैं (जैसा कि @ फ्रांसेस्को ने ऊपर पैलेट के साथ वर्णित किया है), लेकिन आप सटीक पैकेज संस्करण निर्दिष्ट करने की क्षमता खो देते हैं। –

+0

मैं कार्टन या पैलेट का उपयोग नहीं करता, लेकिन जो मैं समझता हूं उससे, मैं जो भी उपयोग करता हूं वह उनका एक बहुत ही सरल संस्करण है। मुझे अपना रास्ता पसंद है क्योंकि मुझे बूटस्ट्रैप कार्टन/फूस के लिए बस उस कोड के लगभग सभी कोड की आवश्यकता होगी, और अब तक मुझे पैकेज के संस्करणों को निर्दिष्ट न करने में कोई समस्या नहीं है। – jpkotta

+2

"आप संशोधन नियंत्रण के तहत .o फाइल नहीं डालेंगे, क्या आप?" मुझे नहीं लगता कि यह एक उचित तुलना है। बिल्डिंग .o फाइलों को हमेशा पुन: उत्पन्न करना चाहिए। हालांकि, पैकेज के विशिष्ट संस्करण को निर्दिष्ट करने का कोई तरीका प्रतीत नहीं होता है। मैं अपने emacs कॉन्फ़िगरेशन के एक सतत स्नैपशॉट को तैनात करने में सक्षम होने के लिए पैकेज फ़ाइलों में जांच करता हूं जो मुझे एक साथ काम करने के लिए पता है। –

1

समस्या आप बस है कि आप बाइट-संकलन अपने संकुल आरंभ से पहले फ़ाइलों है। यदि आप दो लाइनों को स्विच करते हैं, तो आपकी समस्या गायब होनी चाहिए। आपको मिली त्रुटि (Cannot open load file: eclim) है क्योंकि ~/.emacs.d/elpa/emacs-eclim-20130310.1237/ अभी तक आपके load-path में नहीं है, और package-initialize इसे आपके load-path (कुछ अन्य चीज़ों के साथ) में जोड़ देगा।

6

समाधान "मैं किसी भी पुराना कैसे स्वचालित रूप से संकलित करता हूं" का सामान्य प्रश्न पूछता हूं।एएलसी फाइल "का प्रयोग https://github.com/tarsius/auto-compile

मेरे पास कुछ हद तक कस्टम समाधान होते थे, जिनमें अधिकांश स्थितियों को शामिल किया गया था, लेकिन इस पुस्तकालय में जो कुछ भी मैं कर रहा था और उससे भी अधिक कवर करता हूं। बस कुछ और लोड करने से पहले इसे शुरू करें, और आप 'हल कर रहे हैं।

फ़ाइलें जो मूल रूप से संकलित नहीं किए गए थे संकलन नहीं के मूल प्रश्न के रूप में, कि क्या byte-recompile-directory को 0 तर्क करता है, तो आप स्पष्ट रूप से उस व्यवहार के लिए पूछ रहे हैं। डिफ़ॉल्ट व्यवहार को केवल मौजूदा पुन: संयोजित है पुरानी .elc फ़ाइलें, इसलिए आपको बस उस 0 को हटा देना चाहिए।

1

(बाइट-कंपाइल-फाइल) मेरे लिए काम करता है जब मुझे मैन्युअल रूप से संकुल को पुन: संकलित करने की आवश्यकता होती है जिसे मैंने पहले एल्पा का उपयोग करके स्थापित किया था।

विशेष रूप से इस स्थिति के लिए

: https://github.com/yjwen/org-reveal/issues/76t

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

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