Add a new variable `global-minor-modes'

* doc/lispref/modes.texi (Minor Modes): Document it.
* lisp/simple.el (global-minor-modes): New variable.
(completion-in-mode-p): Use it.
(completion-with-modes-p): Use it.

* lisp/emacs-lisp/easy-mmode.el (define-minor-mode): Support it.
This commit is contained in:
Lars Ingebrigtsen 2021-02-15 13:08:15 +01:00
parent 0bd846c174
commit b535c8ba87
4 changed files with 30 additions and 9 deletions

View file

@ -1466,6 +1466,11 @@ This buffer-local variable lists the currently enabled minor modes in
the current buffer, and is a list of symbols.
@end defvar
@defvar global-minor-modes
This variable lists the currently enabled global minor modes, and is a
list of symbols.
@end defvar
@defvar minor-mode-list
The value of this variable is a list of all minor mode commands.
@end defvar

View file

@ -2297,7 +2297,13 @@ that is not compatible with byte code in previous Emacs versions.
+++
** New buffer-local variable 'local-minor-modes'.
This permanently buffer-local variable holds a list of currently
enabled minor modes in the current buffer (as a list of symbols).
enabled non-global minor modes in the current buffer (as a list of
symbols).
+++
** New variable 'global-minor-modes'.
This variable holds a list of currently enabled global minor modes (as
a list of symbols).
+++
** 'define-minor-mode' now takes an :interactive argument.

View file

@ -330,11 +330,14 @@ or call the function `%s'."))))
nil)
(t
t)))
(unless ,globalp
;; Keep `local-minor-modes' up to date.
(setq local-minor-modes (delq ',modefun local-minor-modes))
(when ,getter
(push ',modefun local-minor-modes)))
;; Keep minor modes list up to date.
,@(if globalp
`((setq global-minor-modes (delq ',modefun global-minor-modes))
(when ,getter
(push ',modefun global-minor-modes)))
`((setq local-minor-modes (delq ',modefun local-minor-modes))
(when ,getter
(push ',modefun local-minor-modes))))
,@body
;; The on/off hooks are here for backward compatibility only.
(run-hooks ',hook (if ,getter ',hook-on ',hook-off))

View file

@ -138,6 +138,10 @@ messages are highlighted; this helps to see what messages were visited."
nil
"Overlay highlighting the current error message in the `next-error' buffer.")
(defvar global-minor-modes nil
"A list of the currently enabled global minor modes.
This is a list of symbols.")
(defcustom next-error-hook nil
"List of hook functions run by `next-error' after visiting source file."
:type 'hook
@ -1985,14 +1989,16 @@ BUFFER, or any of the active minor modes in BUFFER."
(or (provided-mode-derived-p
(buffer-local-value 'major-mode buffer) (car modes))
(memq (car modes)
(buffer-local-value 'local-minor-modes buffer)))
(buffer-local-value 'local-minor-modes buffer))
(memq (car modes) global-minor-modes))
;; Uncommon case: Multiple modes.
(apply #'provided-mode-derived-p
(buffer-local-value 'major-mode buffer)
modes)
(seq-intersection modes
(buffer-local-value 'local-minor-modes buffer)
#'eq)))))
#'eq)
(seq-intersection modes global-minor-modes #'eq)))))
(defun completion-with-modes-p (modes buffer)
"Say whether MODES are in action in BUFFER.
@ -2004,7 +2010,8 @@ or (if one of MODES is a minor mode), if it is switched on in BUFFER."
;; It's a minor mode.
(seq-intersection modes
(buffer-local-value 'local-minor-modes buffer)
#'eq)))
#'eq)
(seq-intersection modes global-minor-modes #'eq)))
(defun completion-button-p (category buffer)
"Return non-nil if there's a button of CATEGORY at point in BUFFER."