1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-24 14:30:43 -08:00

Respect global-eldoc-mode in minibuffers (Bug#36886)

* lisp/emacs-lisp/easy-mmode.el (define-globalized-minor-mode): Accept
a BODY parameter.
* doc/lispref/modes.texi (Defining Minor Modes): Document new
parameter.
* etc/NEWS: Announce it.

* lisp/simple.el (read--expression): Move eldoc-mode setup to...
* lisp/emacs-lisp/eldoc.el (eldoc--eval-expression-setup): ... here,
new function.
(global-eldoc-mode): Add or remove it to
eval-expression-minibuffer-setup-hook when enabling or disabling
global-eldoc-mode.  This enables eldoc in the minibuffer (solving
Bug#27202), only when global-eldoc-mode is enabled.
This commit is contained in:
Noam Postavsky 2019-08-03 20:19:31 -04:00
parent 5a95521282
commit 7e2090ee80
5 changed files with 49 additions and 25 deletions

View file

@ -363,18 +363,21 @@ No problems result if this variable is not bound.
;;;###autoload
(defalias 'define-global-minor-mode 'define-globalized-minor-mode)
;;;###autoload
(defmacro define-globalized-minor-mode (global-mode mode turn-on &rest keys)
(defmacro define-globalized-minor-mode (global-mode mode turn-on &rest body)
"Make a global mode GLOBAL-MODE corresponding to buffer-local minor MODE.
TURN-ON is a function that will be called with no args in every buffer
and that should try to turn MODE on if applicable for that buffer.
KEYS is a list of CL-style keyword arguments. As the minor mode
defined by this function is always global, any :global keyword is
ignored. Other keywords have the same meaning as in `define-minor-mode',
which see. In particular, :group specifies the custom group.
The most useful keywords are those that are passed on to the
`defcustom'. It normally makes no sense to pass the :lighter
or :keymap keywords to `define-globalized-minor-mode', since these
are usually passed to the buffer-local version of the minor mode.
Each of KEY VALUE is a pair of CL-style keyword arguments. As
the minor mode defined by this function is always global, any
:global keyword is ignored. Other keywords have the same
meaning as in `define-minor-mode', which see. In particular,
:group specifies the custom group. The most useful keywords
are those that are passed on to the `defcustom'. It normally
makes no sense to pass the :lighter or :keymap keywords to
`define-globalized-minor-mode', since these are usually passed
to the buffer-local version of the minor mode.
BODY contains code to execute each time the mode is enabled or disabled.
It is executed after toggling the mode, and before running GLOBAL-MODE-hook.
If MODE's set-up depends on the major mode in effect when it was
enabled, then disabling and reenabling MODE should make MODE work
@ -384,7 +387,9 @@ call another major mode in their body.
When a major mode is initialized, MODE is actually turned on just
after running the major mode's hook. However, MODE is not turned
on if the hook has explicitly disabled it."
on if the hook has explicitly disabled it.
\(fn GLOBAL-MODE MODE TURN-ON [KEY VALUE]... BODY...)"
(declare (doc-string 2))
(let* ((global-mode-name (symbol-name global-mode))
(mode-name (symbol-name mode))
@ -404,12 +409,12 @@ on if the hook has explicitly disabled it."
keyw)
;; Check keys.
(while (keywordp (setq keyw (car keys)))
(setq keys (cdr keys))
(while (keywordp (setq keyw (car body)))
(pop body)
(pcase keyw
(:group (setq group (nconc group (list :group (pop keys)))))
(:global (setq keys (cdr keys)))
(_ (push keyw extra-keywords) (push (pop keys) extra-keywords))))
(:group (setq group (nconc group (list :group (pop body)))))
(:global (pop body))
(_ (push keyw extra-keywords) (push (pop body) extra-keywords))))
`(progn
(progn
@ -446,7 +451,8 @@ See `%s' for more information on %s."
;; Go through existing buffers.
(dolist (buf (buffer-list))
(with-current-buffer buf
(if ,global-mode (funcall #',turn-on) (when ,mode (,mode -1))))))
(if ,global-mode (funcall #',turn-on) (when ,mode (,mode -1)))))
,@body)
;; Autoloading define-globalized-minor-mode autoloads everything
;; up-to-here.

View file

@ -207,7 +207,24 @@ expression point is on."
(define-globalized-minor-mode global-eldoc-mode eldoc-mode turn-on-eldoc-mode
:group 'eldoc
:initialize 'custom-initialize-delay
:init-value t)
:init-value t
;; For `read--expression', the usual global mode mechanism of
;; `change-major-mode-hook' runs in the minibuffer before
;; `eldoc-documentation-function' is set, so `turn-on-eldoc-mode'
;; does nothing. Configure and enable eldoc from
;; `eval-expression-minibuffer-setup-hook' instead.
(if global-eldoc-mode
(add-hook 'eval-expression-minibuffer-setup-hook
#'eldoc--eval-expression-setup)
(remove-hook 'eval-expression-minibuffer-setup-hook
#'eldoc--eval-expression-setup)))
(defun eldoc--eval-expression-setup ()
;; Setup `eldoc', similar to `emacs-lisp-mode'. FIXME: Call
;; `emacs-lisp-mode' itself?
(add-function :before-until (local 'eldoc-documentation-function)
#'elisp-eldoc-documentation-function)
(eldoc-mode +1))
;;;###autoload
(defun turn-on-eldoc-mode ()