如何对.emacs.d目录中的所有内容进行字节编译?


138

我决定去看看Emacs,我非常喜欢它。现在,我正在使用Emacs入门工具包,该工具包提供了更好的默认设置以及一些对Emacs默认安装的不错的自定义设置。

我已经对其进行了一些自定义,并添加了诸如yasnippetcolor-themesunbound和其他内容。我已经建立了一个github存储库,其中保留了所有自定义项,以便可以从多个位置访问它们,或者万一发生问题而丢失了.emacs.d目录。

所有这些都非常好,但是有一个问题:Emacs大约需要1-2秒来加载。我可以用Mx字节编译文件将单个.el文件编译为.elc,并且可以工作。但是有很多.el文件,我想知道是否有一种方法可以用简单的命令或类似的东西来编译它们,从而加快Emacs的加载速度。我的Emacs并不总是打开的,我经常打开和关闭它,尤其是在将它设置为Total Commander中默认的edit命令编辑器以使其习惯之后(尤其是Windows xp)。

我的Emacs版本是22.3。是的,没有任何自定义的默认Emacs安装会立即启动。

我不确定在加载时首选哪个版本,通过Oo方式选择.el还是编译的.elc。

因此,是否存在一个elisp命令或Emacs命令行开关来使Emacs字节编译.emacs.d目录中的所有内容?

Answers:


208

C-u 0 M-x byte-recompile-directory

将编译目录和下面所有子目录中的所有.el文件。

C-u 0部分是使其不问不具有.elc对应每一个.el文件。


9
然后(每次编译一次),只需使用相同的命令而不使用C-u 0(aka C-0,BTW)。这将仅字节编译那些比其字节编译版本更新的源文件。
德鲁

1
小提示:对我而言,直到我删除了所有相应的«.elc»文件,该命令才起作用。它只是说“完成,0个文件已编译,α个文件已跳过”。
Hi-Angel

1
@ Hi-Angel我也有同样的问题。您找到任何解决方案了吗?
zhanxw

@zhanxw是的。不幸的是,该命令仅编译已更改的文件或没有«.elc»副本的文件。因此,要重新编译目录中的所有内容,必须删除所有«.elc»文件。
Hi-Angel

2
不幸的是,交互式命令不会公开它,但是,如果直接调用该函数,则可以使用可选参数FORCE重新编译已经具有关联的“ .elc”的文件,即使它们不早于源文件:M-: (byte-recompile-directory "/the/directory/" 0 t)
jbm

44

为了在每次启动emacs时自动对所有需要字节编译的内容进行字节编译,将以下更改load-path放在.emacs文件顶部:

(byte-recompile-directory (expand-file-name "~/.emacs.d") 0)

令人惊讶的是,这并没有增加我的启动时间(除非需要进行编译)。

为了加快emacs的速度,我首先使用profile-dotemacs.el识别了速度较慢的部分,然后将其替换为autoloads


自动加载文档已移动。那和profile-dotemacs.el参考正是我遇到此页面时所需要的。
Digicrat

24

您可以使用该--batch标志从命令行重新编译。

要全部重新编译,请执行

emacs --batch --eval '(byte-recompile-directory "~/.emacs.d")'

或重新编译Makefile中的单个文件,

emacs --batch --eval '(byte-compile-file "your-elisp-file.el")'

5
请改用batch-byte-compile
npostavs

1
您可以使用它吗?
nacho4d 2014年

8
@ nacho4d- emacs -Q --batch -f batch-byte-compile *.el foo/*.el它不像字节重新编译目录那样递归。
Brian Burns

3
您可能想要添加一个参数以强制重新编译,例如。emacs --batch --eval'(byte-recompile-directory“〜/ .emacs.d” 0)'
Ibrahim

17

这个问题有点牵强,但是要解决加载缓慢的问题,可以使用Emacs 23中的新守护程序功能。

“如果您有很多支持包,那么emacs的启动可能会有点慢。但是,emacs 23带来了emacs --daemon,它使您能够在后台启动emacs(例如,登录时)。您可以立即弹出使用emacsclient建立新的emacs窗口(框架)。当然,您可以在较早版本中安装emacs'服务器',但是能够在后台启动它,这将是一个更好的解决方案。”

来自http://emacs-fu.blogspot.com/2009/07/emacs-23-is-very-near.html


我一定会检查一下这个。谢谢!
Mikka

2
如果将别名emacs ='emacsclient -nw -a“” -c“添加到.bashrc(或Shell的版本),它将首先尝试连接到正在运行的守护程序(如果没有),它将启动一个并进行连接您。
Frederick

2

对于我使用spacemacs的命令是spacemacs/recompile-elpa。该命令byte-recompile-directory不编译任何文件。


2
不同的东西。ELPA / MELPA东西已经在其自己的归档层次结构中定义了构建方法。byte-recompile-directory尝试编译用户定义目录中的所有.el文件。
RichieHH
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.