2013-03-11 6 views
13

私はMELPAとMarmaladeを通してインストールできるようになりました。私は〜/ .emacs.dをgitで管理しています。しかし、私はgit ignore * .elcファイルを持っています。ELPAパッケージを自動的に(再)コンパイルするには?

これは、1つのシステムにパッケージをインストールした後、別のシステムを使用すると、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をコンパイルしていない、と私は次のエラーを取得する:

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' 

はどのようにEmacsを作るのですかバイト・package.elと同じファイルだけをコンパイルしますか?

答えて

6

package.elは実際に全く同じメソッドを使用しています。起動時に再コンパイルするだけでエラーが顕著になります。

(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と同じではありません。

しかし、Melpaやマーマレードを使って拡張機能をインストールしているときに、emacsの設定ディレクトリをgitで管理しているより一般的な問題については、この問題を解決するために設計された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

あなたのjpk-packagesはCartonマニフェストと同じようですが(@francescoが上記のパレットで説明したように)、正確なパッケージバージョンを指定することはできません。 –

+0

私はカートンやパレットを使用していませんが、私が理解しているところから、私が使用しているものは非常に単純なものです。私は自分のやり方が好きです。なぜなら、カートン/パレットをブートストラップするだけでそのコードのほとんどが必要になるからです。パッケージのバージョンを指定しないという問題はありませんでした。 – jpkotta

+2

"あなたはリビジョン管理の下に.oファイルを置かないでしょうか?"私はこれが公正な比較だとは思わない。ビルド.oファイルは常に再現可能でなければなりません。しかし、特定のバージョンのパッケージを指定する方法はないようです。私は一緒に働くことがわかっている私のemacs設定の一貫したスナップショットを展開できるようにするために、パッケージファイルをチェックインします。 –

1

あなたは持っている問題は、あなたがバイトコンパイルあなたのパッケージを初期化する前にファイルを単にということです。 2行を切り替えると、問題は消えます。あなたが受け取ったエラー(Cannot open load file: eclim)は、~/.emacs.d/elpa/emacs-eclim-20130310.1237/がまだあなたのload-pathに含まれておらず、package-initializeはあなたのload-pathに追加します(他にもいくつかあります)。

6

より一般的な質問「私はどのようにしてが自動的に再コンパイルされるのですか?elcファイル "を使用するhttps://github.com/tarsius/auto-compile

私は遭遇したほとんどの状況をカバーするカスタムソリューションをいくつか持っていましたが、このライブラリは私がやっていたすべてをカバーしています。 「再ソートされた。

をもともとコンパイルされなかったファイルをコンパイルしていないの元の質問に関しては、それはbyte-recompile-directoryから0引数が何をするかですので、あなたは明示的にその行動を求めている。デフォルトの動作があるだけに、既存の再コンパイル古い.elcファイルを削除する必要があります。0を削除するだけです。

1

(byte-compile-file)は私が以前にelpaを使ってインストールしたパッケージを手動で再コンパイルする必要があるときに働いてくれました。特にこのような状況のため

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

関連する問題