python.el: Fix electric colon behavior

* lisp/progmodes/python.el (python-indent-post-self-insert-function):
Make colon to re-indent only for dedenters, handling
multiline-statements gracefully.

* test/automated/python-tests.el (python-indent-electric-colon-2)
(python-indent-electric-colon-3): New tests.
This commit is contained in:
Fabián Ezequiel Gallina 2014-12-22 02:24:42 -03:00
parent 936d5e5bb6
commit 749813e9d4
4 changed files with 56 additions and 6 deletions

View file

@ -1,3 +1,9 @@
2014-12-22 Fabián Ezequiel Gallina <fgallina@gnu.org>
* progmodes/python.el (python-indent-post-self-insert-function):
Make colon to re-indent only for dedenters, handling
multiline-statements gracefully.
2014-12-21 Michael Albinus <michael.albinus@gmx.de>
* net/tramp.el (tramp-handle-insert-file-contents):

View file

@ -1175,12 +1175,18 @@ the line will be re-indented automatically if needed."
(eolp)
;; Avoid re-indenting on extra colon
(not (equal ?: (char-before (1- (point)))))
(not (python-syntax-comment-or-string-p))
;; Never re-indent at beginning of defun
(not (save-excursion
(python-nav-beginning-of-statement)
(python-info-looking-at-beginning-of-defun))))
(python-indent-line)))))
(not (python-syntax-comment-or-string-p)))
;; Just re-indent dedenters
(let ((dedenter-pos (python-info-dedenter-statement-p))
(current-pos (point)))
(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)))))))))
;;; Navigation

View file

@ -1,3 +1,8 @@
2014-12-22 Fabián Ezequiel Gallina <fgallina@gnu.org>
* automated/python-tests.el (python-indent-electric-colon-2)
(python-indent-electric-colon-3): New tests.
2014-12-14 João Távora <joaotavora@gmail.com>
* automated/electric-tests.el (autowrapping-7): Tests for

View file

@ -740,6 +740,39 @@ def b()
(python-tests-self-insert ":")
(should (= (current-indentation) 0))))
(ert-deftest python-indent-electric-colon-2 ()
"Test indentation case for dedenter."
(python-tests-with-temp-buffer
"
if do:
something()
else
"
(python-tests-look-at "else")
(goto-char (line-end-position))
(python-tests-self-insert ":")
(should (= (current-indentation) 0))))
(ert-deftest python-indent-electric-colon-3 ()
"Test indentation case for multi-line dedenter."
(python-tests-with-temp-buffer
"
if do:
something()
elif (this
and
that)
"
(python-tests-look-at "that)")
(goto-char (line-end-position))
(python-tests-self-insert ":")
(python-tests-look-at "elif" -1)
(should (= (current-indentation) 0))
(python-tests-look-at "and")
(should (= (current-indentation) 6))
(python-tests-look-at "that)")
(should (= (current-indentation) 6))))
(ert-deftest python-indent-region-1 ()
"Test indentation case from Bug#18843."
(let ((contents "