aboutsummaryrefslogtreecommitdiffstats
path: root/doc/misc
diff options
context:
space:
mode:
authorF. Jason Park2023-10-06 17:34:04 -0700
committerF. Jason Park2023-10-13 07:47:00 -0700
commitd46c016fbd09cbce9ef23fe2b49d4fb5fc3b2b16 (patch)
tree7f1acf7155396ca7324853051071b13447a8b6e6 /doc/misc
parent9120d7a32ea4906d7c9460add31d37c3ca38931e (diff)
downloademacs-d46c016fbd09cbce9ef23fe2b49d4fb5fc3b2b16.tar.gz
emacs-d46c016fbd09cbce9ef23fe2b49d4fb5fc3b2b16.zip
Sort and dedupe when loading modules in erc-open
* doc/misc/erc.texi: Add new subheading "Module Loading" under the "Modules" chapter. * lisp/erc/erc.el (erc--sort-modules): New utility function to sort and dedupe modules. (erc-modules): In `custom-set' function, factor out collation into separate utility `erc--sort-modules'. (erc-update-modules): Call `erc--update-modules' with an argument, the current value of `erc-modules'. (erc--aberrant-modules): New variable, a list of symbols whose modules ERC suspects of being incorrectly defined. (erc--warn-about-aberrant-modules): New function to print an error message and emit a warning prior to connecting when `erc--aberrant-modules' is non-nil. (erc--find-mode): Make heuristic more robust by always checking for a mode activation command rather than just a state variable. This fixes a compatibility bug, new in 5.6, affecting third-party modules that autoload module definitions instead of their corresponding mode-activation commands. (erc--update-modules): Add new positional argument `modules'. (erc--setup-buffer-hook): Add new default member, `erc--warn-about-aberrant-modules'. (erc-open): Pass sorted `erc-modules' to `erc--update-modules'. * test/lisp/erc/erc-tests.el (erc--sort-modules): New test. (erc-tests--update-modules): New fixture. (erc--update-modules): Remove and rework as three separate tests dedicated to specific contexts. The existing one had poor coverage and was difficult, if not impossible, to follow. (erc--update-modules/unknown, erc--update-modules/local, erc--update-modules/realistic): New tests. (Bug#57955)
Diffstat (limited to 'doc/misc')
-rw-r--r--doc/misc/erc.texi35
1 files changed, 35 insertions, 0 deletions
diff --git a/doc/misc/erc.texi b/doc/misc/erc.texi
index 3297d8b17f0..3bfa240cacc 100644
--- a/doc/misc/erc.texi
+++ b/doc/misc/erc.texi
@@ -653,6 +653,41 @@ And unlike global toggles, none of these ever mutates
653@code{erc-modules}. 653@code{erc-modules}.
654 654
655 655
656@anchor{Module Loading}
657@subheading Module Loading
658@cindex module loading
659
660ERC loads internal modules in alphabetical order and third-party
661modules as they appear in @code{erc-modules}. When defining your own
662module, take care to ensure ERC can find it. An easy way to do that
663is by mimicking the example in the doc string for
664@code{define-erc-module}. For historical reasons, ERC also falls back
665to @code{require}ing features. For example, if some module
666@code{<mymod>} in @code{erc-modules} lacks a corresponding
667@code{erc-<mymod>-mode} command, ERC will attempt to load the library
668@code{erc-<mymod>} prior to connecting. If this fails, ERC signals an
669error. Users wanting to define modules in an init files should
670@code{(provide 'erc-<my-mod>)} somewhere to placate ERC. Dynamically
671generating modules on the fly is not supported.
672
673Sometimes, packages attempt to autoload a module's definition instead
674of its minor-mode command, which breaks the link between the library
675and the module. This means that enabling the mode by invoking its
676command toggle isn't enough to load its defining library. Such
677packages should instead only supply autoload cookies featuring an
678explicit @code{autoload} form for their module's minor-mode command.
679As mentioned above, packages can also usually avoid autoload cookies
680entirely so long as their module's prefixed name matches that of its
681defining library and the latter's provided feature.
682
683Packages have also been seen to specify unnecessary top-level
684@code{eval-after-load} forms, which end up being ineffective in most
685cases. Another unfortunate practice is mutating @code{erc-modules}
686itself in an autoloaded form. Doing this tricks Customize into
687displaying the widget for @code{erc-modules} incorrectly, with
688built-in modules moved from the predefined checklist to the
689user-provided free-form area.
690
656@c PRE5_4: Document every option of every module in its own subnode 691@c PRE5_4: Document every option of every module in its own subnode
657 692
658 693