学会了让mac上的Emacs快上0.3秒

今天用 benchmark-init 检查了一下自己的各个配置文件所花的时间,发现 init-gui.el 这个文件居然加载了300+毫秒,通过二分注释法,发现了罪魁祸首是这六行代码!!

;; cost almost 300ms
(if (fboundp 'tool-bar-mode)
    (tool-bar-mode -1))

(if (fboundp 'set-scroll-bar-mode)
    (set-scroll-bar-mode nil))

(if (fboundp 'menu-bar-mode)
    (menu-bar-mode -1))

google了一下,发现了一个 github issue,给了一个解决办法

defaults write org.gnu.Emacs Emacs.ToolBar -string no
defaults write org.gnu.Emacs Emacs.ScrollBar -string no
defaults write org.gnu.Emacs Emacs.MenuBar -string no

我用的是Emacs mac port,300+毫秒的 init-gui.el 文件,现在只需要50+毫秒了,美滋滋~

另外想问下两个问题:

  1. 上面的解决办法没法 disable scrool bar
  2. 有一个加载 js2-mode 的文件,也花了好多时间加载,我想实现:只有我打开以.js为后缀的文件,emacs才会为我加载init-js2-mode.el文件。

大家也可以分享点让Emacs变快的方法啊~

一直在各种抄配置,load, eval-after-load, require, autoload, 还有各种hook, idle-require等等绕的有点糊涂哈哈哈,希望能分享些相关的技术博客,GNU的文档看的有点吃力。

先行谢过啦~

1 个赞

看一下doom配置,基本就是延迟加载,别整没用的功能,还有美丽是有代价的

1 个赞

use-package

defer t:

The use of :hook, as with :bind, :mode, :interpreter, etc., causes the functions being hooked to implicitly be read as :commands (meaning they will establish interactive autoload definitions for that module, if not already defined as functions), and so :defer t is also implied by :hook.

or

:defer N for packages like company.

  1. 的话,推荐用use-package,用:mode:hook关键字都可以。
1 个赞

Linux 上的

(menu-bar-mode -1)
(tool-bar-mode -1)
(scroll-bar-mode -1)

好像也占用了 0.2s 左右的时间,不负责任的猜测两句,它是先将 menu-bar, tool-bar, scroll-bar 三者加载起来再关闭所以比较慢,如果 Emacs 用的是 master 的编译版本也就是版本号是 27.0 以上的,支持一个叫作 early-init.el 的配置文件,这个文件会在你加载图像元素以及包管理之前加载,可以将这三行配置放到这个文件里面以解决这三行配置占用太多时间的问题。

至于 early-init.el 文件的话,自己创建一下扔到 .emacs.d 目录下就可以了

附上 emacs 自带的文档

The file is called 'early-init.el', in 'user-emacs-directory'.  It is
loaded very early in the startup process: before graphical elements
such as the tool bar are initialized, and before the package manager
is initialized.  The primary purpose is to allow customizing how the
package system is initialized given that initialization now happens
before loading the regular init file (see below).

We recommend against putting any customizations in this file that
don't need to be set up before initializing installed add-on packages,
because the early init file is read too early into the startup
process, and some important parts of the Emacs session, such as
window-system and other GUI features, are not yet set up, which could
make some customization fail to work.

至于其他的优化手段,其实最简单粗暴的就是是用包管理(现在大家应该都是包管理了吧),对启动速度的提升还是蛮大的。

配置文件的优化不外乎延迟加载,比较简单的实现方式之一就是上面所说的 use-package, 论坛里有人进行了翻译,我贴下地址

3 个赞

linux 下面类似的配置叫XResources, 一般这个放在~/.Xresources,在里面可以加上 emacs.menuBar: off 这样关闭menubar, 这个也是在load gui 之前。emacs manual里面有所有可以识别的xresource的列表。

1 个赞

其实可以把这段代码加入到 after-init-hook 里, 只不过启动时会先显示menu-bartool-bar等, 我觉得不太好看, 所以放弃这零点几秒的启动速度了

这么说吧,如果把启动计时去掉,快的不止这零点几秒。

不是不关机吗

为什么?启动计时几乎不占时间吧?