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:
parent
5a95521282
commit
7e2090ee80
5 changed files with 49 additions and 25 deletions
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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 ()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue