对Emacs进行Protable Dump的ELisp脚本

终于有点时间打算试试 pdump:因为感觉罗列使用的包再 require 十分不优雅、所以就匹配 use-package 然后再 require 它们。

;;; init.el -*- lexical-binding: t -*-

;; This file dumps the current installation.
;; Copyright (C) 2025 RadioNoiseE

(package-initialize)

(defconst dumped-load-path load-path)
(defconst dumped-load-mask '(gptel))

(dolist (site '("early-init.el" "init.el"))
  (with-temp-buffer
    (insert-file-contents (concat user-emacs-directory site))
    (goto-char (point-min))
    (condition-case error
        (while-let ((form (read (current-buffer))))
          (pcase form
            (`(use-package ,package . ,rest)
             (unless (memq package dumped-load-mask)
               (message "(require %s%s)" "\N{APOSTROPHE}" package)
               (require package nil t)))
            (_ (eval form))))
      (end-of-file nil))))

(defun dumped-init ()
  (global-font-lock-mode t)
  (transient-mark-mode t))

(add-hook 'emacs-startup-hook 'dumped-init)

(dump-emacs-portable "Emacs.pdmp")

不直接eval是因为不希望受 :defer:hook 等keyword的影响。而且某些 :init:config 这些可能会出现奇怪的问题(overlay not supported 这些)。

应该只适用于使用没有嵌套的 use-package 管理配置的人。

我目前感觉到的 pdump 的优点:

  1. 启动快、现在 (emacs-init-time) 稳定 0.15s 以下
  2. 反应快、第一次进入某些 mode 不会卡那么微妙的一下

感觉 pdump 还是挺有应用潜力的(我同时使用 igc branch、但因为不想装 gcc 没试过 native-comp)。

这里也有:GNU Emacs Configuration

3 个赞