Emacs如何设法立即启动许多el文件?


11

每个Emacs'er都会知道,我目前正遭受广泛的dot-Emacs配置困扰。我所有的软件包都在的容器内use-package,并且我对所有-files进行了.el字节编译。即使这样,Emacs也会在6.4秒内启动,然后再加载其余的软件包(其中约40个)。

我在考虑解决启动时间过长的另一种方法,然后我发现了一些问题。默认的Emacs(无用户配置)使用许多.el库,每个Emacs都包含这些库。它们位于中\shares\emacs\version number\lisp\

即使有许多Lisp文件,它也可以在一秒钟内开始使用。当我检查默认Emacs随附的许多软件包的文件时,没有发现任何异常现象可以解释为什么Emacs设法在一秒钟内启动。谁能告诉我Emacs如何管理该文件(即使有数千个.el文件)?


1
您是否:defer tuse-package声明中使用?
lunaryorn

7
通过构建Emacs时使用的转储机制,将Emacs中的许多核心库预先加载到可执行文件中,这也给人一种幻觉,即它以惊人的速度快速加载了很多东西。看看您是否有兴趣学习。C-h i g (elisp) Building Emacs
phils 2015年

2
@phils:如果您可以将评论扩展到一个答案,那将是很棒的,似乎Emacs-SE上根本没有提到转储机制。
辣椒粉

而我的76S ..
Leu_Grady

辣椒粉:完成..
phils 2015年

Answers:


9

谁能告诉我Emacs如何管理它,即使有成千上万个.el文件?

Emacs通过在启动时不加载来“管理”该操作,从而不会阻止核心应用程序的加载。这反过来又是更快地将键盘控制返回给用户的效果。

但是何时加载?首次使用该功能,模式或功能时。

不会慢下来吗?是的,第一次使用。这就是权衡。您是否要在emacs启动时或首次使用时降低速度。

值得注意吗?由于还加载了其他核心库,因此启动时的加载似乎需要更长的时间。但是在第一次使用时,由于只加载该子集功能,因此感觉更快。

那为什么有人会在启动时选择负载呢?由于有些人不介意在启动时等待加载所有常用的库,因此一旦加载,所有操作便会迅速执行。

我该如何选择?正如Drew和其他人在对这个问题的回答中所指出的那样,您可以使用自动加载和类似的技巧进行控制。但是最重​​要的考虑因素应该是您的使用模式。如果您碰巧像vi一样使用emacs,并且不断地打开和关闭,则启动时间非常痛苦。但是另一方面,如果您始终使用emacs运行,那么1秒或1分钟的启动时间就不会那么引人注目或那么重要了。

请注意,您可以在测试,运行或使用vi等emacs时,使用批处理模式Zile进行即时启动。

我的偏好是在启动时加载,这样任何错误都会被提前捕获。在工作日中,当我有无数的缓冲区,模式和编译状态以及TRAMP管理的多个远程位置处于活动状态时,我宁愿不必处理任何负载错误。在这种情况下调试自动加载错误不是很愉快。


10

启动时,其中的许多库均未加载。

一些命令等会自动加载,这意味着Emacs可以识别它们并知道如何加载它们。当您尝试使用自动加载的命令时,Emacs会加载定义它的库(如果尚未加载)。

您可以为自己的命令或未编写的库中的命令创建自己的自动加载。请参见Elisp手册,节点“ 自动加载”


我认为是所谓的延迟加载吗?是否有任何示例是如何实现延迟加载的,仅在调用时才加载?
ReneFroger

不知道你在问什么。是的,您可以将其称为延迟加载。Elisp手册中有示例和说明。;;;###autoload在库中的命令定义之前添加自动加载cookie()是为其提供自动加载定义的一种方法,以确保在有人调用它时将加载其库。
提请

...但是请阅读该手册链接以了解如何/是否处理这些自动加载Cookie。软件包管理器为所有ELPA软件包处理它们。否则,您将(autoload...)直接在init文件中调用以注册它们。
phils 2015年

感谢您的两个回答,这有助于您找到更多信息!
ReneFroger

9

除了其他答案(可以解释大多数库实际上是如何仅按需加载)之外,还存在在可执行文件本身中预加载许多核心elisp库的问题emacs,这给它加载一个错觉带来了错觉。很多事情都非常迅速。

这是通过运行一个所谓的“裸”的Emacs的版本来实现(这是实际编制,这全功能的,但只包含elisp的解释和C语言编写的其他核心功能),并告知负载所有的elisp库都应该预先加载,然后才最终emacs用内置的那些库“转储”出实际的二进制文件。

此机制在elisp手册中有详细介绍:
C-hig (elisp) Building Emacs RET

如果您自己编译了Emacs,则可以尝试此过程,如果愿意,甚至可以转储最终可执行文件的替代版本(通常不建议这样做,但是该工具已经存在)。

编译后的temacs二进制文件可以在src目录中找到,您可以通过运行每个版本来比较启动时间的不同,如下所示:

$ time ./temacs -l loadup --batch
$ time ./emacs --batch

在我的系统上,前者大约需要4秒钟(在加载111个elisp库的过程中),而后者大约需要0.02秒。


@phils非常感谢您提出这一点。
Emacs用户
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.