From 555fb47d0c3061346c2792e97206a0d64dd1e578 Mon Sep 17 00:00:00 2001 From: Joel Rosdahl Date: Sun, 12 Feb 2017 16:10:47 +0100 Subject: [PATCH] python-mode: Fix electric indent bug after dedenting colon This fixes bug #22663 ("25.0.91; python.el electric-indent misbehaviour with 'except:'"). Note that the bug is not restricted to "except:" but affects all statements that are dedented by an electric colon. For instance, entering a colon after "else" in if do: something() else outside results in if do: something() else: outside before the bug fix but if do: something() else: outside after the bug fix. --- lisp/progmodes/python.el | 19 ++++++++++--------- test/lisp/progmodes/python-tests.el | 3 +++ 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el index 90b5e4e..467ac08 100644 --- a/lisp/progmodes/python.el +++ b/lisp/progmodes/python.el @@ -1286,16 +1286,17 @@ python-indent-post-self-insert-function (not (equal ?: (char-before (1- (point))))) (not (python-syntax-comment-or-string-p))) ;; Just re-indent dedenters - (let ((dedenter-pos (python-info-dedenter-statement-p)) - (current-pos (point))) + (let ((dedenter-pos (python-info-dedenter-statement-p))) (when dedenter-pos - (save-excursion - (goto-char dedenter-pos) - (python-indent-line) - (unless (= (line-number-at-pos dedenter-pos) - (line-number-at-pos current-pos)) - ;; Reindent region if this is a multiline statement - (python-indent-region dedenter-pos current-pos))))))))) + (let ((start (copy-marker dedenter-pos)) + (end (point-marker))) + (save-excursion + (goto-char start) + (python-indent-line) + (unless (= (line-number-at-pos start) + (line-number-at-pos end)) + ;; Reindent region if this is a multiline statement + (python-indent-region start end)))))))))) ;;; Mark diff --git a/test/lisp/progmodes/python-tests.el b/test/lisp/progmodes/python-tests.el index 1e6b867..e911921 100644 --- a/test/lisp/progmodes/python-tests.el +++ b/test/lisp/progmodes/python-tests.el @@ -1130,10 +1130,13 @@ python-tests-visible-string if do: something() else +outside " (python-tests-look-at "else") (goto-char (line-end-position)) (python-tests-self-insert ":") + (should (= (current-indentation) 0)) + (python-tests-look-at "outside") (should (= (current-indentation) 0)))) (ert-deftest python-indent-electric-colon-3 () -- 2.7.4