簡體   English   中英

如何讓 Emacs 啟動更快?

[英]How can I make Emacs start-up faster?

我在 Linux 上使用Emacs v. 22(控制台版本,遠程使用PuTTY或本地使用Konsole )作為我的主要文本編輯器。 每次啟動它都需要一段時間來加載,可能幾乎一秒鍾,盡管我從來沒有計時過。 我傾向於經常打開和關閉 Emacs,因為我更習慣使用Bash命令行進行文件/目錄操作和編譯。

如何加快啟動時間?

其他人已經涵蓋了使用gnuserveemacsclient ,我建議在 emacs 中編譯(能夠跳轉到編譯錯誤是一種勝利)。

但是,可以通過以下方式特別加快 .emacs 的速度:

  1. 字節編譯 .emacs 文件,您可以使用這段代碼自動完成

  2. 自動加載功能替換盡可能多的(require 'package)語句。 這將延遲 lisp 的加載,直到真正需要它為止。 使用這種技術,我可以將啟動速度從 >6 秒加速到 <1 秒。 這需要一些工作,因為並非所有庫都正確標記為autoload

  3. 刪除不再使用的代碼/功能。

  4. 嘗試使用選項--no-site-file運行 emacs 以避免在站點安裝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 load is ...done 所有其他文件都是從我的.emacs.tjackson.el文件中加載的。 所有其他負載都是原子的。

注意:如果您有一個很大的 .emacs, *Messages*緩沖區可能會丟失一些消息,因為它只保留了固定數量的信息。 您可以盡早將此設置添加到.emacs以保留所有消息:

(setq message-log-max t)

注意:如果'load命令的第四個參數nomessage則它會抑制消息,因此刪除任何此類調用(或者,建議'load並強制第四個參數為nil )。

除了Adam Rosenfield 的解決方案,我建議在服務器模式下使用Emacs 您可以將(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

在 v24+ 中,您可以執行emacsclient -c來創建新框架。

不要在每次要使用 shell 時都關閉 Emacs。 使用 Ctrl-Z 將 Emacs 移至后台,使用 Bash 中的fg命令將其移回前台。

一些提示:

  1. 使用自動加載

    使用自動加載可以避免加載庫,直到您使用它們。 例如:

     (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 非常適合此類快速編輯。

之一

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

應該在 Emacs 中滿足您的命令行需求。

您也可以使用M-! (又名Mx shell-command )執行單行而不落到 shell。

檢查您的.emacs文件,看看您是否正在加載不必要的包。 加載包可能需要大量時間。 例如,如果您正在編輯 PHP 文件,您可能只想加載php-mode包。 你可以通過安裝一個鈎子程序來做到這一點,盡管我不確定細節。

還要確保您加載的任何包都已編譯( .elc文件)。 你可以通過運行編譯一個elisp文件

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

編譯包的加載速度比未編譯包快得多。

“我傾向於經常打開和關閉 emacs,因為我更習慣使用 bash 命令行進行文件/目錄操作和編譯。”

您正在描述像 vim 這樣的編輯器的使用方式。 射進射出。 Emacs 通常保持打開狀態,並且大部分都是從“內部”完成的。 hiena 已經在這里回答了正確的方法是什么。

最快的方法是配置您的 .emacs 在我發現 .emacs 中的 4 條特定行占用了超過 80% 的加載時間后,我在 5 分鍾內將加載時間從 > 3 秒縮短到 1 秒。

除了autoload (正如其他人所建議的)之外,幫助我減少.emacs加載時間的一件事是eval-after-load 在以下示例中,延遲對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 被設計為“一直”運行(或至少長時間運行),因此不建議在一天內多次啟動和停止 Emacs。

我建議使用屏幕。 Screen 是一個終端多路復用器,在一個終端中為您提供無限的虛擬終端。

安裝后,只需在終端中寫入“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/但嘗試谷歌搜索屏幕教程和操作指南

您可以使用benchmark-init來分析您的 Emacs 啟動。 它將跟蹤正在加載哪些模塊以及在每個模塊上花費了多少時間。 結果可以以表格或樹的形式呈現。 該樹可以更輕松地跟蹤誰加載了什么,這在您加載具有大量依賴項的包時會很有幫助,並且表格形式可以幫助您快速找到大部分時間都花在了哪里。

獲得這些結果后,請嘗試確定是否必須始終加載所有模塊,或者是否可以按需加載其中一些模塊。 例如,在我的配置中,我只加載特定於某些模式的 Emacs 擴展,當該模式實際激活時,因為大多數時候我只在會話中使用它們的一小部分。 eval-after-load和 mode hooks 將成為你的朋友。

通過應用這種方法,我的 Emacs 可以在 3-4 秒內啟動,並且我已經安裝了近 200 個擴展 大部分時間都花在加載 Helm 上,我總是加載 Helm,因為它替換了始終需要的 find-file 和其他核心功能,以及 CEDET,因為我使用的是最新版本,並且必須在 Emacs 嘗試加載舊版本之前加載它內置版本。

嘗試使用https://github.com/jwiegley/use-package宏來定義您的包加載和自定義。 它為您處理包的延遲加載,即使在存在大量配置包的情況下,也可以相對容易地獲得良好的啟動時間。 我的 .emacs 中引用了近 100 個包,但我的啟動時間在 Linux 上不到 2 秒,在 Mac 上不到 2.2 秒。

我有大約 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 啟動,運行:

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

其他人沒有提到的一件事是包含您用作轉儲 Emacs 的一部分的 elisp 庫,以將庫加載時間從 Emacs 啟動轉移到 Emacs 構建。 它不適合膽小的人,但如果您在.emacs加載多個庫,它可以為您贏得幾秒鍾的啟動時間。

這不能回答問題,但有點相關

我不知道如何讓它啟動得更快,但我可以建議一些事情:

  • 對於你在命令行上做的大多數事情,你可以在 emacs 中做:

    • compile:mx compile,然后輸入你使用的命令
    • 我的經驗僅適用於 C++,但使用 g++ 你可以按 Cx ` 跳轉到編譯器抱怨的行
    • 運行 shell 命令:M-!,將輸出轉儲到緩沖區
    • 交互式外殼:Mx 外殼
  • 或者,您可以像這樣運行 emacs:

    • emacs file.ext &
    • 它在后台打開 emacs,因此您仍然可以使用外殼(這最適用於膩子和 X 轉發,例如 Xming)

當我在這里遇到這個問題時,我正試圖解決同樣的問題。 我只是想補充一點,我的問題不是因為 emacs lisp 包的加載時間,而是主機沒有完全解析的主機名這一事實

要檢查您的包加載時間,請執行以下操作

M-x emacs-init-time

對我來說是 0.3 秒,但加載時間非常長。 正確更改我的主機名后,它解決了問題。

要配置完全解析的主機名,請使用以下命令編輯 /etc/hostname 和 /etc/hostsfile:

127.0.0.1       localhost localhost.localdomain
192.168.0.2   hostname hostname.domain

我必須檢查我的自定義,但有一個名為 gnuserve 或 emacsclient 的包。 它遷移了很多,所以你必須谷歌搜索它。

它在后台運行一個 emacs 會話。 任何進一步的 emacs 會話本質上只是該會話的新框架。 一個優勢是為您以后的會話快速啟動。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM