From 5daa6a6a0398131717c5b5fd570c5efad34a4afa Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jo=C3=A3o=20T=C3=A1vora?= Date: Sat, 3 Oct 2020 17:27:05 +0100 Subject: [PATCH] Rework eldoc-echo-area-prefer-doc-buffer (bug#42532) * lisp/emacs-lisp/eldoc.el: (eldoc-echo-area-prefer-doc-buffer): Rename from eldoc-echo-area-prefer-doc-buffer (eldoc-display-in-echo-area): Rework to honour eldoc-echo-area-prefer-doc-buffer. --- lisp/emacs-lisp/eldoc.el | 39 +++++++++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/lisp/emacs-lisp/eldoc.el b/lisp/emacs-lisp/eldoc.el index 1b180f26c58..6c6570f847a 100644 --- a/lisp/emacs-lisp/eldoc.el +++ b/lisp/emacs-lisp/eldoc.el @@ -117,12 +117,13 @@ single line of display in the echo area." symbol names if it will\ enable argument list to fit on one line" truncate-sym-name-if-fit))) -(defcustom eldoc-prefer-doc-buffer nil +(defcustom eldoc-echo-area-prefer-doc-buffer nil "Prefer ElDoc's documentation buffer if it is showing in some frame. -If this variable's value is t and a piece of documentation needs -to be truncated to fit in the echo area, do so if ElDoc's -documentation buffer is not already showing, since the buffer -always holds the full documentation." +If this variable's value is t, ElDoc will skip showing +documentation in the echo area if the dedicated documentation +buffer (given by `eldoc-doc-buffer') is being displayed in some +window. If the value is the symbol `maybe', then the echo area +is only skipped if the documentation doesn't fit there." :type 'boolean) (defface eldoc-highlight-function-argument @@ -491,7 +492,7 @@ This holds the results of the last documentation request." (defun eldoc-display-in-echo-area (docs _interactive) "Display DOCS in echo area. Honor `eldoc-echo-area-use-multiline-p' and -`eldoc-prefer-doc-buffer'." +`eldoc-echo-area-prefer-doc-buffer'." (cond (;; Check if he wave permission to mess with echo area at all. For ;; example, if this-command is non-nil while running via an idle @@ -517,7 +518,14 @@ Honor `eldoc-echo-area-use-multiline-p' and (float (truncate (* (frame-height) val))) (integer val) (t 1))) - single-doc single-doc-sym) + single-doc single-doc-sym + (prefer-doc-buffer-p + (lambda (truncated) + (and (or (eq eldoc-echo-area-prefer-doc-buffer t) + (and truncated + (eq eldoc-echo-area-prefer-doc-buffer + 'maybe))) + (get-buffer-window eldoc--doc-buffer))))) (let ((echo-area-message (cond (;; To output to the echo area,We handle the @@ -556,9 +564,7 @@ Honor `eldoc-echo-area-use-multiline-p' and 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)) + (unless (funcall prefer-doc-buffer-p truncated) (cl-return (concat (buffer-substring (point-min) (point)) @@ -570,10 +576,15 @@ Honor `eldoc-echo-area-use-multiline-p' and (substitute-command-keys "\\[eldoc-doc-buffer]")) "...")))))))) ((= available 1) - ;; Truncate "brutally." ; FIXME: use `eldoc-prefer-doc-buffer' too? - (with-current-buffer (eldoc--format-doc-buffer docs) - (truncate-string-to-width - (buffer-substring (goto-char (point-min)) (line-end-position 1)) width)))))) + (let ((string + (with-current-buffer (eldoc--format-doc-buffer docs) + (buffer-substring (goto-char (point-min)) + (line-end-position 1))))) + (if (> (length string) width) ; truncation to happen + (unless (funcall prefer-doc-buffer-p t) + (truncate-string-to-width string width)) + (unless (funcall prefer-doc-buffer-p nil) + string))))))) (when echo-area-message (eldoc--message echo-area-message))))))) -- 2.39.2