[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[FR] Provide a way to activate packages automatically for side effect
From: |
Ihor Radchenko |
Subject: |
[FR] Provide a way to activate packages automatically for side effect |
Date: |
Wed, 01 May 2024 10:20:09 +0000 |
Hello,
The very first suggestion in D.1 Emacs Lisp Coding Conventions is to
avoid side effects when loading a library:
• Simply loading a package should not change Emacs's editing
behavior. Include a command or commands to enable and disable the
feature, or to invoke it.
The request not to change editing experience is reasonable, but it is
sometimes hard to draw a line when side effects of the loading should be
separated into an explicit command/function users have to run/add to the
config.
For example, when a package defines a new major mode, it is common to
modify `auto-mode-alist' by merely having such package installed.
This is technically a change in Emacs's editing behavior.
Another example is when a package adds new features to an existing
functionality, like ert.el where mere (require 'ert) changes
fontification in emacs-lisp-mode buffers:
(add-hook 'emacs-lisp-mode-hook #'ert--activate-font-lock-keywords)
If one follows "Lisp Coding Conventions" explicitly, the above examples
can be seen as breaking the conventions.
On the other hand, it is very clear that autoloading a major mode is
justified because otherwise why would user install the relevant package?
Similar argument can be made for changing the fontification rules in
ert.el - if ert library is loaded _by the user_, it is very clear that
the erc.el features, including fontification, are going to be useful.
The situation is not so clear when a library is autoloaded by the means
of building completion list (`help-enable-completion-autoload') - side
effects in such case may be surprising to the user who merely wanted to
read some obscure docstring.
May it be possible to introduce an alternative way to load
packages/libraries other than `require' with an intention to be used as
a part of user config?
What I have in mind is something like
(enable-package 'name) that will (1) load the package without side
effects; (2) "enable" the package, producing useful side effects
intended for interactive use.
Further, (use-package name) can be modified to automatically run
(enable-package 'name); and package.el can be modified to mark packages
installed explicitly (via M-x package-install or other interactive
means) to be automatically "enabled" after loading (add (eval-after-load
'name (enable-package 'name).
--
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>
- [FR] Provide a way to activate packages automatically for side effect,
Ihor Radchenko <=