diff options
| author | F. Jason Park | 2023-10-06 17:34:04 -0700 |
|---|---|---|
| committer | F. Jason Park | 2023-10-13 07:47:00 -0700 |
| commit | d46c016fbd09cbce9ef23fe2b49d4fb5fc3b2b16 (patch) | |
| tree | 7f1acf7155396ca7324853051071b13447a8b6e6 /doc/misc | |
| parent | 9120d7a32ea4906d7c9460add31d37c3ca38931e (diff) | |
| download | emacs-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.texi | 35 |
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 | |||
| 660 | ERC loads internal modules in alphabetical order and third-party | ||
| 661 | modules as they appear in @code{erc-modules}. When defining your own | ||
| 662 | module, take care to ensure ERC can find it. An easy way to do that | ||
| 663 | is by mimicking the example in the doc string for | ||
| 664 | @code{define-erc-module}. For historical reasons, ERC also falls back | ||
| 665 | to @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 | ||
| 669 | error. Users wanting to define modules in an init files should | ||
| 670 | @code{(provide 'erc-<my-mod>)} somewhere to placate ERC. Dynamically | ||
| 671 | generating modules on the fly is not supported. | ||
| 672 | |||
| 673 | Sometimes, packages attempt to autoload a module's definition instead | ||
| 674 | of its minor-mode command, which breaks the link between the library | ||
| 675 | and the module. This means that enabling the mode by invoking its | ||
| 676 | command toggle isn't enough to load its defining library. Such | ||
| 677 | packages should instead only supply autoload cookies featuring an | ||
| 678 | explicit @code{autoload} form for their module's minor-mode command. | ||
| 679 | As mentioned above, packages can also usually avoid autoload cookies | ||
| 680 | entirely so long as their module's prefixed name matches that of its | ||
| 681 | defining library and the latter's provided feature. | ||
| 682 | |||
| 683 | Packages have also been seen to specify unnecessary top-level | ||
| 684 | @code{eval-after-load} forms, which end up being ineffective in most | ||
| 685 | cases. Another unfortunate practice is mutating @code{erc-modules} | ||
| 686 | itself in an autoloaded form. Doing this tricks Customize into | ||
| 687 | displaying the widget for @code{erc-modules} incorrectly, with | ||
| 688 | built-in modules moved from the predefined checklist to the | ||
| 689 | user-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 | ||