]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix placement of Eldoc docs during eval-expression (bug#42309)
authorJoão Távora <joaotavora@gmail.com>
Fri, 10 Jul 2020 20:23:06 +0000 (21:23 +0100)
committerJoão Távora <joaotavora@gmail.com>
Fri, 10 Jul 2020 20:23:33 +0000 (21:23 +0100)
* lisp/emacs-lisp/eldoc.el (eldoc--handle-docs): Rework.

lisp/emacs-lisp/eldoc.el

index 7964c4c45ab0742ea987218f76ae3682cb591d52..faf02aa00792366f79b0445b8ef14526fce0441c 100644 (file)
@@ -459,42 +459,46 @@ Honor most of `eldoc-echo-area-use-multiline-p'."
       ;; top-section of the `*eldoc' buffer.  I'm pretty sure nicer
       ;; strategies can be used here, probably by splitting this
       ;; function into some `eldoc-display-functions' special hook.
-      (if (and (eq 'truncate-sym-name-if-fit eldoc-echo-area-use-multiline-p)
-               (null (cdr docs))
-               (setq single-sym-name
-                     (format "%s" (plist-get (cdar docs) :thing)))
-               (> (+ (length (caar docs)) (length single-sym-name) 2) width))
-          (eldoc--message (caar docs))
-        (with-current-buffer (eldoc-doc-buffer)
-          (goto-char (point-min))
-          (cond
-           ;; Potentially truncate a long message into less lines,
-           ;; then display it in the echo area;
-           ((> available 1)
-            (cl-loop
-             initially (goto-char (line-end-position (1+ available)))
-             for truncated = nil then t
-             for needed
-             = (let ((truncate-lines message-truncate-lines))
-                 (count-screen-lines (point-min) (point) t (minibuffer-window)))
-             while (> needed (if truncated (1- available) available))
-             do (goto-char (line-end-position (if truncated 0 -1)))
-             (while (and (not (bobp)) (bolp)) (goto-char (line-end-position 0)))
-             finally
-             (unless (and truncated
-                          eldoc-prefer-doc-buffer
-                          (get-buffer-window eldoc--doc-buffer))
-               (eldoc--message
-                (concat (buffer-substring (point-min) (point))
-                        (and truncated
-                             (format
-                              "\n(Documentation truncated. Use `%s' to see rest)"
-                              (substitute-command-keys "\\[eldoc-doc-buffer]"))))))))
-           ((= available 1)
-            ;; Truncate "brutally." ; FIXME: use `eldoc-prefer-doc-buffer' too?
-            (eldoc--message
-             (truncate-string-to-width
-              (buffer-substring (point-min) (line-end-position 1)) width)))))))))
+      (let ((echo-area-message
+             (cond
+              ((and
+                (eq 'truncate-sym-name-if-fit eldoc-echo-area-use-multiline-p)
+                (null (cdr docs))
+                (setq single-sym-name
+                      (format "%s" (plist-get (cdar docs) :thing)))
+                (> (+ (length (caar docs)) (length single-sym-name) 2) width))
+               (caar docs))
+              ((> available 1)
+               (with-current-buffer (eldoc-doc-buffer)
+                 (cl-loop
+                  initially
+                  (goto-char (point-min))
+                  (goto-char (line-end-position (1+ available)))
+                  for truncated = nil then t
+                  for needed
+                  = (let ((truncate-lines message-truncate-lines))
+                      (count-screen-lines (point-min) (point) t
+                                          (minibuffer-window)))
+                  while (> needed (if truncated (1- available) available))
+                  do (goto-char (line-end-position (if truncated 0 -1)))
+                  (while (and (not (bobp)) (bolp)) (goto-char (line-end-position 0)))
+                  finally
+                  (unless (and truncated
+                               eldoc-prefer-doc-buffer
+                               (get-buffer-window eldoc--doc-buffer))
+                    (cl-return
+                     (concat
+                      (buffer-substring (point-min) (point))
+                      (and truncated
+                           (format
+                            "\n(Documentation truncated. Use `%s' to see rest)"
+                            (substitute-command-keys "\\[eldoc-doc-buffer]")))))))))
+              ((= available 1)
+               ;; Truncate "brutally." ; FIXME: use `eldoc-prefer-doc-buffer' too?
+               (truncate-string-to-width
+                (buffer-substring (point-min) (line-end-position 1)) width)))))
+        (when echo-area-message
+          (eldoc--message echo-area-message))))))
 
 (defun eldoc-documentation-default ()
   "Show first doc string for item at point.