On 12/14/2012 3:40 AM, Daniel Colascione wrote: > Some python-mode operations slow down noticeably when the region being edited > contains an unclosed bracket or string: these constructs lead to python-mode > scanning the entire remainder of the buffer, and this scan appears to take time > O(nr_lines^2). When which-func mode is enabled, this slowness renders Emacs > unusable, since we'll call python-info-current-defun frequently in order to > update the modeline, and this function will take several seconds to complete. > > The following patch appears to remedy the problem without breaking anythig. Here's a bugfixed patch. Review would be appreciated. === modified file 'lisp/ChangeLog' --- lisp/ChangeLog 2012-12-10 18:33:59 +0000 +++ lisp/ChangeLog 2012-12-15 06:38:59 +0000 @@ -1,3 +1,12 @@ +2012-12-15 Daniel Colascione + + * progmodes/python.el (python-nav-end-of-statement): Don't loop forever. + +2012-12-14 Daniel Colascione + + * progmodes/python.el (python-nav-end-of-statement): Rewrite in + order to improve efficiency. + 2012-12-10 Jambunathan K * hi-lock.el: Refine the choice of default face. === modified file 'lisp/progmodes/python.el' --- lisp/progmodes/python.el 2012-11-27 03:10:32 +0000 +++ lisp/progmodes/python.el 2012-12-15 06:28:38 +0000 @@ -1184,13 +1184,23 @@ (defun python-nav-end-of-statement () "Move to end of current statement." (interactive "^") - (while (and (goto-char (line-end-position)) - (not (eobp)) - (when (or - (python-info-line-ends-backslash-p) - (python-syntax-context 'string) - (python-syntax-context 'paren)) - (forward-line 1)))) + + (let (string-start bs-pos) + (while (and (goto-char (line-end-position)) + (not (eobp)) + (cond ((setq string-start (python-syntax-context 'string)) + (goto-char string-start) + (let (forward-sexp-function) + (forward-sexp))) + ((python-syntax-context 'paren) + ;; The statement won't end before we've escaped + ;; at least one level of parenthesis. + (condition-case err + (goto-char (scan-lists (point) 1 -1)) + (scan-error (goto-char (nth 3 err))))) + ((setq bs-pos (python-info-line-ends-backslash-p)) + (goto-char bs-pos) + (forward-line 1)))))) (point-marker)) (defun python-nav-backward-statement (&optional arg)