Subject: bug#20766: 24.5; disable-theme leaves lingering effects

From: Mauro Aranda <[email-masked]>
Date: Fri, 6 Nov 2020 09:26:36 -0300

Anders Papitto <[email-masked]> writes:

> When I run these commands from a fresh Emacs instance
>
> M-x load-theme RET solarized-light RET
> M-x disable-theme RET solarized-light RET
> M-x term RET RET
>
> the text background color in term-mode stays what it was set to by the
> solarized-light theme. A very similar invocation does not have this
> behavior:
>
> M-x term RET RET
> C-c k RET yes RET
> M-x load-theme RET solarized-light RET
> M-x disable-theme RET solarized-light RET
> M-x term RET RET
>
> i.e. If term mode gets to run before loading the theme, no bug.
>

This bug is still present.

It looks like solarized still sets the obsoleted variables
term-default-fg-color and term-default-bg-color, but still, the bug is
in custom.el and it's related to Bug#21355.

Here's a recipe:
Save this theme into test-bug20766-theme.el, and arrange to load it.
(deftheme test-bug20766)

(custom-theme-set-variables
 'test-bug20766
 '(test-option 'foo))

(provide-theme 'test-bug20766)

emacs -Q

M-x load-theme RET test-bug20766
test-option is not yet known, so custom stores the theme setting under
the saved-value property of test-option.

M-x disable-theme RET test-bug20766
The saved-value property should be nil, because the theme setting is no
longer relevant.  However, it's still ('foo).

Then eval the following defcustom:
(defcustom test-option 'bar "..."
:type 'symbol
:group 'emacs)

M-: test-option ==> foo, which is wrong.

In the original recipe, that is how term-default-fg-color and
term-default-bg-color get the solarized theme setting after loading
term.