我怎样才能使Emacs的启动速度更快?

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

我怎样才能加快启动时间?

除了Adam Rosenfield的解决scheme外 ,我build议在服务器模式下使用Emacs 。 你可以添加(server-start)到你的dotemacs,并且当你想在Emacs中打开文件时运行emacsclient而不是emacs 。 这样你只需要支付一次Emacs的加载成本,然后客户端立即popup。

编辑

你是对的,v22不会创build一个新的框架。 创build一个可以做到这一点的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'"))' 

其他人已经覆盖使用gnuserveemacsclient ,我build议在emacs内编译(能够跳转到编译错误是一个胜利)。

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

  1. 字节编译.emacs文件,你可以使用这段代码自动执行

  2. 用自动加载function代替许多(require 'package)语句。 这将延迟lisp的加载,直到实际需要为止。 使用这种技术可以让我的启动速度从6秒增加到<1秒。 这需要一点点工作,因为并不是所有的库都能正确标记autoload

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

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

  5. 如果你真的认真,你可以用自己喜欢的function来加载自己的emacs。 这当然意味着更多地涉及到更改您的.emacs因为它是二进制文件的一部分。 请按照链接了解如何使用dump-emacs

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

如何确定你的.emacs加载

现在,你如何找出你的.emacs加载? 随着目标去除function,或延迟? 检查你的*Messages*缓冲区,其中包含如下行:

正在载入/home/tjackson/.emacs.tjackson.el(来源)...
正在加载/home/tjackson/installed/emacs/lisp/loaddefs.el(source)... done
正在加载/user/tjackson/.elisp/source/loaddefs.el(源)...完成
正在加载autorevert ... done
加载/home/tjackson/.emacs.tjackson.el(源)...完成

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

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

 (setq message-log-max t) 

注意:如果'load命令的第四个参数nomessage不是零,那么'load命令将会压缩这个消息,所以删除所有这样的调用(或者,build议'load并强制第四个参数nil )。

每次你想使用shell时都不要closuresEmacs。 使用Ctrl-Z将Emacs移动到背景,并使用Bash中的fg命令将其移回前景。

一些技巧:

  1. 使用自动加载

    使用自动加载function可以保存加载库直到使用它们。 例如:

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

    如果您使用版本控制,并且您的.emacs比.emacs.elc更新,那么您可以稍微提高速度,尽pipe存在一些缺陷。 一个常见的技巧是:

     (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作为服务器运行意味着永远不必closures它。 但是我注意到你仍然使用emacs22。 emacs23支持multi-tty,这使得在一个屏幕会话中运行emacs更容易,然后在另一个terminal上显示新的窗口。 我使用emacs编辑邮件给我的邮件客户端(mutt),emacsclient对于这些快速编辑来说是非常棒的。

之一

 Mx shell Mx eshell Mx term Mx ansi-term 

应该从Emacs内部满足您的命令行需求。

你也可以用M-! (又名Mx shell-command )来执行一个单行程而不丢弃到shell。

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

还要确保你正在加载的任何软件包都被编译( .elc文件)。 你可以通过运行编译一个elisp文件

 emacs -batch -f batch-byte-compile thefile.el 

编译的软件包加载比未编译的软件包要快得多。

“我倾向于打开和closuresemacs很多,因为我更喜欢使用bash命令行进行文件/目录操作和编译。”

你正在描述像vim这样的编辑器的使用方式。 拍摄和出。 Emacs通常保持开放,大部分都是从“内部”完成的。 hiena已经回答了这里的正确方法。

最快的方法是configuration您的.emacs 。 在我发现我的.emacs中的4个特定行占用了超过80%的加载时间之后,我在5分钟内将加载时间从3s减less到了1s。

有一件事帮助我减less了我的.emacs的加载时间,除了autoload (如其他人所build议的),是加载后的eval 。 在以下示例中,延迟对sql-set-product的调用可以使您不必在.emacs加载sql ,从而使现有的sql自动加载更加有效。

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

当然,对于一些软件包来说,会有一个可用的钩子 ,你可以做同样的事情,但是有时候没有,或者这种方式更容易考虑。

Emacs被devise为“一直运行”(或至less很长一段时间),因此不build议在一天内启动和停止多次Emacs。

我会build议使用屏幕。 屏幕是一个terminal多路复用器,在一个terminal给你一个无限的虚拟terminal。

安装完成后,只需在terminal中input“screen emacs”。 Emacs将像往常一样启动,但按“ca c”(即按ctrl-a然后c)将打开一个新的虚拟terminal。 你可以通过按“ca ca”(这是两次ctrl-a)返回到emacs。

你甚至可以脱离正在运行的屏幕会话,按键顺序是“ca d”。

通过发出“screen -R”重新join会议,你将回到你离开的地方。 这使您可以在工作中启动emacs会话,分离,回家,并在家中重新连接。

我已经连续几个月一直在运行Emacs。

以下是官方网站: http ://www.gnu.org/software/screen/,但尝试search屏幕教程和howtos

其他人没有提到的一件事就是把你用作转储Emacs的一部分的elisp库包括在Emacs的启动到Emacs的构build中。 这不是为了胆小鬼,但是如果你在.emacs加载了几个库,它可以赢得几秒的启动时间。

您可以使用benchmark-init来分析您的Emacs启动。 它将跟踪哪些模块正在加载以及每个模块花了多less时间。 结果可以以表格forms或以树forms呈现。 树可以更容易地跟踪谁加载了什么,当您加载一个包含很多依赖项的包时这会很有帮助,并且列表forms可以帮助您快速find大部分时间都花在哪里。

一旦你有这些结果,试着找出是否所有的模块必须一直加载,或者如果你可以按需加载其中的一些。 例如,在我的configuration中,我只加载特定于特定模式的Emacs扩展,因为大多数时候我只在会话中使用它们的一小部分。 eval-after-load和模式钩子将成为你的朋友。

通过使用这种方法, 我的Emacs在3-4秒内启动,并且我已经安装了近200个扩展 。 大部分时间都是用来加载Helm,因为我用的是最新的版本,所以我总是加载它,因为它代替了find-file和其他一些常用的核心函数,而CEDET因为我使用了最新版本,所以在Emacs尝试加载旧的内置版本。

这并没有回答这个问题,但是有点相关

我不知道如何让它开始更快,但有几件事我可以build议:

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

    • 编译:Mx编译,然后input你使用的命令
    • 我的经验是只用C ++,但用g ++,你可以按Cx来跳转到编译器抱怨的行
    • 运行shell命令:M-!,将输出转储到缓冲区中
    • 交互式shell:Mx shell
  • 或者,你可以像这样运行emacs:

    • emacs file.ext &
    • 这会在后台打开emacs,所以你仍然可以使用shell(这对于像Xming这样的putty和X转发是最好的)

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

要检查你的包装加载时间吗

 Mx emacs-init-time 

对我来说,这是0.3秒,但加载时间非常高。 正确更改我的主机名后,它解决了这个问题。

要configuration完全parsing的主机名,请编辑/ etc / hostname和/ etc / hosts文件:

 127.0.0.1 localhost localhost.localdomain 192.168.0.2 hostname hostname.domain 

尝试使用https://github.com/jwiegley/use-packagemacros来定义您的软件包加载和自定义。; 它为您处理延迟加载的包,使得即使存在大量已configuration的包,也可以轻松获得良好的启动时间。 我在.emacs中引用了将近100个软件包,但启动时间在Linux上是2秒,在Mac上是2.2s。

我有大约120秒的开始时间。 我能find修复安装这个:

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启动了,运行:

Mx 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

我将不得不检查我的定制,但有一个名为gnuserve或emacsclient的软件包。 它迁移很多,所以你将不得不谷歌。

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