如何让Emacs启动更快?

76
我使用Emacs v. 22(控制台版本,可以通过PuTTY远程或在本地使用Konsole)作为我的Linux主要文本编辑器。每次启动它都需要一段时间来加载,可能接近一秒钟,虽然我从未计时过。我倾向于经常打开和关闭Emacs,因为我更喜欢使用Bash命令行进行文件/目录操作和编译。
如何加快启动时间?

2
我在Ubuntu上遇到了同样的问题。默认软件包配置会自动加载许多Emacs包,我无法弄清楚如何阻止我不需要的那些包。 - Chris Conway
5
@Chris,尝试使用--no-site-file启动Emacs,可能安装了不需要的包。 - Trey Jackson
2
我们通过减少客户端和服务器之间传输的一些颜色信息,大幅度地降低了我所在工作场所的Emacs的加载时间(加载时间减少了约80%)。 - Dominic Rodger
1
优化你的 .emacs 配置文件。我在下面的回答中发布了一个链接,解释了如何做到这一点。 - Vicky Chijwani
你不需要完全关闭Emacs, 只需通过输入'C-z'将其挂起。然后,在bash中键入命令'fg'以在前台继续它。除此之外,尝试在Emacs中键入'M-x term',以便在Emacs内(在你的shell内部)拥有一个shell。这样,你实际上永远不必离开Emacs,只需要在缓冲区中拥有另一个bash shell即可。 - Thomas
17个回答

6
你可以使用benchmark-init来分析你的Emacs启动性能。它会跟踪加载了哪些模块以及每个模块花费的时间,并以表格或树形式呈现结果。树状图更容易追踪谁加载了什么,这在加载具有许多依赖项的包时非常有用,而表格形式则帮助你快速找到大部分时间消耗的地方。
一旦你有了这些结果,尝试确定是否所有模块都必须一直加载,或者是否可以按需加载其中的一些。例如,在我的配置中,我只在实际激活模式时加载特定于某些模式的Emacs扩展程序,因为大部分时间我只在会话中使用其中的一小部分。eval-after-load和模式钩子将成为你的好朋友。
通过应用这种方法,我的Emacs可以在3-4秒内启动,并且我安装了接近200个扩展。大部分时间都花在加载Helm上,因为我总是加载它来替换find-file和其他始终需要的核心功能,以及CEDET,因为我使用最新版本,必须在Emacs尝试加载较旧的内置版本之前加载它。

5

试着使用https://github.com/jwiegley/use-package宏来定义你的软件包加载和自定义。它为你处理了软件包的延迟加载,使得即使在配置了大量软件包的情况下,启动时间也相对容易达到良好的水平。我的.emacs文件中有近100个引用的软件包,但在Linux上我的启动时间不到2秒,在Mac上为2.2秒。


4
我需要大约120秒的启动时间。我能够找到解决方法,安装这个:https://github.com/dholm/benchmark-init-el,并将其放在你的init.el文件顶部。
(let ((benchmark-init.el "~/.emacs.d/el-get/benchmark-init/benchmark-init.el"))
  (when (file-exists-p benchmark-init.el)
    (load benchmark-init.el)))

当你启动emacs后,运行以下命令:

M-x benchmark-init/show-durations-tree

在我的电脑上,问题出现在tramp-loaddefs花费了127秒的时间。

我通过添加以下代码来解决这个问题:

127.0.0.1  host.does.not.exist

我将/etc/hosts文件添加到了我的启动程序中,这使得我的启动速度更快。

更多信息请参见:https://github.com/emacs-helm/helm/issues/1045

另外一个可能对你有帮助的东西是:https://www.emacswiki.org/emacs/ProfileDotEmacs


1
你拯救了我的理智。因为那个问题,我的初始化文件要花费约2分钟的时间。谢谢! - silgon

4

其他人没有提到的一件事是,将您使用的elisp库作为dumped Emacs的一部分包含在内,以将库加载时间从Emacs启动移动到Emacs构建。这并不是一件容易的事情,但如果您在.emacs中加载了几个库,它可以为您赢得几秒钟的启动时间。


3

这并不回答问题,但有点相关

我不知道如何使它快速启动,但是我可以建议几件事情:

  • 对于大多数在命令行上执行的操作,您都可以在Emacs中执行:

    • 编译:M-x compile,然后键入您使用的命令
    • 我的经验只涉及C ++,但是使用g ++时,您可以按C-x`跳转到编译器抱怨的行
    • 运行shell命令:M-!,将输出转储到缓冲区
    • 交互式shell:M-x shell
  • 或者,您可以像这样运行emacs:

    • emacs file.ext &
    • 这会在后台打开emacs,因此您仍然可以使用shell(这最好在putty和Xming之类的东西中使用X转发)

2

我正在尝试解决同样的问题,当我在这里看到这个问题时。我只想补充一点,对我来说问题不是因为emacs lisp包的加载时间,而是主机没有完全解析主机名。

要检查包加载时间,请执行以下操作

M-x emacs-init-time

对我而言,加载时间极高,但实际上只有0.3秒。在正确更改了我的主机名后,问题得到了解决。

要配置完全解析的主机名,请编辑/etc/hostname和/etc/hosts文件,内容如下:

127.0.0.1       localhost localhost.localdomain
192.168.0.2   hostname hostname.domain

1

我需要检查我的自定义设置,但是有一个叫做gnuserve或emacsclient的软件包。它经常迁移,所以你需要在谷歌上搜索。

它在后台运行一个emacs会话。任何进一步的emacs会话本质上都只是该会话的新框架。其中一个优点是后续会话的快速启动时间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接