我使用Emacs v.22(控制台版本,远程使用PuTTY或本地使用Konsole)作为Linux上的主要文本编辑器。虽然每次启动它都需要一段时间来加载,可能差不多一秒钟,尽管我从来没有计时。我倾向于打开和关闭Emacs,因为我更习惯使用Bash命令行进行文件/目录操作和编译。
如何加快启动时间?
答案 0 :(得分:58)
其他人已经介绍过使用gnuserve
和emacsclient
,我建议在emacs中进行编译(能够跳转到编译错误是一种胜利)。
但是,特别是加速.emacs可以通过以下方式完成:
编辑.emacs文件的字节,您可以使用this snippet of code自动执行
使用autoload ed功能替换尽可能多的(require 'package)
语句。这将延迟加载lisp直到它实际需要。使用这种技术,我可以将启动时间从> 6秒加速到<1。这需要一些工作,因为并非所有库都标记为autoload
。
删除不再使用的代码/功能。
尝试使用选项--no-site-file
运行emacs,以避免在网站安装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
加载为{{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)
一些提示:
使用自动加载
使用自动加载功能可以使您免于加载库,直到您使用它们为止。 例如:
(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非常适合这些快速编辑。
答案 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中执行这些操作:
或者,你可以像这样运行emacs:
emacs file.ext &
答案 15 :(得分:2)
检查包裹加载时间吗
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的任何进一步会话基本上只是该会话的新帧。一个优点是您以后的会话的快速启动时间。