bug-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#22661: 25.0.91; python.el electric-indent misbehaviour with 'else:'


From: npostavs
Subject: bug#22661: 25.0.91; python.el electric-indent misbehaviour with 'else:' and nested 'if:'
Date: Sun, 22 Jan 2017 18:08:03 -0500
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/25.1 (gnu/linux)

Hong Xu <hong@topbug.net> writes:

> 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.

Looks good, with a minor adjustment I suggested below.  Adding a test
would be nice too.

> ---
>  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))

I think it's better to maximize the range of save-match-data, i.e., have
it cover as much code as practical between the place that sets the match
data and the place that uses the it, rather than minimizing the range so
that it only covers functions which modify match data (because the
default assumption in Emacs is that functions may modify match data
unless they say otherwise).  In this case, I would put it around the
`and` in the line above.

>                             (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)





reply via email to

[Prev in Thread] Current Thread [Next in Thread]