如何对 .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。 请问应该怎么用? @nacho4demacs -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 目录中的所有内容进行字节编译?的主要内容,如果未能解决你的问题,请参考以下文章