From 35d0a2e0a767838c24d5853be798313aed7a42df Mon Sep 17 00:00:00 2001 From: kobarity Date: Sat, 16 Jul 2022 18:14:15 +0200 Subject: [PATCH] Fix python navigation problem with an empty line in nested defun * lisp/progmodes/python.el (python-nav--beginning-of-defun): Fix bug when point is on an empty line (bug#56600). --- lisp/progmodes/python.el | 29 +++++++++++++----------- test/lisp/progmodes/python-tests.el | 34 +++++++++++++++++++++++++++-- 2 files changed, 48 insertions(+), 15 deletions(-) diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el index 1c99937c4b9..f31832fec9c 100644 --- a/lisp/progmodes/python.el +++ b/lisp/progmodes/python.el @@ -1454,21 +1454,24 @@ With positive ARG search backwards, else search forwards." (line-beg-pos (line-beginning-position)) (line-content-start (+ line-beg-pos (current-indentation))) (pos (point-marker)) - (min-indentation (+ (current-indentation) - (if (python-info-looking-at-beginning-of-defun) - python-indent-offset 0))) + (min-indentation (if (python-info-current-line-empty-p) + most-positive-fixnum + (current-indentation))) (body-indentation (and (> arg 0) - (save-excursion - (while (and - (or (not (python-info-looking-at-beginning-of-defun)) - (>= (current-indentation) min-indentation)) - (setq min-indentation - (min min-indentation (current-indentation))) - (python-nav-backward-block))) - (or (and (python-info-looking-at-beginning-of-defun) - (+ (current-indentation) python-indent-offset)) - 0)))) + (or (and (python-info-looking-at-beginning-of-defun) + (+ (current-indentation) python-indent-offset)) + (save-excursion + (while + (and + (python-nav-backward-block) + (or (not (python-info-looking-at-beginning-of-defun)) + (>= (current-indentation) min-indentation)) + (setq min-indentation + (min min-indentation (current-indentation))))) + (or (and (python-info-looking-at-beginning-of-defun) + (+ (current-indentation) python-indent-offset)) + 0))))) (found (progn (when (and (python-info-looking-at-beginning-of-defun nil t) diff --git a/test/lisp/progmodes/python-tests.el b/test/lisp/progmodes/python-tests.el index 92c20288c8e..b2cccdd9569 100644 --- a/test/lisp/progmodes/python-tests.el +++ b/test/lisp/progmodes/python-tests.el @@ -1876,7 +1876,7 @@ class C(object): (beginning-of-line) (point)))) ;; Nested defuns should be skipped. - (python-tests-look-at "return a" -1) + (forward-line -1) (should (= (save-excursion (python-nav-beginning-of-defun) (point)) @@ -1885,6 +1885,15 @@ class C(object): (beginning-of-line) (point)))) ;; Defuns on same levels should be respected. + (python-tests-look-at "if True:" -1) + (forward-line -1) + (should (= (save-excursion + (python-nav-beginning-of-defun) + (point)) + (save-excursion + (python-tests-look-at "def a():" -1) + (beginning-of-line) + (point)))) (python-tests-look-at "def a():" -1) (should (= (save-excursion (python-nav-beginning-of-defun) @@ -1893,8 +1902,16 @@ class C(object): (python-tests-look-at "def b():" -1) (beginning-of-line) (point)))) - ;; Jump to a top level defun. + ;; Jump to an upper level defun. (python-tests-look-at "def b():" -1) + (should (= (save-excursion + (python-nav-beginning-of-defun) + (point)) + (save-excursion + (python-tests-look-at "def m(self):" -1) + (beginning-of-line) + (point)))) + (forward-line -1) (should (= (save-excursion (python-nav-beginning-of-defun) (point)) @@ -2009,6 +2026,15 @@ class C(object): (python-tests-look-at "def c(self):") (forward-line -1) (point)))) + (should (= (save-excursion + (python-tests-look-at "def b():") + (forward-line -1) + (python-nav-end-of-defun) + (point)) + (save-excursion + (python-tests-look-at "def c(self):") + (forward-line -1) + (point)))) (should (= (save-excursion (python-tests-look-at "def b():") (python-nav-end-of-defun) @@ -2017,6 +2043,10 @@ class C(object): (python-tests-look-at "def b():") (forward-line 2) (point)))) + (should (not (save-excursion + (python-tests-look-at "def a():") + (forward-line -1) + (python-nav-end-of-defun)))) (should (= (save-excursion (python-tests-look-at "def c(self):") (python-nav-end-of-defun) -- 2.39.2