From 9cf1ebd0d8a0b1aa059f049aeb0c297b114aa4e2 Mon Sep 17 00:00:00 2001 From: Max Nikulin Date: Tue, 30 Apr 2024 18:05:11 +0700 Subject: [PATCH] org.el: Call EXT-enable for `org-modules' * lisp/org.el (org-load-modules-maybe): Activate extensions that implement EXT-enable functions. * etc/ORG-NEWS: * lisp/org-ctags.el: Update docs. It should simplify configuration for `org-ctags' users after badb09d67. The idea was discussed in Ihor Radchenko. Re: Autoloading side effects (was: Re: [BUG] org-mouse is activated without explicit require) Mon, 12 Dec 2022 10:25:16 +0000 An alternative from the same thread is converting org modules to minor modes. --- etc/ORG-NEWS | 23 +++++++++++++++++++---- lisp/org-ctags.el | 5 ++++- lisp/org.el | 11 +++++++++-- 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS index 8dbc3292d..708d11f4f 100644 --- a/etc/ORG-NEWS +++ b/etc/ORG-NEWS @@ -651,10 +651,14 @@ just =id:= links. *** ~org-ctags~ is not activated by default any more -To follow Emacs [[info:elisp#Coding Conventions][coding conventions]] and to avoid confusion of users +To follow Emacs [[info:elisp#Coding Conventions][coding conventions]] +and to avoid confusion of users who accidentally get ~org-ctags~ autoloaded due to help completion, -the library does not modify ~org-open-link-functions~ during loading -any more. Run ~org-ctags-enable~ to setup hooks and advices: +the library does not modify ~org-open-link-functions~ any more +when it is loaded using ~(require 'org-ctags)~ or a similar construct. +To setup hooks and advices either +[[*~feature-enable~ functions are called for extensions from ~org-modules~][customize ~org-modules~]] +and add ~org-ctags~ or run ~org-ctags-enable~ explicitly: #+begin_src emacs-lisp (with-eval-after-load "org-ctags" @@ -1473,10 +1477,21 @@ buffer it will be added. If not specified, new headings are created at level 1 at the end of the accessible part of the buffer, as before. ** Miscellaneous +*** ~feature-enable~ functions are called for extensions from ~org-modules~ + +Accordingly to Emacs [[info:elisp#Coding Conventions][coding conventions]] +loading a library must not modify behavior +since it may be done for the sake of help or command completion. +To make user configuration more convenient, when an extension ~EXT~ listed +in ~org-modules~ implements ~EXT-enable~ function, it is executed +during loading of Org mode or in response to customization of ~org-modules~. +So instead of ~(require 'EXT)~ in your init file add ~EXT~ to ~org-modules~. +See also +[[*~org-ctags~ is not activated by default any more][~org-ctags~ is not activated by default any more]]. + *** =org-crypt.el= now applies initial visibility settings to decrypted entries Previously, all the text was unfolded unconditionally, including property drawers. - *** Blank lines after removed objects are now retained during export When certain objects in Org document are to be excluded from export, diff --git a/lisp/org-ctags.el b/lisp/org-ctags.el index d3af103dd..9313c43cd 100644 --- a/lisp/org-ctags.el +++ b/lisp/org-ctags.el @@ -57,10 +57,13 @@ ;;; Commentary: ;; (add-hook 'org-mode-hook ;; (lambda () ;; (define-key org-mode-map "\C-co" 'org-ctags-find-tag-interactive))) +;; +;; To activate the library, you either need to add it to `org-modules' +;; or to call `org-ctags-enable' explicitly: +;; ;; (with-eval-after-load "org-ctags" ;; (org-ctags-enable)) ;; -;; To activate the library, you need to call `org-ctags-enable' explicitly. ;; It used to be invoked during library loading, but it was against Emacs ;; policy and caused inconvenience of Org users who do not use `org-ctags'. ;; diff --git a/lisp/org.el b/lisp/org.el index 2d1a2055f..7030000ef 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -724,10 +724,17 @@ (defvar org-modules-loaded nil ;;;###autoload (defun org-load-modules-maybe (&optional force) - "Load all extensions listed in `org-modules'." + "Load all extensions listed in `org-modules'. +If an extension defines EXT-enable function then invoke it +to activate the module." (when (or force (not org-modules-loaded)) (dolist (ext org-modules) - (condition-case-unless-debug nil (require ext) + (condition-case-unless-debug nil + (let* ((feature (require ext)) + (enable-function (intern (concat (symbol-name feature) + "-enable")))) + (when (fboundp enable-function) + (funcall enable-function))) (error (message "Problems while trying to load feature `%s'" ext)))) (setq org-modules-loaded t))) -- 2.39.2