X-Git-Url: https://code.delx.au/gnu-emacs-elpa/blobdiff_plain/fae643a95ed3ba2cefbe70c94d16da7b17877dca..c33d1d58acc301ba018f4f69dcab93c5b2246643:/packages/eldoc-eval/eldoc-eval.el diff --git a/packages/eldoc-eval/eldoc-eval.el b/packages/eldoc-eval/eldoc-eval.el index c4d8580e5..bf208e041 100644 --- a/packages/eldoc-eval/eldoc-eval.el +++ b/packages/eldoc-eval/eldoc-eval.el @@ -30,7 +30,7 @@ ;; ;; By default with this package `M-:' will use `pp-eval-expression' ;; instead of `eval-expression'; you can change that by setting -;; `eval-preferred-function'. +;; `eldoc-eval-preferred-function'. ;; ;; It also provides a convenient macro to enable eldoc support ;; in your own functions using minibuffer or in your defadvices, @@ -39,68 +39,61 @@ ;; Users of own minibuffer frame will have to set ;; `eldoc-in-minibuffer-own-frame-p' to non-nil. ;; -;; You can turn off eldoc support in minibuffer any time -;; by setting `eldoc-in-minibuffer' to nil. +;; You can turn On/Off eldoc support in minibuffer any time +;; with `eldoc-in-minibuffer-mode'. +;; +;;; Install: +;; Add to .emacs: +;; +;; (autoload 'eldoc-in-minibuffer-mode "eldoc-eval") +;; (eldoc-in-minibuffer-mode 1) + ;;; Code: (require 'eldoc) -;; FIXME: This has no autoloads and (require 'eldoc-eval) will change Emacs's -;; behavior, against usual conventions. The fix is to define -;; eldoc-in-minibuffer as a (global) minor mode, then autoload it. So the -;; default value will be nil, and the user can enable it with -;; (eldoc-in-minibuffer 1) or by customizing eldoc-in-minibuffer, rather than -;; by adding (require 'eldoc-eval) in her .emacs. - ;;; Minibuffer support. ;; Enable displaying eldoc info in something else ;; Than minibuffer when this one is in use. ;; -(defcustom eldoc-in-minibuffer t - "Turn on eldoc in minibuffer." - :group 'eldoc - :type 'bolean) +(defgroup eldoc-eval nil + "Show eldoc infos in mode line while minibuffer is in use." + :group 'eldoc) (defcustom eldoc-in-minibuffer-show-fn 'eldoc-show-in-mode-line "A function to display eldoc info. Should take one arg: the string to display" - :group 'eldoc :type 'function) (defcustom eldoc-show-in-mode-line-delay 12 "The time we show eldoc when Emacs is idle." - :group 'eldoc :type 'number) -(defcustom eval-preferred-function 'pp-eval-expression +(defcustom eldoc-eval-preferred-function 'pp-eval-expression "Preferred function to use with `M-:'." - :group 'lisp :type 'function) (defcustom eldoc-in-minibuffer-own-frame-p nil "Whether minibuffer has its own frame or not." - :group 'lisp :type 'boolean) ;;; Compatibility with Emacs-24.4 ;; New implementation of eldoc in minibuffer that come ;; with Emacs-24.4 show the eldoc info of current-buffer while ;; minibuffer is in use, disable this and inline old Emacs behavior. - -(when (boundp 'eldoc-message-function) - (setq eldoc-message-function 'message) - - (defadvice eldoc-display-message-no-interference-p - (around eldoc-eval activate) - (if (not eldoc-in-minibuffer) - ad-do-it - (and eldoc-mode - (not executing-kbd-macro) - (not (and (boundp 'edebug-active) edebug-active)) - ;; Having this mode operate in an active minibuffer/echo area causes - ;; interference with what's going on there. - (not cursor-in-echo-area) - (not (eq (selected-window) (minibuffer-window))))))) +;; +(defconst eldoc-eval--old-message-function + (and (boundp 'eldoc-message-function) eldoc-message-function)) + +(defadvice eldoc-display-message-no-interference-p + (after eldoc-eval activate) + (when eldoc-in-minibuffer-mode + (setq ad-return-value + (and ad-return-value + ;; Having this mode operate in an active minibuffer/echo area + ;; causes interference with what's going on there. + (not cursor-in-echo-area) + (not (eq (selected-window) (minibuffer-window))))))) ;; Internal. (defvar eldoc-active-minibuffers-list nil @@ -117,15 +110,14 @@ See `with-eldoc-in-minibuffer'." (defmacro with-eldoc-in-minibuffer (&rest body) "Enable eldoc support for minibuffer input that runs in BODY." (declare (indent 0) (debug t)) - `(let ((timer (and eldoc-in-minibuffer + `(let ((timer (and eldoc-in-minibuffer-mode (run-with-idle-timer eldoc-idle-delay - 'repeat 'eldoc-mode-in-minibuffer)))) + 'repeat #'eldoc-run-in-minibuffer)))) (unwind-protect (minibuffer-with-setup-hook - ;; When minibuffer is activated in body, - ;; store it. - 'eldoc-store-minibuffer + ;; When minibuffer is activated in body, store it. + #'eldoc-store-minibuffer ,@body) (and timer (cancel-timer timer)) ;; Each time a minibuffer exits or aborts @@ -170,11 +162,37 @@ See `with-eldoc-in-minibuffer'." (defun eldoc-mode-line-toggle-rolling () (interactive) - (setq eldoc-mode-line-rolling-flag (not eldoc-mode-line-rolling-flag))) -(define-key minibuffer-local-map (kbd "") 'eldoc-mode-line-toggle-rolling) - -(defun eldoc-mode-in-minibuffer () - "Show eldoc for current minibuffer input." + (if (and eldoc-in-minibuffer-mode + (minibuffer-window-active-p (selected-window))) + (setq eldoc-mode-line-rolling-flag (not eldoc-mode-line-rolling-flag)) + (error "No active minibuffer found"))) + +(defvar eldoc-in-minibuffer-mode-map + (let ((map (make-sparse-keymap))) + ;; FIXME: Should we use [remap eval-expression] instead? + (define-key map (kbd "M-:") 'eldoc-eval-expression) + map)) + +;;;###autoload +(define-minor-mode eldoc-in-minibuffer-mode + "Show eldoc for current minibuffer input." + :global t + (if eldoc-in-minibuffer-mode + (progn + (add-hook 'minibuffer-exit-hook + (lambda () + (setq eldoc-mode-line-rolling-flag nil))) + (and (boundp 'eldoc-message-function) + (setq eldoc-message-function 'message)) + (define-key minibuffer-local-map (kbd "C-@") + 'eldoc-mode-line-toggle-rolling) + (setq eldoc-minor-mode-string " Eldoc-eval")) + (setq eldoc-minor-mode-string " Eldoc") + (and (boundp 'eldoc-message-function) + (setq eldoc-message-function eldoc-eval--old-message-function)) + (define-key minibuffer-local-map (kbd "C-@") 'set-mark-command))) + +(defun eldoc-run-in-minibuffer () (let ((buf (window-buffer (active-minibuffer-window)))) ;; If this minibuffer have been started with ;;`with-eldoc-in-minibuffer' give it eldoc support @@ -195,17 +213,12 @@ See `with-eldoc-in-minibuffer'." (beginning-of-buffer nil) (error (message "Eldoc in minibuffer error: %S" err))))) -(defun eval-expression-with-eldoc () +;;;###autoload +(defun eldoc-eval-expression () "Eval expression with eldoc support in mode-line." (interactive) (with-eldoc-in-minibuffer - (call-interactively eval-preferred-function))) - -;; Bind it to `M-:'. - -;; FIXME: Turn eldoc-in-minibuffer into a global minor mode, and place this -;; binding in its keymap. -(global-set-key [remap eval-expression] 'eval-expression-with-eldoc) + (call-interactively eldoc-eval-preferred-function))) (provide 'eldoc-eval)