代码之家  ›  专栏  ›  技术社区  ›  Paul

如何使Emacs启动更快?

  •  67
  • Paul  · 技术社区  · 15 年前

    我用 Emacs v.22(控制台版本,远程 PuTTY 或本地 Konsole )作为我在Linux上的主要文本编辑器。不过,每次启动它都需要一段时间才能加载,可能快一秒钟了,尽管我从未计时过。我经常打开和关闭emacs,因为使用 Bash 用于文件/目录操作和编译的命令行。

    如何加快启动时间?

    17 回复  |  直到 7 年前
        1
  •  37
  •   Community T.Woody    7 年前

    除了 Adam Rosenfield's solution ,我建议使用 Emacs in server mode . 您可以添加 (server-start) 去你的网站,然后跑 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'"))'
    
        2
  •  58
  •   rgtk    9 年前

    其他人已经涵盖了使用 gnuserve emacsclient 我建议在Emacs中编译(能够跳到编译错误是一种胜利)。

    但是,具体来说,加速.emacs可以通过以下方式完成:

    1. 编译.emacs文件的字节,您可以使用 this snippet of code

    2. 替换尽可能多的 (require 'package) 语句与 autoload ED功能。这将延迟Lisp的加载,直到实际需要它为止。使用这项技术,我可以将启动速度从6秒提高到1秒。这需要一些工作,因为并非所有的库都有正确的标记 autoload .

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

    4. 尝试使用选项运行Emacs --no-site-file 避免在现场安装中加载不必要的包 site-start.el .

    5. 如果你真的是认真的,你可以在已经加载了你最喜欢的功能的情况下滚动你自己的emacs。当然,这意味着对你所拥有的 .emacs 因为它是二进制的一部分。按照链接了解如何使用 dump-emacs .

    6. 购买更快的计算机和/或更快的磁盘。

    如何确定.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,可能 *消息* 缓冲区将丢失一些消息,因为它只保留固定数量的信息。您可以尽早将此设置添加到 Emacs 要保留所有信息:

    (setq message-log-max t)
    

    注: 'load 如果命令的第四个参数是 nomessage 非零,因此删除任何此类调用(或 负荷 迫使第四个论点 nil )

        3
  •  27
  •   Peter Mortensen code4jhon    14 年前

    不要每次使用shell时都关闭emacs。使用ctrl-z将emacs移动到背景和 fg bash中的命令将其移回前台。

        4
  •  21
  •   Arne    7 年前

    一些提示:

    1. 使用AutoLoad

      使用“自动加载”可以避免加载库,直到使用库为止。 例如:

      (if (locate-library "ediff-trees")
          (autoload 'ediff-trees "ediff-trees" "Start an tree ediff" t))
      
    2. 编译.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)
      
    3. 学会爱上Emacs服务器。

      将emacs作为服务器运行意味着不必关闭它。然而 我注意到你还在使用emacs22。Emacs23支持多tty,这使得 在一个屏幕会话中运行Emacs,然后启动 其他终端中的新窗口。我使用emacs编辑邮件 客户机(mutt)和emacsclient对于这些快速编辑非常有用。

        5
  •  19
  •   Charles Duffy    15 年前

    什么之中的一个

    M-x shell
    M-x eshell
    M-x term
    M-x ansi-term
    

    应该满足Emacs中的命令行需求。

    您也可以使用 M-! (阿卡 M-x shell-command )在不掉到壳上的情况下执行一个一行程序。

        6
  •  14
  •   Adam Rosenfield    15 年前

    检查你的 .emacs 文件以查看是否正在加载不必要的包。加载包可能需要大量时间。例如,您可能只想加载 php-mode 如果正在编辑PHP文件,则打包。你可以通过安装一个钩子程序来做到这一点,尽管我不确定细节。

    还要确保正在加载的所有包都已编译( .elc 文件)。您可以编译 elisp 通过运行文件

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

    编译包的加载速度比未编译包快得多。

        7
  •  13
  •   Rook    15 年前

    “我经常打开和关闭emacs,因为使用bash命令行进行文件/目录操作和编译更为方便。”

    你在描述像Vim这样的编辑器的使用方式。射入和射出。Emacs通常是开放的,大部分都是从“内部”完成的。希纳已经回答了正确的方法。

        8
  •  11
  •   Vicky Chijwani    13 年前

    最快的方法是 profile your .emacs . 在发现.emacs中的4条特定行占用了超过80%的加载时间后,我在5分钟内将加载时间从>3缩短为1。

        9
  •  9
  •   Jacob Gabrielson    15 年前

    有一件事帮助我减少了 .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 你可以做同样的事情,但有时没有,或者这种方式只是证明更容易思考。

        10
  •  8
  •   slu    15 年前

    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/ 但是尝试谷歌搜索屏幕教程和如何操作

        11
  •  5
  •   David Holm    10 年前

    你可以使用 benchmark-init 介绍Emacs的启动情况。它将跟踪正在加载的模块以及每个模块所花费的时间。结果可以表格形式或树形式呈现。树可以更容易地跟踪谁加载了什么,当您加载一个有很多依赖关系的包时,这是很有帮助的,表格形式可以帮助您快速找到大部分时间都花在哪里。

    一旦你得到了这些结果,试着弄清楚是否所有的模块都必须一直加载,或者你是否可以按需加载其中的一些模块。例如,在我的配置中,我只加载特定于特定模式的Emacs扩展,而该模式实际上是激活的,因为大多数时候我只在会话中使用其中的一小部分。 eval-after-load 模式挂钩将是你的朋友。

    通过应用这个方法 我的Emacs在3-4秒内启动 我有 接近200个扩展 安装。大部分时间都花在加载helm上,我总是加载helm,因为它替换了查找文件和其他总是需要的核心函数,以及cedet,因为我使用的是最新的版本,而且它必须在Emacs尝试加载旧的内置版本之前加载。

        12
  •  4
  •   Jouni K. Seppänen    15 年前

    其他人没有提到的一件事是将您使用的elisp库作为 dumped Emacs 将库加载时间从Emacs启动移动到Emacs生成。它不适合胆小的人,但如果你在 .emacs 它可以为你赢得几秒钟的启动时间。

        13
  •  3
  •   clawr    15 年前

    这不回答问题,但有点相关

    我不知道如何让它启动得更快,但我可以建议以下几点:

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

      • 编译:m-x compile,然后键入您使用的命令
      • 我的经验只是用C++,但是用g++,你可以按C-X’跳转到编译器抱怨的行。
      • 运行shell命令:m-!,将输出转储到缓冲区
      • 交互式外壳:M-X外壳
    • 或者,您可以这样运行emacs:

      • emacs file.ext &
      • 它在背景中打开emacs,这样您仍然可以使用shell(这对putty和x转发(比如xming)最有效)
        14
  •  3
  •   DmitrySemenov    8 年前

    我有大约120秒的开始时间。我找到了安装这个的修复程序:

    https://github.com/dholm/benchmark-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基准初始化/显示持续时间树

    在我这方面,问题是不定期装载127秒

    我通过添加

    127.0.0.1  host.does.not.exist
    

    /ETC/主机 这让我的创业很快

    在这里看到更多: https://github.com/emacs-helm/helm/issues/1045

    另一件可能对你有帮助的事情: https://www.emacswiki.org/emacs/ProfileDotEmacs

        15
  •  2
  •   tsar2512    10 年前

    当我在这里遇到这个问题时,我正试图解决同样的问题。我只是想补充一点,我的问题不是因为EmacsLisp包的加载时间,而是因为主机没有完全解析的主机名。

    要检查您的包加载时间,请执行

    M-x emacs-init-time
    

    对我来说是0.3秒,但是加载时间非常长。 在正确更改了主机名之后,它修复了问题。

    要将完全解析的主机名编辑/etc/hostname和/etc/hotsfile配置为:

    127.0.0.1       localhost localhost.localdomain
    192.168.0.2   hostname hostname.domain
    
        16
  •  2
  •   John Wiegley    9 年前

    尝试使用 https://github.com/jwiegley/use-package 用于定义包加载和自定义的宏。它为您处理包的延迟加载,这样即使在有大量已配置的包的情况下,也相对容易获得良好的启动时间。我的.emacs中引用了将近100个包,但是我的启动时间在Linux上不到2秒,在Mac上不到2.2秒。

        17
  •  1
  •   BubbaT    15 年前

    我必须检查我的定制,但是有一个叫做gnuserve或emacsclient的包。它会迁移很多,所以你必须在谷歌上搜索。

    它在后台运行一个Emacs会话。任何进一步的Emacs会话本质上都只是该会话的新框架。一个副标题是为您以后的会话快速启动时间。