如何让Emacs更快启动?

时间:2009-04-22 19:12:01

标签: emacs performance

我使用Emacs v.22(控制台版本,远程使用PuTTY或本地使用Konsole)作为Linux上的主要文本编辑器。虽然每次启动它都需要一段时间来加载,可能差不多一秒钟,尽管我从来没有计时。我倾向于打开和关闭Emacs,因为我更习惯使用Bash命令行进行文件/目录操作和编译。

如何加快启动时间?

17 个答案:

答案 0 :(得分:58)

其他人已经介绍过使用gnuserveemacsclient,我建议在emacs中进行编译(能够跳转到编译错误是一种胜利)。

但是,特别是加速.emacs可以通过以下方式完成:

  1. 编辑.emacs文件的字节,您可以使用this snippet of code自动执行

  2. 使用autoload ed功能替换尽可能多的(require 'package)语句。这将延迟加载lisp直到它实际需要。使用这种技术,我可以将启动时间从> 6秒加速到<1。这需要一些工作,因为并非所有库都标记为autoload

  3. 删除不再使用的代码/功能。

  4. 尝试使用选项--no-site-file运行emacs,以避免在网站安装site-start.el中加载不必要的包。

  5. 如果您真的很认真,可以使用已加载的喜爱功能滚动自己的emacs。当然,这意味着更多地参与更改.emacs中的内容,因为它是二进制文件的一部分。请点击此链接,了解有关如何使用dump-emacs

  6. 的信息
  7. 购买更快的电脑和/或更快的磁盘。

  8. 如何确定.emacs加载的内容

    现在,您如何找到.emacs加载的内容?目标是删除功能,还是延迟它?检查 *Messages* 缓冲区,其中包含以下行:

    Loading /home/tjackson/.emacs.tjackson.el (source)...
    Loading /home/tjackson/installed/emacs/lisp/loaddefs.el (source)...done
    Loading /user/tjackson/.elisp/source/loaddefs.el (source)...done
    Loading autorevert...done
    Loading /home/tjackson/.emacs.tjackson.el (source)...done
    

    如果您注意到,Loading语句可以嵌套:第一个.emacs.tjackson.el...结尾,最后一行显示.emacs.tjackson.el加载为{{1} }。所有其他文件都是从我的...done文件中加载的。所有其他负载都是原子的。

    注意:如果你有一个很大的.emacs, .emacs.tjackson.el 缓冲区可能会丢失一些消息,因为它只保留一个固定的数量信息。您可以尽早将此设置添加到*Messages*以保留所有消息:

    .emacs

    注意: 'load命令会在第四个参数(setq message-log-max t) 为非零时禁止消息,因此删除任何此类调用(或者,建议{{1并强制第四个参数为nomessage)。

答案 1 :(得分:37)

Adam Rosenfield's solution之外,我建议使用Emacs in server mode。您可以将(server-start)添加到您的dotemacs,并在想要在Emacs中打开文件时运行emacsclient而不是emacs。这样你只需支付一次Emacs的装载成本,然后立即弹出客户端。

修改

你是对的,v22不会创建新的框架。创建一个执行技巧的shell脚本:

#!/bin/bash
# Argument: filename to open in new Emacs frame
/usr/bin/emacsclient -e '(let ((default-directory "`pwd`/")) (select-frame (make-frame)) (find-file "'$1'"))'

答案 2 :(得分:28)

每次要使用shell时都不要关闭Emacs。使用Ctrl-Z将Emacs移动到后台,使用Bash中的fg命令将其移回前台。

答案 3 :(得分:21)

一些提示:

  1. 使用自动加载

    使用自动加载功能可以使您免于加载库,直到您使用它们为止。 例如:

    (if (locate-library "ediff-trees")
        (autoload 'ediff-trees "ediff-trees" "Start an tree ediff" t))
    
  2. 编译.emacs

    虽然如果你有陷阱,但速度会略有提高 使用版本控制,你的.emacs比.emacs.elc更新。 一个常见的伎俩是:

    (defun autocompile nil
      "compile itself if ~/.emacs"
      (interactive)
      (require 'bytecomp)
      (let ((dotemacs (file-truename user-init-file)))
        (if (string= (buffer-file-name) (file-chase-links dotemacs))
          (byte-compile-file dotemacs))))
    
    (add-hook 'after-save-hook 'autocompile)
    
  3. 学会爱上emacs服务器。

    将emacs作为服务器运行意味着永远不必关闭它。然而 我注意到你仍在使用emacs22。 emacs23支持multi-tty 在一个屏幕会话中运行emacs然后启动它会容易得多 另一个终端的新窗口。我使用emacs编辑邮件的邮件 客户端(mutt)和emacsclient非常适合这些快速编辑。

答案 4 :(得分:19)

其中一个

M-x shell
M-x eshell
M-x term
M-x ansi-term

应该满足您在Emacs中的命令行需求。

你也可以使用M-!(又名M-x shell-command)来执行单线程而不会掉到shell中。

答案 5 :(得分:14)

检查您的.emacs文件,看看您是否正在加载不必要的软件包。加载包可能会花费大量时间。例如,如果您正在编辑PHP文件,则可能只想加载php-mode包。你可以通过安装一个钩子程序来做到这一点,虽然我不确定细节。

还要确保您正在加载的所有包都已编译(.elc个文件)。您可以通过运行

编译elisp文件
emacs -batch -f batch-byte-compile thefile.el

编译的包加载速度比未编译的包快得多。

答案 6 :(得分:13)

“我倾向于打开和关闭emacs,因为我更习惯使用bash命令行进行文件/目录操作和编译。”

你正在描述像vim这样的编辑器的使用方式。射入和射出。 Emacs通常是开放的,大多数都是从“内部”完成的。希恩已经回答了这里正确的做法。

答案 7 :(得分:11)

最快的方法是profile your .emacs。在我发现我的.emacs中的4条特定线占用了超过80%的加载时间后,我在5分钟内将加载时间从> 3s减少到1s。

答案 8 :(得分:9)

除了.emacs(正如其他人建议的那样)之外,有助于减少autoload加载时间的一件事是eval-after-load。在以下示例中,将呼叫延迟到sql-set-product可以使您不必在sql中加载.emacs,从而使现有的sql自动加载更加有效。

(eval-after-load "sql"
  '(progn
     (sql-set-product 'mysql)
     (setq sql-mysql-options '("-C" "-t" "-f" "-n"))
     (setq sql-sqlite-program "sqlite3")
     ))

当然,对于某些软件包,有一个hook可用,你可以做同样的事情,但有时候没有,或者这种方式证明更容易思考。

答案 9 :(得分:8)

Emacs旨在“始终”(或至少长时间)运行,因此不建议在一天内多次启动和停止Emacs。

我建议使用屏幕。屏幕是终端多路复用器,在一个终端中为您提供无限的虚拟终端。

安装完成后,只需在终端中输入“screen emacs”即可。 Emacs将照常启动,但按“c-a c”(即按ctrl-a然后按c)将打开一个新的虚拟终端。你可以按“c-a c-a”(这是ctrl-a的两次)来回到emacs。

您甚至可以从正在运行的屏幕会话中分离,键序列为“c-a d”。

通过发出“screen -R”重新附加到会话,您将返回到您离开的位置。这使您可以在工作中启动emacs会话,分离,回家并从家中重新连接。

我连续几个月一直在运行这样的Emacs。

以下是官方网站:http://www.gnu.org/software/screen/但请尝试使用Google搜索屏幕教程和howtos

答案 10 :(得分:5)

您可以使用benchmark-init来配置您的Emacs启动。它将跟踪正在加载的模块以及每个模块花费的时间。结果可以以表格形式或树形式呈现。树可以更容易地跟踪谁加载了什么,这在加载具有大量依赖关系的包时会很有帮助,并且列表形式可以帮助您快速找到大部分时间花在哪里。

获得这些结果后,请尝试确定是否必须始终加载所有模块,或者是否可以按需加载其中一些模块。例如,在我的配置中,我只加载特定于某些模式的Emacs扩展,当该模式实际被激活时,因为大多数时候我只在会话中使用它们的一小部分。 eval-after-load和模式挂钩将成为你的朋友。

通过应用此方法我的Emacs在3-4秒内启动,并且我安装了接近200个扩展程序。大部分时间用于加载Helm,我总是加载它,因为它取代了总是需要的find-file和其他核心功能,以及CEDET,因为我使用最新版本并且必须在Emacs尝试加载旧版本之前加载它内置版本。

答案 11 :(得分: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-show / duration-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

答案 12 :(得分:4)

其他人没有提到的一件事是将您使用的elisp库包含在dumped Emacs中,以便将库加载时间从Emacs启动移动到Emacs构建。这不适合胆小的人,但是如果你在.emacs中加载了几个库,它可以赢得你几秒钟的启动时间。

答案 13 :(得分:3)

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

答案 14 :(得分:3)

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

我不知道如何让它开始更快,但我可以提出一些建议:

  • 对于您在命令行中执行的大多数操作,您可以在emacs中执行这些操作:

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

    • emacs file.ext &
    • 在后台打开emacs,这样你仍然可以使用shell(这最适合使用putty和X转发,比如Xming)

答案 15 :(得分: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

答案 16 :(得分:1)

我必须检查我的自定义,但有一个名为gnuserve或emacsclient的包。它迁移了很多,所以你必须谷歌。

它在后台运行一个emacs会话。 emacs的任何进一步会话基本上只是该会话的新帧。一个优点是您以后的会话的快速启动时间。