Thanks for reviewing this.
On Tue, Jul 11, 2017 at 12:38 PM Eli Zaretskii <address@hidden
> From: Kaushal Modi <address@hidden>
> Date: Mon, 10 Jul 2017 11:55:58 +0000
> I recently stumbled across this Reddit post where a user is trying to enable a minor mode in .dir-locals.el.
> But he was doing that by setting the mode name to `t'.
indent-tabs-mode is the mode variable, so setting it to t is not a
The mistake (as explained in the Reddit post) was setting a 'custom-mode' to t and expecting that that would rightaway enable that 'custom-mode' minor mode. The OP on that Reddit thread later confirms that doing (mode . custom) worked easily, while trying to do (custom-mode . t) needed him to mark that var as safe.
> We generally(?) enable minor modes by doing (mode . MINOR) in .dir-locals.el.
You could do it either way. Also, some modes don't have such a
variable, so only the latter way will work.
Almost all the user minor modes are created using define-minor-mode. At least I have not to come across one where that's not the case in the user land.
But why do you think we should only advertise one method, but not the
From (emacs) Minor Modes
Most minor modes also have a "mode variable", with the same name as
the mode command. Its value is non-‘nil’ if the mode is enabled, and
‘nil’ if it is disabled. In general, you should not try to enable or
disable the mode by changing the value of the mode variable directly in
Lisp; you should run the mode command instead.
(Reading further: Does below apply to setting minor mode variables via .dir-locals.el?)
However, setting the
mode variable through the Customize interface (*note Easy
Customization::) will always properly enable or disable the mode, since
Customize automatically runs the mode command for you.
In any case, as a user, I find it clearer to understand that you must never enable minor modes by just setting their var; you should call that minor mode fn instead. That realization also lead me to summarize minor mode enabling conventions here few years ago.
Also, if a user uses the (mode . minor) convention instead of (minor-mode . t), they do not have to worry about declaring them safe.
There's no magic here, just legitimate use of public
documented variables: 'mode' is a variable and so is 'indent-tabs-mode'.
So I think I don't get your motivation for the report and for the
patch you provided.
It just sets a convention that does not cause confusion (or create hurdle like marking vars safe).
- If you want to set a plain var: do (var . value)
- If you want to enable a minor-mode: do (mode . minor)