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

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

我对其进行了一些定制,添加了一些内容,例如yasnippetcolor-themesunbound 和其他内容。我已经设置了一个 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 目录中的所有内容进行字节编译?

【问题讨论】:

    标签: emacs elisp bytecode dot-emacs


    【解决方案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")'
      

      【讨论】:

      • 请问应该怎么用?
      • @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 版本)中,它将首先尝试连接到正在运行的守护程序(如果有的话),如果没有,它会启动一个并连接你。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-17
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 2020-07-01
      相关资源
      最近更新 更多