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

Posted

技术标签:

【中文标题】如何对 .emacs.d 目录中的所有内容进行字节编译?【英文标题】:How do I byte-compile everything in my .emacs.d directory? 【发布时间】:2010-11-16 01:47:06 【问题描述】:

我决定看看 Emacs,我非常喜欢它。现在,我正在使用Emacs Starter Kit,它为 Emacs 的默认安装提供了更好的默认设置和一些不错的自定义。

我对其进行了一些定制,添加了一些内容,例如yasnippet、color-themes、unbound 和其他内容。我已经设置了一个 github repository 来保存所有自定义项,以便我可以从多个位置访问它们,或者以防万一出现问题并且我丢失了 .emacs.d 目录。

这一切都很好,但是有一个问题:Emacs 大约需要 1-2 秒才能加载。 AFAIK 我可以使用 M-x byte-compile-file 将单个 .el 文件编译为 .elc,它可以工作。但是有很多.el文件,不知道有没有办法用一个简单的命令什么的把它们全部编译,加快Emacs的加载速度。我的 Emacs 并不总是打开,而且我经常打开和关闭它,尤其是在我将它设置为 Total Commander 中编辑命令的默认编辑器以更快地习惯它之后(是的,这里是 windows xp)。

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

我不确定加载时首选哪个版本,.el 或编译的 .elc 顺便说一下 O.o

那么,是否有一个 elisp 命令或 Emacs 命令行开关可以让 Emacs 对 .emacs.d 目录中的所有内容进行字节编译?

【问题讨论】:

【参考方案1】:

我使用的命令是M-x byte-force-recompile RET,然后它会询问目录,例如,我给它~/.emacs.d/elpa/。然后它会重新编译那里的所有内容,通常不需要先删除 .elc 文件或以其他方式弄乱它。

【讨论】:

【参考方案2】:

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

【讨论】:

不同的东西。 ELPA/MELPA 的东西在自己的归档层次结构中定义了构建方法。 byte-recompile-directory 尝试编译用户定义目录中的所有 .el 文件。【参考方案3】:

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

要全部重新编译,请执行

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

或从 Makefile 重新编译单个文件,

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

【讨论】:

改用batch-byte-compile。 请问应该怎么用? @nacho4d emacs -Q --batch -f batch-byte-compile *.el foo/*.el - 它不像 byte-recompile-directory 那样递归。 您可能想添加一个参数来强制重新编译,例如。 emacs --batch --eval '(byte-recompile-directory "~/.emacs.d" 0)'【参考方案4】:

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

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

令人惊讶的是,它并没有增加我的启动时间(除非需要编译一些东西)。

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

【讨论】:

autoloads 文档已移动。这和 profile-dotemacs.el 参考正是我遇到此页面时所需要的。【参考方案5】:

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

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

C-u 0 部分是让它不询问每个没有 .elc 对应文件的 .el 文件。

【讨论】:

此后(每个都编译一次),只需使用相同的命令,不带C-u 0(又名C-0,顺便说一句)。这将只对那些比其字节编译版本更新的源文件进行字节编译。 一点提示:对我来说,直到我删除了所有相应的 «.elc» 文件后才起作用。它只是告诉类似“完成,编译 0 个文件,跳过 α 个文件”。 @Hi-Angel 我有同样的问题。你找到解决办法了吗? @zhanxw 是的。不幸的是,该命令仅编译已更改或没有“.elc”对应文件的文件。因此,要首先重新编译目录中的所有内容,您必须删除所有 «.elc» 文件。 不幸的是交互式命令没有公开它,但是如果您直接调用该函数,您可以使用可选参数FORCE 重新编译已经具有关联“.elc”的文件,即使它们'不早于源文件:M-: (byte-recompile-directory "/the/directory/" 0 t)【参考方案6】:

这个问题有点摇摆不定,但要解决加载缓慢的问题,您可以使用 Emacs 23 中的新守护程序功能。

“如果你有很多支持包, emacs 启动可能有点慢。 但是,emacs 23 带来了 emacs --daemon,它使您能够在后台启动 emacs(例如 当您登录时)。您可以立即 弹出新的emacs窗口(框架) emacs客户端。当然,你可以 已经有一个emacs“服务器” 旧版本,但能够 在后台启动它使这个 更好的解决方案”

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

【讨论】:

我一定要去看看这个。谢谢! 如果您将 alias emacs='emacsclient -nw -a "" -c' 添加到您的 .bashrc(或您的 shell 版本)中,它将首先尝试连接到正在运行的守护程序(如果有的话),如果没有,它会启动一个并连接你。

以上是关于如何对 .emacs.d 目录中的所有内容进行字节编译?的主要内容,如果未能解决你的问题,请参考以下文章

如何修复“源文件比字节编译文件更新”错误?

把emacs.d/init.el 文件放在其他目录启动

我的emacs配置

windows环境下emacs的python简单配置

一些 emacs 桌面保存问题:如何将其更改为保存在 ~/.emacs.d/.emacs.desktop

设置 .emacs.d 文件夹后如何从 Emacs 运行 Clojure REPL