summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJules Tamagnan <jtamagnan@gmail.com>2016-06-10 12:08:29 +0300
committerEli Zaretskii <eliz@gnu.org>2016-06-10 12:08:29 +0300
commit66d556b5187d768bbd233513b54dcb4beaa90c6d (patch)
treeaeca525a52d33c82892d5d7c161f5f377bf7d7fc
parentd59bcbc00bc70f101492a80ea48964b2dd5d337d (diff)
downloademacs-66d556b5187d768bbd233513b54dcb4beaa90c6d.tar.gz
Fix eldoc-related freezes in python mode
* lisp/progmodes/python.el (python-eldoc-get-doc): New defvar. (python-eldoc-function-timeout) (python-eldoc-function-timeout-permanent): New defcustoms. (python-eldoc-function): If python-eldoc--get-doc-at-point times out, effectively turn off ElDoc in current buffer. (Bug#23609)
-rw-r--r--lisp/progmodes/python.el39
1 files changed, 37 insertions, 2 deletions
diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el
index 41d3e1c7310..49f7bcf5df9 100644
--- a/lisp/progmodes/python.el
+++ b/lisp/progmodes/python.el
@@ -4292,12 +4292,47 @@ returns will be used. If not FORCE-PROCESS is passed what
(unless (zerop (length docstring))
docstring)))))
+(defvar-local python-eldoc-get-doc t
+ "Non-nil means eldoc should fetch the documentation
+ automatically. Set to nil by `python-eldoc-function' if
+ `python-eldoc-function-timeout-permanent' is non-nil and
+ `python-eldoc-function' times out.")
+
+(defcustom python-eldoc-function-timeout 1
+ "Timeout for `python-eldoc-function' in seconds."
+ :group 'python
+ :type 'integer
+ :version "25.1")
+
+(defcustom python-eldoc-function-timeout-permanent t
+ "Non-nil means that when `python-eldoc-function' times out
+`python-eldoc-get-doc' will be set to nil"
+ :group 'python
+ :type 'boolean
+ :version "25.1")
+
(defun python-eldoc-function ()
"`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
-inferior Python process is updated properly."
- (python-eldoc--get-doc-at-point))
+inferior Python process is updated properly.
+
+If `python-eldoc-function-timeout' seconds elapse before this
+function returns then if
+`python-eldoc-function-timeout-permanent' is non-nil
+`python-eldoc-get-doc' will be set to nil and eldoc will no
+longer return the documentation at the point automatically.
+
+Set `python-eldoc-get-doc' to t to reenable eldoc documentation
+fetching"
+ (when python-eldoc-get-doc
+ (with-timeout (python-eldoc-function-timeout
+ (if python-eldoc-function-timeout-permanent
+ (progn
+ (message "Eldoc echo-area display muted in this buffer, see `python-eldoc-function'")
+ (setq python-eldoc-get-doc nil))
+ (message "`python-eldoc-function' timed out, see `python-eldoc-function-timeout'")))
+ (python-eldoc--get-doc-at-point))))
(defun python-eldoc-at-point (symbol)
"Get help on SYMBOL using `help'.