aboutsummaryrefslogtreecommitdiffstats
path: root/lisp/progmodes/python.el
diff options
context:
space:
mode:
authorHong Xu2016-12-12 17:55:25 -0800
committerNoam Postavsky2017-01-26 20:14:19 -0500
commit7cb7a582f44db94292709d35f4f5474f891f03b0 (patch)
treee0ab66d0b9409565128b65e01061dbd061f48502 /lisp/progmodes/python.el
parent3485c1693efb709cfc15023d9b38978278731a32 (diff)
downloademacs-7cb7a582f44db94292709d35f4f5474f891f03b0.tar.gz
emacs-7cb7a582f44db94292709d35f4f5474f891f03b0.zip
python-mode: Fix detection for opening blocks.
* python.el (python-info-dedenter-opening-block-positions): There can't be any back-indented lines between an opening block and the current line. * python-tests.el (python-indent-electric-colon-4): Add an indent test case where there is one-more indented previous opening block.
Diffstat (limited to 'lisp/progmodes/python.el')
-rw-r--r--lisp/progmodes/python.el20
1 files changed, 18 insertions, 2 deletions
diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el
index d8262dd0a75..90b5e4e0dc6 100644
--- a/lisp/progmodes/python.el
+++ b/lisp/progmodes/python.el
@@ -4693,7 +4693,8 @@ likely an invalid python file."
4693 (let ((dedenter-pos (python-info-dedenter-statement-p))) 4693 (let ((dedenter-pos (python-info-dedenter-statement-p)))
4694 (when dedenter-pos 4694 (when dedenter-pos
4695 (goto-char dedenter-pos) 4695 (goto-char dedenter-pos)
4696 (let* ((pairs '(("elif" "elif" "if") 4696 (let* ((cur-line (line-beginning-position))
4697 (pairs '(("elif" "elif" "if")
4697 ("else" "if" "elif" "except" "for" "while") 4698 ("else" "if" "elif" "except" "for" "while")
4698 ("except" "except" "try") 4699 ("except" "except" "try")
4699 ("finally" "else" "except" "try"))) 4700 ("finally" "else" "except" "try")))
@@ -4709,7 +4710,22 @@ likely an invalid python file."
4709 (let ((indentation (current-indentation))) 4710 (let ((indentation (current-indentation)))
4710 (when (and (not (memq indentation collected-indentations)) 4711 (when (and (not (memq indentation collected-indentations))
4711 (or (not collected-indentations) 4712 (or (not collected-indentations)
4712 (< indentation (apply #'min collected-indentations)))) 4713 (< indentation (apply #'min collected-indentations)))
4714 ;; There must be no line with indentation
4715 ;; smaller than `indentation' (except for
4716 ;; blank lines) between the found opening
4717 ;; block and the current line, otherwise it
4718 ;; is not an opening block.
4719 (save-excursion
4720 (forward-line)
4721 (let ((no-back-indent t))
4722 (save-match-data
4723 (while (and (< (point) cur-line)
4724 (setq no-back-indent
4725 (or (> (current-indentation) indentation)
4726 (python-info-current-line-empty-p))))
4727 (forward-line)))
4728 no-back-indent)))
4713 (setq collected-indentations 4729 (setq collected-indentations
4714 (cons indentation collected-indentations)) 4730 (cons indentation collected-indentations))
4715 (when (member (match-string-no-properties 0) 4731 (when (member (match-string-no-properties 0)