我怎样才能使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'"))'
其他人已经覆盖使用gnuserve
和emacsclient
,我build议在emacs内编译(能够跳转到编译错误是一个胜利)。
但是,特别是加速.emacs可以通过以下方式完成:
-
字节编译.emacs文件,你可以使用这段代码自动执行
-
用自动加载function代替许多
(require 'package)
语句。 这将延迟lisp的加载,直到实际需要为止。 使用这种技术可以让我的启动速度从6秒增加到<1秒。 这需要一点点工作,因为并不是所有的库都能正确标记autoload
。 -
删除不再使用的代码/function。
-
尝试使用选项
--no-site-file
来运行emacs,以避免在站点安装site-start.el
加载不必要的软件包。 -
如果你真的认真,你可以用自己喜欢的function来加载自己的emacs。 这当然意味着更多地涉及到更改您的
.emacs
因为它是二进制文件的一部分。 请按照链接了解如何使用dump-emacs
。 -
购买更快的电脑和/或更快的磁盘。
如何确定你的.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
命令将其移回前景。
一些技巧:
-
使用自动加载
使用自动加载function可以保存加载库直到使用它们。 例如:
(if (locate-library "ediff-trees") (autoload 'ediff-trees "ediff-trees" "Start an tree ediff" t))
-
编译你的.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)
-
学会爱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是您以后的会议快速启动时间。