From b9b742e15174de6abe5134427964fe4e0f852461 Mon Sep 17 00:00:00 2001 From: Hong Xu Date: Mon, 12 Dec 2016 17:55:25 -0800 Subject: [PATCH] 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. --- lisp/progmodes/python.el | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el index 306402d8e3b4..ae9b0890cfc2 100644 --- a/lisp/progmodes/python.el +++ b/lisp/progmodes/python.el @@ -4659,7 +4659,8 @@ python-info-dedenter-opening-block-positions (let ((dedenter-pos (python-info-dedenter-statement-p))) (when dedenter-pos (goto-char dedenter-pos) - (let* ((pairs '(("elif" "elif" "if") + (let* ((cur-line (line-beginning-position)) + (pairs '(("elif" "elif" "if") ("else" "if" "elif" "except" "for" "while") ("except" "except" "try") ("finally" "else" "except" "try"))) @@ -4675,7 +4676,22 @@ python-info-dedenter-opening-block-positions (let ((indentation (current-indentation))) (when (and (not (memq indentation collected-indentations)) (or (not collected-indentations) - (< indentation (apply #'min collected-indentations)))) + (< indentation (apply #'min collected-indentations))) + ;; There must be no line with indentation + ;; smaller than `indentation' (except for + ;; blank lines) between the found opening + ;; block and the current line, otherwise it + ;; is not an opening block. + (save-excursion + (forward-line) + (let ((no-back-indent t)) + (while (and (< (point) cur-line) + (setq no-back-indent + (or (> (current-indentation) indentation) + (save-match-data + (python-info-current-line-empty-p))))) + (forward-line)) + no-back-indent))) (setq collected-indentations (cons indentation collected-indentations)) (when (member (match-string-no-properties 0) -- 2.1.4