diff Misc/python-mode.el @ 7143:3f0be7de7ca5 legacy-trunk

(py-compute-indentation): In the most common case, where indentation is based on the line above, watch out for landing inside a triple quoted string. In this case, use iterative search + parse-partial-sexp backwards to find the beginning of the string. Note this does affect performance, but very little in the common cases (I hope). It could be made *much* faster by adding Emacs and XEmacs dependent code -- different code naturally. :-( Fixes the following reported bug: if len(sys.argv) >= 6: # More lines here fptr = open('/etc/hosts', 'w') fptr.write("""# /etc/hosts -- autocreated by /etc/ppp/ip-up # # Address from pppd %-15s %s # For loopbacking 127.0.0.1 localhost 255.255.255.255 broadcast """ % (ipaddr, ipname) ) os.chmod('/etc/hosts', 0644)
author Barry Warsaw <barry@python.org>
date Tue, 20 Jan 1998 22:52:56 +0000
parents aff1e7b1f523
children b864029a5bc5
line wrap: on
line diff
--- a/Misc/python-mode.el	Tue Jan 20 21:43:34 1998 +0000
+++ b/Misc/python-mode.el	Tue Jan 20 22:52:56 1998 +0000
@@ -1579,6 +1579,11 @@
 	;; if we landed inside a string, go to the beginning of that
 	;; string. this handles triple quoted, multi-line spanning
 	;; strings.
+	(let ((skip (nth 3 (parse-partial-sexp bod (point)))))
+	  (while skip
+	    (py-safe (search-backward (make-string 1 skip)))
+	    (setq skip (nth 3 (parse-partial-sexp bod (point))))))
+	;; now skip backward over continued lines
 	(py-goto-initial-line)
 	(+ (current-indentation)
 	   (if (py-statement-opens-block-p)
@@ -2527,8 +2532,11 @@
 ;; blocks, whether of the backslash or open-bracket varieties, or a
 ;; mix of the two.  The following manages to do that in the usual
 ;; cases.
+;;
+;; Also, if we're sitting inside a triple quoted string, this will
+;; drop us at the line that begins the string.
 (defun py-goto-initial-line ()
-  (let ( open-bracket-pos )
+  (let (open-bracket-pos state strchr bod done)
     (while (py-continuation-line-p)
       (beginning-of-line)
       (if (py-backslash-continuation-line-p)