From 2155973e5e35d11a50ce6773bb34d5df68beea57 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Fabi=C3=A1n=20Ezequiel=20Gallina?= Date: Sat, 7 Feb 2015 18:39:07 -0300 Subject: [PATCH] python.el: Keep eldoc visible while typing args. Fixes: debbugs:19637 * lisp/progmodes/python.el (python-eldoc--get-symbol-at-point): New function. (python-eldoc--get-doc-at-point, python-eldoc-at-point): Use it. * test/automated/python-tests.el (python-eldoc--get-symbol-at-point-1) (python-eldoc--get-symbol-at-point-2) (python-eldoc--get-symbol-at-point-3) (python-eldoc--get-symbol-at-point-4): New tests. --- lisp/ChangeLog | 8 ++++++ lisp/progmodes/python.el | 20 ++++++++++++--- test/ChangeLog | 8 ++++++ test/automated/python-tests.el | 57 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 90 insertions(+), 3 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 655ae574468..34d401379bb 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,5 +1,13 @@ 2015-02-07 Fabián Ezequiel Gallina + python.el: Keep eldoc visible while typing args. (Bug#19637) + + * progmodes/python.el (python-eldoc--get-symbol-at-point): New + function. + (python-eldoc--get-doc-at-point, python-eldoc-at-point): Use it. + +2015-02-07 Fabián Ezequiel Gallina + Fix hideshow integration. (Bug#19761) * progmodes/python.el diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el index 3399429538f..72a76a461a6 100644 --- a/lisp/progmodes/python.el +++ b/lisp/progmodes/python.el @@ -3921,15 +3921,29 @@ See `python-check-command' for the default." :type 'string :group 'python) +(defun python-eldoc--get-symbol-at-point () + "Get the current symbol for eldoc. +Returns the current symbol handling point within arguments." + (save-excursion + (let ((start (python-syntax-context 'paren))) + (when start + (goto-char start)) + (when (or start + (eobp) + (memq (char-syntax (char-after)) '(?\ ?-))) + ;; Try to adjust to closest symbol if not in one. + (python-util-forward-comment -1))) + (python-info-current-symbol t))) + (defun python-eldoc--get-doc-at-point (&optional force-input force-process) "Internal implementation to get documentation at point. -If not FORCE-INPUT is passed then what `python-info-current-symbol' +If not FORCE-INPUT is passed then what `python-eldoc--get-symbol-at-point' returns will be used. If not FORCE-PROCESS is passed what `python-shell-get-process' returns is used." (let ((process (or force-process (python-shell-get-process)))) (when process (let ((input (or force-input - (python-info-current-symbol t)))) + (python-eldoc--get-symbol-at-point)))) (and input ;; Prevent resizing the echo area when iPython is ;; enabled. Bug#18794. @@ -3949,7 +3963,7 @@ inferior Python process is updated properly." "Get help on SYMBOL using `help'. Interactively, prompt for symbol." (interactive - (let ((symbol (python-info-current-symbol t)) + (let ((symbol (python-eldoc--get-symbol-at-point)) (enable-recursive-minibuffers t)) (list (read-string (if symbol (format "Describe symbol (default %s): " symbol) diff --git a/test/ChangeLog b/test/ChangeLog index b1e21511d65..ff02bd6a25d 100644 --- a/test/ChangeLog +++ b/test/ChangeLog @@ -1,6 +1,14 @@ 2015-02-07 Fabián Ezequiel Gallina * automated/python-tests.el + (python-eldoc--get-symbol-at-point-1) + (python-eldoc--get-symbol-at-point-2) + (python-eldoc--get-symbol-at-point-3) + (python-eldoc--get-symbol-at-point-4): New tests. + +2015-02-07 Fabián Ezequiel Gallina + + * automated/python-tests.el (python-tests-visible-string): New function. (python-parens-electric-indent-1) (python-triple-quote-pairing): Fix indentation, move require calls. diff --git a/test/automated/python-tests.el b/test/automated/python-tests.el index e5fcda95012..47e2a6e8195 100644 --- a/test/automated/python-tests.el +++ b/test/automated/python-tests.el @@ -2943,6 +2943,63 @@ class Foo(models.Model): ;;; Eldoc +(ert-deftest python-eldoc--get-symbol-at-point-1 () + "Test paren handling." + (python-tests-with-temp-buffer + " +map(xx +map(codecs.open('somefile' +" + (python-tests-look-at "ap(xx") + (should (string= (python-eldoc--get-symbol-at-point) "map")) + (goto-char (line-end-position)) + (should (string= (python-eldoc--get-symbol-at-point) "map")) + (python-tests-look-at "('somefile'") + (should (string= (python-eldoc--get-symbol-at-point) "map")) + (goto-char (line-end-position)) + (should (string= (python-eldoc--get-symbol-at-point) "codecs.open")))) + +(ert-deftest python-eldoc--get-symbol-at-point-2 () + "Ensure self is replaced with the class name." + (python-tests-with-temp-buffer + " +class TheClass: + + def some_method(self, n): + return n + + def other(self): + return self.some_method(1234) + +" + (python-tests-look-at "self.some_method") + (should (string= (python-eldoc--get-symbol-at-point) + "TheClass.some_method")) + (python-tests-look-at "1234)") + (should (string= (python-eldoc--get-symbol-at-point) + "TheClass.some_method")))) + +(ert-deftest python-eldoc--get-symbol-at-point-3 () + "Ensure symbol is found when point is at end of buffer." + (python-tests-with-temp-buffer + " +some_symbol + +" + (goto-char (point-max)) + (should (string= (python-eldoc--get-symbol-at-point) + "some_symbol")))) + +(ert-deftest python-eldoc--get-symbol-at-point-4 () + "Ensure symbol is found when point is at whitespace." + (python-tests-with-temp-buffer + " +some_symbol some_other_symbol +" + (python-tests-look-at " some_other_symbol") + (should (string= (python-eldoc--get-symbol-at-point) + "some_symbol")))) + ;;; Imenu -- 2.11.4.GIT