bug#81499: 30.2; Truncation of custom settings when custom-safe-themes changes

Sean Whitton <[email protected]> Wed, 05 Aug 2026 15:04:34 +0100
Newsgroups gmane.emacs.bugs
Message-ID <[email protected]>
Brad Howes [03/Aug 10:30am +02] wrote:
>> On Jul 31, 2026, at 12:23 PM, Sean Whitton <[email protected]> wrote:
>>
>> [ please reply-all so your message reaches the bug tracker ]
>>
>> Brad Howes [30/Jul  3:12pm +02] wrote:
>>> Correct. However, as reported I have `custom-file` set and I have only
>>> noticed the changes there. Unclear if same behavior exits when
>>> `custom-file` is not set.
>>
>> Thanks for confirming that.  It looks like we have a straightforward bug
>> in the code for modifying/writing custom files.
>
> Sean,
>
> I did some additional investigation into this bug. I created a minimal reproducible case as follows:
>
> Create an empty directory to serve as Emacs init directory — `mkdir ~/emacs.d.bug`
> Create `elpa` subdirectory — `mkdir ~/emacs.d.bug/elpa`
> Add `modus-themes-5.3.0` to `~/emacs.d.bug/elpa/` — `cp -r ~/.emacs.d/elpa/modus-themes-5.3.0 ~/emacs.d.bug/elpa/`
> Create an `init.el` file in `~/emacs.d.bug` with the following contents:
>
> ```
> (setq custom-file (file-truename (locate-user-emacs-file "custom.el"))
>       use-hook nil)
> (message "custom-file: %s" custom-file)
>
> (if use-hook
>     (add-hook 'after-init-hook
>               (lambda ()
>              (when (file-exists-p custom-file)
>                (message "after-init-hook loading custom-file '%s'" custom-file)
>                (load custom-file 'noerror))))
>   (message "init.el loading custom-file '%s'" custom-file)
>   (load custom-file 'noerror))
> ```
>
> Create a `custom.el` file in `~/emacs.d.bug/` with the following contents:
>
> ```
> (custom-set-variables
>  ;; custom-set-variables was added by Custom.
>  ;; If you edit it by hand, you could mess it up, so be careful.
>  ;; Your init file should contain only one such instance.
>  ;; If there is more than one, they won't work right.
>  '(custom-enabled-themes '(modus-vivendi))
>  '(custom-safe-themes
>    '(default))
>  '(dired-dwim-target t)
>  '(dired-isearch-filenames t))
>
> (custom-set-faces
>  ;; custom-set-faces was added by Custom.
>  ;; If you edit it by hand, you could mess it up, so be careful.
>  ;; Your init file should contain only one such instance.
>  ;; If there is more than one, they won't work right.
>  '(show-paren-match ((t (:background "#0d0d0d" :foreground "spring green" :underline nil :weight ultra-bold)))))
> ```
>
> Start Emacs with the option `—init-directory ~/emacs.d.bug`
> Emacs frame should appear with `Loading a theme can run Lisp code. Really load? (y or n)`
> Answer with `y`
> A new prompt should appear with `Treat this theme as safe in future sessions? (y or n)`
> Answer with `y`
>
> At this point, if `use-hook` is set to `t` in the `init.el` file, the `custom.el` file is truncated after the `custom-safe-themes` setting and the `custom-set-faces` will be empty.
> If the `use-hook` variable is set to `nil`, no truncation takes place in the `custom.el` file and the `custom-safe-themes` value contains the hash of the theme.
>
> So, it appears that changing performing the `load-file` from the `after-init-hook` is the source of the corruption.

Thanks.  Have you observed a case where only part of the
custom-set-variables is deleted?  If not, then it seems like the problem
is that Emacs is choosing to saving custom-file while the set of custom
faces is empty, so it doesn't include those in the file.

-- 
Sean Whitton