ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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

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

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

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


L
Laurynas Biveinis

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

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

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


此后(一旦每个都编译一次),只需使用不带 C-u 0 的相同命令(又名 C-0,顺便说一句)。这将仅对那些比其字节编译版本更新的源文件进行字节编译。
一点提示:对我来说,直到我删除了所有相应的 «.elc» 文件后才起作用。它只是告诉类似“完成,0 个文件已编译,α 个文件已跳过”。
@Hi-Angel 我也有同样的问题。您找到任何解决方案了吗?
不幸的是,交互式命令没有公开它,但是如果您直接调用该函数,则可以使用可选参数 FORCE 重新编译已经具有关联“.elc”的文件,即使它们不比源文件旧: M-: (byte-recompile-directory "/the/directory/" 0 t)
您还可以使用 byte-force-recompile 命令获取 FORCE 选项。
R
Richard Hansen

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

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

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

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


autoloads 文档已移动。这和 profile-dotemacs.el 参考正是我遇到此页面时所需要的。
M
Mike Samuel

您可以使用 --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)'
m
mwilliams

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

“如果你有很多支持包,那么emacs启动可能会有点慢。但是,emacs 23带来了emacs --daemon,它可以让你在后台启动emacs(例如当你登录时)。你可以立即弹出“

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


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

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


Y
Yu Shen

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


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