From: João Távora Date: Fri, 10 Jul 2020 20:23:06 +0000 (+0100) Subject: Fix placement of Eldoc docs during eval-expression (bug#42309) X-Git-Tag: emacs-28.0.90~7027 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=1198b03e558fccff745861396f3a7c705b4bbb49;p=emacs.git Fix placement of Eldoc docs during eval-expression (bug#42309) * lisp/emacs-lisp/eldoc.el (eldoc--handle-docs): Rework. --- diff --git a/lisp/emacs-lisp/eldoc.el b/lisp/emacs-lisp/eldoc.el index 7964c4c45ab..faf02aa0079 100644 --- a/lisp/emacs-lisp/eldoc.el +++ b/lisp/emacs-lisp/eldoc.el @@ -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.