]> code.delx.au - gnu-emacs-elpa/blobdiff - packages/eldoc-eval/eldoc-eval.el
Merge commit '4709fc4530da4ddfd29b910763c801292b228f69' from diff-hl
[gnu-emacs-elpa] / packages / eldoc-eval / eldoc-eval.el
index c4d8580e5af92e2c56920e1a7380a9edd71cb709..bf208e041e2442544bdf9537df6a7f18363a40c9 100644 (file)
@@ -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,
 ;; 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 "<C-M-right>") '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)