From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.ciao.gmane.io!not-for-mail From: =?UTF-8?Q?Jo=C3=A3o_?= =?UTF-8?Q?T=C3=A1vora?= Newsgroups: gmane.emacs.bugs Subject: bug#41531: 27.0.91; Better handle asynchronous eldoc backends Date: Mon, 25 May 2020 18:04:02 +0100 Message-ID: <875zckuet9.fsf@gmail.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Injection-Info: ciao.gmane.io; posting-host="ciao.gmane.io:159.69.161.202"; logging-data="129467"; mail-complaints-to="usenet@ciao.gmane.io" Cc: Stefan Monnier , andreyk.mad@gmail.com, Dmitry Gutov To: 41531@debbugs.gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Mon May 25 19:07:12 2020 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1jdGZD-000Xct-F7 for geb-bug-gnu-emacs@m.gmane-mx.org; Mon, 25 May 2020 19:07:11 +0200 Original-Received: from localhost ([::1]:58114 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jdGZC-0000j4-Cd for geb-bug-gnu-emacs@m.gmane-mx.org; Mon, 25 May 2020 13:07:10 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:37970) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jdGX8-0006hJ-Nn for bug-gnu-emacs@gnu.org; Mon, 25 May 2020 13:05:02 -0400 Original-Received: from debbugs.gnu.org ([209.51.188.43]:59061) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1jdGX8-000591-DY for bug-gnu-emacs@gnu.org; Mon, 25 May 2020 13:05:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1jdGX7-0003Tq-T0; Mon, 25 May 2020 13:05:01 -0400 X-Loop: help-debbugs@gnu.org Resent-From: =?UTF-8?Q?Jo=C3=A3o_?= =?UTF-8?Q?T=C3=A1vora?= Original-Sender: "Debbugs-submit" Resent-CC: monnier@iro.umontreal.ca, dgutov@yandex.ru, andreyk.mad@gmail.com, bug-gnu-emacs@gnu.org Resent-Date: Mon, 25 May 2020 17:05:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 41531 X-GNU-PR-Package: emacs X-Debbugs-Original-To: bug-gnu-emacs@gnu.org X-Debbugs-Original-Xcc: Stefan Monnier , Dmitry Gutov , andreyk.mad@gmail.com Original-Received: via spool by submit@debbugs.gnu.org id=B.159042626013324 (code B ref -1); Mon, 25 May 2020 17:05:01 +0000 Original-Received: (at submit) by debbugs.gnu.org; 25 May 2020 17:04:20 +0000 Original-Received: from localhost ([127.0.0.1]:42372 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jdGWR-0003Sq-Dc for submit@debbugs.gnu.org; Mon, 25 May 2020 13:04:20 -0400 Original-Received: from lists.gnu.org ([209.51.188.17]:52426) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jdGWP-0003Si-Hn for submit@debbugs.gnu.org; Mon, 25 May 2020 13:04:18 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:37890) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jdGWI-0005AE-J9 for bug-gnu-emacs@gnu.org; Mon, 25 May 2020 13:04:17 -0400 Original-Received: from mail-wm1-x32c.google.com ([2a00:1450:4864:20::32c]:39426) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1jdGWG-00054i-6Y for bug-gnu-emacs@gnu.org; Mon, 25 May 2020 13:04:10 -0400 Original-Received: by mail-wm1-x32c.google.com with SMTP id y5so593484wmj.4 for ; Mon, 25 May 2020 10:04:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:mime-version; bh=f0d/Jf19r2JndToBxQ/yBvzr0gXmEWzs0LKNcm6ssos=; b=rfMGkpdKseHquoZBd4MErL9Yu47yn0ehTT/xewGKQDNXnZ+AdCFu+6ZxVOZiehBNjy /PcQ5zL0gwaZsVBcAYuMgAPujTy0XW2WQlJcQvi5B4GQYbOiUi7uGSMZsFI9BNMQqwsp +2aaWwnhJtT+zDRKkDnK/VZEaZb+QZBj8F2cbRryClv7EK+UFkD+6Rw4lvFF3K+yEn2t UKbYGeY5m7YeFprmjL3CuTgj5S1pZ3GEP6zxd723AM/t8SJXn5nmvMQZSD6fjnW13ztA 6rsu4I0AdPadjd9V/nxQTh3wwSlOXTMVazn5k5W8ZyV0+K6PVHJC9m7WVzYf6z3fp4HR Q0CA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:mime-version; bh=f0d/Jf19r2JndToBxQ/yBvzr0gXmEWzs0LKNcm6ssos=; b=ZHHLasaKklcRsdT4x8PoaX3LDM1JjpxVGyC1sqSc6k3dSznlbL+896Mt51Ddqgppta VUx02W65ZMQbyOohgxz+tx2jS1xrMbbiuKHZrEfsnWFhkdGAXy1H7u1mgycpP6eJUjRT F7qxlPzbwOLLCjxxTqV+eBwCC/JBhuWD4m1bNabh97DRFMoKThYN79pMsaII7sTGQ49N 2LNemFDEFLE4SHnCBR31rzXyVOdAC+QCncJZqgou5XHn0Y1HaRrsn953/0Xv74ZRBIER VLzLBAMN/CvVpq+zH8GER4hxAgnDYxSRxv0vZREdfzo8imSeQlmvx6k2NVE4o/2os2c6 FmQA== X-Gm-Message-State: AOAM531uTTlo5qJNgpHfvCxjBnQyLpfXW4xuin2j4ci2zkSvljlBJ9RA UOFJnpik0yjq48ImiN2tNsh9c4P04pE= X-Google-Smtp-Source: ABdhPJwzmg4B362VxvdPJschxlR+0nugCgLU5PJM8zZnkdFqCrZ+waajI2mdBWD4h7TpKwsZLP3ZNQ== X-Received: by 2002:a7b:c253:: with SMTP id b19mr27188660wmj.110.1590426245575; Mon, 25 May 2020 10:04:05 -0700 (PDT) Original-Received: from krug ([89.180.145.189]) by smtp.gmail.com with ESMTPSA id y25sm1175544wmi.2.2020.05.25.10.04.03 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 25 May 2020 10:04:04 -0700 (PDT) Received-SPF: pass client-ip=2a00:1450:4864:20::32c; envelope-from=joaotavora@gmail.com; helo=mail-wm1-x32c.google.com X-detected-operating-system: by eggs.gnu.org: No matching host in p0f cache. That's all we know. X-Spam_score_int: -10 X-Spam_score: -1.1 X-Spam_bar: - X-Spam_report: (-1.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, FROM_EXCESS_BASE64=0.979, RCVD_IN_DNSWL_NONE=-0.0001, SPF_PASS=-0.001, URIBL_BLOCKED=0.001 autolearn=_AUTOLEARN X-Spam_action: no action X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.io gmane.emacs.bugs:180992 Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hi Stefan, Dmitry, Andrii and maintainers, Moving the discussion that started in https://github.com/joaotavora/eglot/pull/459 to the bug tracker, and attaching the two patches that contain what I think is a decent short-term solution to the eldoc/async problems. It makes eldoc-diagnostic-functions have a very similar interface to flymake-diagnostic-functions. Flymake's handling of the multiple backends and async is more sophisticated, and we could extend eldoc to try similarly heroic stuff, if we do find there's a demand for it. The main thing you probably want to read if `eldoc-documentation-functions`'s new docstring. This was tested summarily with Eglot, by the way, and seems to work OK. Enjoy! Jo=C3=A3o PS: How do I mark that the bug report contains a patch in the mail message itself? --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=0001-Better-handle-asynchronously-produced-eldoc-docstrin.patch >From 9ca84e5482b2e7ef40f80679ec508afb008293ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20T=C3=A1vora?= Date: Mon, 25 May 2020 16:39:40 +0100 Subject: [PATCH 1/2] Better handle asynchronously produced eldoc docstrings No longer do clients of eldoc need to call eldoc-message (an internal function) directly. They may return any non-nil, non-string value and call a callback afterwards. This enables eldoc.el to exert control over how (and crucially also when) to display the docstrings to the user. * lisp/emacs-lisp/eldoc.el (eldoc-documentation-functions): Overhaul docstring. (eldoc-documentation-compose, eldoc-documentation-default): Handle non-nil, non-string values of elements of eldoc-documentation-functions. Use eldoc--handle-multiline. (eldoc-print-current-symbol-info): Honour non-nil, non-string values returned by eldoc-documentation-callback. (eldoc--handle-multiline): New helper. (Version): Bump to 1.1.0. --- lisp/emacs-lisp/eldoc.el | 73 ++++++++++++++++++++++++++++++---------- 1 file changed, 56 insertions(+), 17 deletions(-) diff --git a/lisp/emacs-lisp/eldoc.el b/lisp/emacs-lisp/eldoc.el index ef5dbf8103..f5dcdb4ea0 100644 --- a/lisp/emacs-lisp/eldoc.el +++ b/lisp/emacs-lisp/eldoc.el @@ -5,7 +5,7 @@ ;; Author: Noah Friedman ;; Keywords: extensions ;; Created: 1995-10-06 -;; Version: 1.0.0 +;; Version: 1.1.0 ;; Package-Requires: ((emacs "26.3")) ;; This is a GNU ELPA :core package. Avoid functionality that is not @@ -338,12 +338,26 @@ eldoc-display-message-no-interference-p (defvar eldoc-documentation-functions nil - "Hook for functions to call to return doc string. -Each function should accept no arguments and return a one-line -string for displaying doc about a function etc. appropriate to -the context around point. It should return nil if there's no doc -appropriate for the context. Typically doc is returned if point -is on a function-like name or in its arg list. + "Hook of functions that produce doc strings. +Each hook function should accept no arguments and decide whether +to display a doc short string about the context around point. If +the decision and the doc string can be produced quickly, the hook +function should immediately return the doc string, or nil if +there's no doc appropriate for the context. Otherwise, if its +computation is expensive or can't be performed directly, the hook +function should save the value bound to +`eldoc-documentation-callback', and arrange for that callback +function to be asynchronously called at a later time, passing it +either nil or the desired doc string. The hook function should +then return a non-nil, non-string value. + +A current limitation of the asynchronous case is that it is only +guaranteed to work correctly if the value of +`eldoc-documentation-function' (notice the singular) is +`eldoc-documentation-default'. + +Typically doc is returned if point is on a function-like name or +in its arg list. Major modes should modify this hook locally, for example: (add-hook \\='eldoc-documentation-functions #\\='foo-mode-eldoc nil t) @@ -351,14 +365,18 @@ eldoc-documentation-functions taken into account if the major mode specific function does not return any documentation.") +(defun eldoc--handle-multiline (res) + "Helper for handling a bit of `eldoc-echo-area-use-multiline-p'." + (if eldoc-echo-area-use-multiline-p res + (truncate-string-to-width + res (1- (window-width (minibuffer-window)))))) + (defun eldoc-documentation-default () "Show first doc string for item at point. Default value for `eldoc-documentation-function'." (let ((res (run-hook-with-args-until-success 'eldoc-documentation-functions))) - (when res - (if eldoc-echo-area-use-multiline-p res - (truncate-string-to-width - res (1- (window-width (minibuffer-window)))))))) + (cond ((stringp res) (eldoc--handle-multiline res)) + (t res)))) (defun eldoc-documentation-compose () "Show multiple doc string results at once. @@ -368,13 +386,11 @@ eldoc-documentation-compose 'eldoc-documentation-functions (lambda (f) (let ((str (funcall f))) - (when str (push str res)) + (when (stringp str) (push str res)) nil))) (when res (setq res (mapconcat #'identity (nreverse res) ", ")) - (if eldoc-echo-area-use-multiline-p res - (truncate-string-to-width - res (1- (window-width (minibuffer-window)))))))) + (eldoc--handle-multiline res)))) (defcustom eldoc-documentation-function #'eldoc-documentation-default "Function to call to return doc string. @@ -408,6 +424,12 @@ eldoc--supported-p ;; there's some eldoc support in the current buffer. (local-variable-p 'eldoc-documentation-function)))) +;; this variable should be unbound, but that confuses +;; `describe-symbol' for some reason. +(defvar eldoc-documentation-callback nil + "Dynamically bound. Accessible to `eldoc-documentation-functions'. +See that function for details.") + (defun eldoc-print-current-symbol-info () "Print the text produced by `eldoc-documentation-function'." ;; This is run from post-command-hook or some idle timer thing, @@ -417,11 +439,28 @@ eldoc-print-current-symbol-info ;; Erase the last message if we won't display a new one. (when eldoc-last-message (eldoc-message nil)) - (let ((non-essential t)) + (let ((non-essential t) + (buffer (current-buffer))) ;; Only keep looking for the info as long as the user hasn't ;; requested our attention. This also locally disables inhibit-quit. (while-no-input - (eldoc-message (funcall eldoc-documentation-function))))))) + (let* + ((waiting-for-callback nil) + (eldoc-documentation-callback + (lambda (string) + (with-current-buffer buffer + ;; JT@2020-05-25: Currently, we expect one single + ;; docstring from the client, we silently swallow + ;; anything the client unexpectedly gives us, + ;; including updates. This could change. + (when waiting-for-callback + (eldoc-message (eldoc--handle-multiline string)) + (setq waiting-for-callback nil))))) + (res + (funcall eldoc-documentation-function))) + (cond ((stringp res) (eldoc-message res)) + (res (setq waiting-for-callback t)) + (t (eldoc-message nil))))))))) ;; If the entire line cannot fit in the echo area, the symbol name may be ;; truncated or eliminated entirely from the output to make room for the -- 2.20.1 --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=0002-Adjust-eldoc-documentation-functions-protocol-for-be.patch >From a6ba9972ee0e3305c7b41fd380a88dd18a6626a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20T=C3=A1vora?= Date: Mon, 25 May 2020 17:38:23 +0100 Subject: [PATCH 2/2] Adjust eldoc-documentation-functions protocol for better async Instead of exposing a eldoc-documentation-callback variable to clients, just pass it the callback as the first argument. * lisp/emacs-lisp/eldoc.el (eldoc-documentation-functions): Rewrite docstring. (eldoc-documentation-default, eldoc-documentation-compose): Use internal eldoc--callback. (eldoc-documentation-callback). (eldoc---callback): Rename from eldoc-documentation-callback. (eldoc-print-current-symbol-info): Bind eldoc--callback. * lisp/hexl.el (hexl-print-current-point-info): Adjust to new eldoc-documentation-functions protocol. * lisp/progmodes/cfengine.el (cfengine3-documentation-function): Adjust to new eldoc-documentation-functions protocol. * lisp/progmodes/elisp-mode.el (elisp-eldoc-documentation-function): Adjust to new eldoc-documentation-functions protocol. * lisp/progmodes/octave.el (octave-eldoc-function): Adjust to new eldoc-documentation-functions protocol. * lisp/progmodes/python.el (python-eldoc-function): Adjust to new eldoc-documentation-functions protocol. --- lisp/emacs-lisp/eldoc.el | 45 ++++++++++++++++++------------------ lisp/hexl.el | 2 +- lisp/progmodes/cfengine.el | 2 +- lisp/progmodes/elisp-mode.el | 6 +++-- lisp/progmodes/octave.el | 4 ++-- lisp/progmodes/python.el | 2 +- 6 files changed, 32 insertions(+), 29 deletions(-) diff --git a/lisp/emacs-lisp/eldoc.el b/lisp/emacs-lisp/eldoc.el index f5dcdb4ea0..a4e1e460ac 100644 --- a/lisp/emacs-lisp/eldoc.el +++ b/lisp/emacs-lisp/eldoc.el @@ -339,22 +339,22 @@ eldoc-display-message-no-interference-p (defvar eldoc-documentation-functions nil "Hook of functions that produce doc strings. -Each hook function should accept no arguments and decide whether -to display a doc short string about the context around point. If -the decision and the doc string can be produced quickly, the hook -function should immediately return the doc string, or nil if -there's no doc appropriate for the context. Otherwise, if its -computation is expensive or can't be performed directly, the hook -function should save the value bound to -`eldoc-documentation-callback', and arrange for that callback -function to be asynchronously called at a later time, passing it -either nil or the desired doc string. The hook function should -then return a non-nil, non-string value. - -A current limitation of the asynchronous case is that it is only -guaranteed to work correctly if the value of -`eldoc-documentation-function' (notice the singular) is -`eldoc-documentation-default'. +Each hook function should accept at least one argument CALLBACK +and decide whether to display a doc short string about the +context around point. If the decision and the doc string can be +produced quickly, the hook function can ignore CALLBACK and +immediately return the doc string, or nil if there's no doc +appropriate for the context. Otherwise, if its computation is +expensive or can't be performed directly, the hook function +should arrange for CALLBACK to be asynchronously called at a +later time, passing it either nil or the desired doc string. The +hook function should then return a non-nil, non-string value. + +Note that this hook is only in effect if the value of +`eldoc-documentation-function' (notice the singular) is bound to +one of its pre-set values. Furthermore, the asynchronous +mechanism described above is only guaranteed to work correctly if +that value is `eldoc-documentation-default'. Typically doc is returned if point is on a function-like name or in its arg list. @@ -374,7 +374,9 @@ eldoc--handle-multiline (defun eldoc-documentation-default () "Show first doc string for item at point. Default value for `eldoc-documentation-function'." - (let ((res (run-hook-with-args-until-success 'eldoc-documentation-functions))) + (let ((res (run-hook-with-args-until-success + 'eldoc-documentation-functions + eldoc--callback))) (cond ((stringp res) (eldoc--handle-multiline res)) (t res)))) @@ -385,7 +387,7 @@ eldoc-documentation-compose (run-hook-wrapped 'eldoc-documentation-functions (lambda (f) - (let ((str (funcall f))) + (let ((str (funcall f eldoc--callback))) (when (stringp str) (push str res)) nil))) (when res @@ -426,9 +428,8 @@ eldoc--supported-p ;; this variable should be unbound, but that confuses ;; `describe-symbol' for some reason. -(defvar eldoc-documentation-callback nil - "Dynamically bound. Accessible to `eldoc-documentation-functions'. -See that function for details.") +(defvar eldoc---callback nil + "Dynamically bound. Passed to `eldoc-documentation-functions'.") (defun eldoc-print-current-symbol-info () "Print the text produced by `eldoc-documentation-function'." @@ -446,7 +447,7 @@ eldoc-print-current-symbol-info (while-no-input (let* ((waiting-for-callback nil) - (eldoc-documentation-callback + (eldoc--callback (lambda (string) (with-current-buffer buffer ;; JT@2020-05-25: Currently, we expect one single diff --git a/lisp/hexl.el b/lisp/hexl.el index cf7118f208..38eca77e26 100644 --- a/lisp/hexl.el +++ b/lisp/hexl.el @@ -515,7 +515,7 @@ hexl-current-address (message "Current address is %d/0x%08x" hexl-address hexl-address)) hexl-address)) -(defun hexl-print-current-point-info () +(defun hexl-print-current-point-info (&rest _ignored) "Return current hexl-address in string. This function is intended to be used as eldoc callback." (let ((addr (hexl-current-address))) diff --git a/lisp/progmodes/cfengine.el b/lisp/progmodes/cfengine.el index f25b3cb9e2..9a6d81ce06 100644 --- a/lisp/progmodes/cfengine.el +++ b/lisp/progmodes/cfengine.el @@ -1294,7 +1294,7 @@ cfengine3-make-syntax-cache 'symbols)) syntax))) -(defun cfengine3-documentation-function () +(defun cfengine3-documentation-function (&rest _ignored) "Document CFengine 3 functions around point. Intended as the value of `eldoc-documentation-function', which see. Use it by enabling `eldoc-mode'." diff --git a/lisp/progmodes/elisp-mode.el b/lisp/progmodes/elisp-mode.el index d37eb8c152..d7865a7319 100644 --- a/lisp/progmodes/elisp-mode.el +++ b/lisp/progmodes/elisp-mode.el @@ -1402,8 +1402,10 @@ elisp--eldoc-last-data or argument string for functions. 2 - `function' if function args, `variable' if variable documentation.") -(defun elisp-eldoc-documentation-function () - "`eldoc-documentation-function' (which see) for Emacs Lisp." +(defun elisp-eldoc-documentation-function (_ignored &rest _also-ignored) + "Contextual documentation function for Emacs Lisp. +Intended to be placed in `eldoc-documentation-functions' (which +see)." (let ((current-symbol (elisp--current-symbol)) (current-fnsym (elisp--fnsym-in-current-sexp))) (cond ((null current-fnsym) diff --git a/lisp/progmodes/octave.el b/lisp/progmodes/octave.el index 352c1810d1..2cf305c404 100644 --- a/lisp/progmodes/octave.el +++ b/lisp/progmodes/octave.el @@ -1639,8 +1639,8 @@ octave-eldoc-function-signatures (nreverse result))))) (cdr octave-eldoc-cache)) -(defun octave-eldoc-function () - "A function for `eldoc-documentation-function' (which see)." +(defun octave-eldoc-function (&rest _ignored) + "A function for `eldoc-documentation-functions' (which see)." (when (inferior-octave-process-live-p) (let* ((ppss (syntax-ppss)) (paren-pos (cadr ppss)) diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el index 1ca9f01963..404a67ba9f 100644 --- a/lisp/progmodes/python.el +++ b/lisp/progmodes/python.el @@ -4571,7 +4571,7 @@ python-eldoc-function-timeout-permanent :type 'boolean :version "25.1") -(defun python-eldoc-function () +(defun python-eldoc-function (&rest _ignored) "`eldoc-documentation-function' for Python. For this to work as best as possible you should call `python-shell-send-buffer' from time to time so context in -- 2.20.1 --=-=-=--