[英]How can I make Emacs start-up faster?
其他人已經涵蓋了使用gnuserve
和emacsclient
,我建議在 emacs 中編譯(能夠跳轉到編譯錯誤是一種勝利)。
但是,可以通過以下方式特別加快 .emacs 的速度:
字節編譯 .emacs 文件,您可以使用這段代碼自動完成
用自動加載功能替換盡可能多的(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
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
命令將其移回前台。
一些提示:
使用自動加載
使用自動加載可以避免加載庫,直到您使用它們。 例如:
(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 支持多 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 中做:
或者,您可以像這樣運行 emacs:
emacs file.ext &
當我在這里遇到這個問題時,我正試圖解決同樣的問題。 我只是想補充一點,我的問題不是因為 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.