14

現在、MELPA と Marmalade を使用してできる限りインストールを行っており、~/.emacs.d は git を使用して管理しています。ただし、git ignore *.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/company-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'

package.el と同じファイルだけを Emacs でバイトコンパイルするにはどうすればよいですか?

4

6 に答える 6

10

package.el は実際にはまったく同じ方法を使用します。起動時に再コンパイルすると、エラーがより目立ちます。

使用される関数はpackage--make-autoloads-and-compileで、次を呼び出します。

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

したがって、質問の元のコードは正しいです。ただし、まだコンパイルされていないディレクトリを再コンパイルするには、次の操作を実行できます。

(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)
于 2013-03-12T14:53:06.503 に答える
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 ディレクトリを削除し、すべてを再インストールします (上記のコードを使用)。

于 2013-03-12T14:04:34.977 に答える
6

「古い.elcファイルを自動的に再コンパイルするにはどうすればよいですか」というより一般的な質問に対する私が好む解決策はhttps://github.com/tarsius/auto-compileを使用することです

以前は、遭遇したほとんどの状況をカバーするカスタム ソリューションがいくつかありましたが、このライブラリは、私が行っていたすべてのことをカバーしています。他のものをロードする前に初期化するだけで、ソートされます。

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

于 2014-02-24T20:07:12.630 に答える
2

まったく同じ方法でパッケージをバイトコンパイルすることに関するあなたの特定の問題に対する答えがわかりませんpackage.el

ただし、Melpa または marmalade を介して拡張機能をインストールする際に、git で emacs 構成ディレクトリを維持することに関するより一般的な問題については、この問題を解決するために設計されたpalletを参照することをお勧めします。

于 2013-03-11T19:33:44.057 に答える
2

(byte-compile-file) は、以前に elpa を使用してインストールしたパッケージを手動で再コンパイルする必要がある場合に役立ちました。

特にこの状況の場合: https://github.com/yjwen/org-reveal/issues/76t

于 2014-10-28T14:13:03.427 に答える
1

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

于 2014-02-24T19:34:41.857 に答える