所以custom-file到底该什么时候加载?

我又双叒叕来问强迫症问题了……

定义custom-file肯定放在所有东西之前 那么custom-file到底该放到什么时间加载?

是该放到所有文件加载之后,还是放到基础配置(elpa啊,gui啊等等)之后,还是直接定义完就加载?

第一种

(setq custom-file (expand-file-name "mxcu.el" user-emacs-directory))
(require 'init-elpa)
(require 'init-utils)
(require 'init-gui)

;;其他配置

(when (file-exists-p custom-file)
  (load custom-file))

(provide 'init)

;; end of file

第二种

(setq custom-file (expand-file-name "mxcu.el" user-emacs-directory))

;; 其他配置

(require 'init-elpa)
(require 'init-utils)
(require 'init-gui)

(when (file-exists-p custom-file)
  (load custom-file))

;; 其他配置

(provide 'init)

;; end of file

第三种

(setq custom-file (expand-file-name "mxcu.el" user-emacs-directory))
(when (file-exists-p custom-file)
  (load custom-file))

;; 其他配置

(require 'init-elpa)
(require 'init-utils)
(require 'init-gui)

;; 其他配置

(provide 'init)
;;end of file

第一种。

参照各种配置。

我发现你回答问题是最快的%……

然后……放最后有什么好? 尽量避免出错?

在用户不知道你做了什么配置的时候,他们自定义的配置能正确覆盖你的配置。不然就有一堆人问:

为什么我的 custom 配置不会生效?

你需要考虑到你的用户可能对 Emacs 没有任何了解,看了不知道哪里来的教程就做各种实验,然后觉得不对就找你是问了。

2 个赞

你说的有道理……

另外还有个问题,如果我放的太前面的话,那么一旦有人在customize里配错了东西,这个错误的配置就会立刻报错,导致没办法往下加载(可恶的从上往下执行…… )…… 不过实际上,“用户”……就我一个 顺便再问你个事情,我应该完全依赖custom-file和M-x customize,还是应该给手写的custom留个余地?

熟练的用户都是手写 自定义部分的 。配置界面主要用来参考 要怎么写。

感觉应该是

  • (setq custom-file ...) 放到最前面,因为 package-install 之类的可能会用到它;
  • (load custom-file ...) 放到最后面,因为它里面的内容有可能会依赖前面的设置。

我的目前大概像这样:

;;; init.el --- 我的 Emacs 配置 -*- lexical-binding: t; -*-

;;; Code:

(package-initialize)
(setq custom-file (locate-user-emacs-file "custom.el"))


(use-package magit)
(use-package org)


(load custom-file :no-error :no-message)

;;; init.el ends here

不过即使你不是这么写的,也没关系,你完全可以等到遇到问题时再做相应的调整。

我个人的总结和你一样…… set应该在所有文件之前(但是没必要在第一行,尤其是你有设置版本判断和垃圾回收阈值的状况),这样可以让需要写custom-file的package写到正确的地方。 但是load应该在所有文件之后,以避免依赖问题和因为custom-file导致的加载中断。