我使用Emacs v.22(控制台版本,远程使用PuTTY或本地使用Konsole)作为Linux上的主要文本编辑器.虽然每次启动它都需要一段时间来加载,可能差不多一秒钟,尽管我从来没有计时.我倾向于打开和关闭Emacs很多,因为我更习惯使用Bash命令行进行文件/目录操作和编译.
如何加快启动时间?
其他人已经介绍过使用gnuserve
和emacsclient
,我建议在emacs中进行编译(能够跳转到编译错误是一种胜利).
但是,特别是加速.emacs可以通过以下方式完成:
字节编译.emacs文件,您可以使用此代码段自动执行此操作
(require 'package)
用自动加载功能替换尽可能多的语句.这将延迟加载lisp直到它实际需要.使用这种技术,我可以将启动速度从> 6秒加速到<1.这需要一些工作,因为并非所有库都被正确标记autoload
.
删除不再使用的代码/功能.
尝试使用选项运行emacs --no-site-file
以避免在站点安装中加载不必要的包site-start.el
.
如果您真的很认真,可以使用已加载的喜爱功能滚动自己的emacs.当然,这意味着更多地参与更改您的内容,.emacs
因为它是二进制文件的一部分.请点击链接以获取有关如何使用的信息dump-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
加载...done
.所有其他文件都从我的.emacs.tjackson.el
文件中加载.所有其他负载都是原子的.
注意:如果您有一个大的.emacs,*Messages*
缓冲区可能会丢失一些消息,因为它只保留固定数量的信息.您可以尽早添加此设置.emacs
以保留所有消息:
(setq message-log-max t)
注意:'load
如果消息的第四个参数nomessage
是非零,则命令将禁止消息,因此删除任何此类调用(或者,建议'load
并强制使用第四个参数nil
).
除了Adam Rosenfield的解决方案,我建议在服务器模式下使用Emacs.你可以添加(server-start)
到你的dotemacs,而emacsclient
不是emacs
每当你想在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'"))'
每次要使用shell时都不要关闭Emacs.使用Ctrl-Z将Emacs移动到后台,使用fg
Bash中的命令将其移回前台.
一些提示:
使用自动加载
使用自动加载可以使您免于加载库,直到您使用它们.例如:
(if (locate-library "ediff-trees") (autoload 'ediff-trees "ediff-trees" "Start an tree ediff" t))
编译你的.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)
学会爱上emacs服务器.
将emacs作为服务器运行意味着永远不必关闭它.但是我注意到你仍在使用emacs22.emacs23支持multi-tty,这使得在一个屏幕会话中运行emacs,然后在另一个终端中启动新窗口变得更加容易.我使用emacs编辑邮件客户端(mutt)的邮件,而emacsclient对于这些快速编辑非常棒.
之一
M-x shell M-x eshell M-x term M-x ansi-term
应该满足您在Emacs内的命令行需求.
您也可以使用M-!
(aka M-x shell-command
)执行单行程序而不必删除shell.
检查您的.emacs
文件,看看您是否正在加载不必要的包.加载包可能会花费大量时间.例如,php-mode
如果您正在编辑PHP文件,则可能只想加载包.你可以通过安装一个钩子程序来做到这一点,虽然我不确定细节.
还要确保您正在加载的任何包都已编译(.elc
文件).您可以elisp
通过运行来编译文件
emacs -batch -f batch-byte-compile thefile.el
编译包的加载速度比未编译的包快得多.
"我倾向于打开和关闭emacs,因为我更习惯使用bash命令行进行文件/目录操作和编译."
你正在描述像vim这样的编辑器的使用方式.拍摄进出.Emacs通常是开放的,大多数都是从"内部"完成的.希恩已经回答了这里正确的做法.
最快的方法是分析您的.emacs.在我发现我的.emacs中的4条特定线占用了超过80%的加载时间后,我在5分钟内将加载时间从> 3s减少到1s.
.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") ))
当然,对于某些软件包,会有一个可用的钩子,你可以做同样的事情,但有时候没有,或者这种方式证明更容易思考.
Emacs旨在"始终"(或至少长时间)运行,因此不建议在一天内多次启动和停止Emacs.
我建议使用屏幕.屏幕是终端多路复用器,在一个终端中为您提供无限的虚拟终端.
安装完成后,只需在终端中输入"screen emacs"即可.Emacs将照常启动,但按"ca c"(即按ctrl-a然后按c)将打开一个新的虚拟终端.你可以按"ca ca"(这是ctrl-a的两次)回到emacs.
您甚至可以从正在运行的屏幕会话中分离,键序列为"ca d".
通过发出"screen -R"重新附加到会话,您将返回到您离开的位置.这使您可以在工作中启动emacs会话,分离,回家以及从家中重新连接.
我连续几个月一直在运行这样的Emacs.
这是官方网站:http://www.gnu.org/software/screen/但是尝试谷歌搜索屏幕教程和howtos
您可以使用benchmark-init来配置您的Emacs启动.它将跟踪正在加载的模块以及每个模块花费的时间.结果可以以表格形式或树形式呈现.树可以更容易地跟踪谁加载了什么,这在加载具有大量依赖关系的包时会很有帮助,并且列表形式可以帮助您快速找到大部分时间花在哪里.
获得这些结果后,尝试确定是否必须一直加载所有模块,或者是否可以按需加载其中一些模块.例如,在我的配置中,我只加载特定于某些模式的Emacs扩展,当该模式实际被激活时,因为大多数时候我只在会话中使用它们的一小部分. eval-after-load和mode hooks将成为你的朋友.
通过应用此方法,我的Emacs在3-4秒内启动,并且我安装了近200个扩展.大部分时间用于加载Helm,我总是加载它,因为它取代了始终需要的find-file和其他核心功能,以及CEDET,因为我使用最新版本并且必须在Emacs尝试加载旧版本之前加载它内置版本.