diff Misc/python-mode.el @ 9639:da1dd3e54b7a legacy-trunk

(py-goto-beginning-of-tqs): Finds the beginning of the triple quoted string we find ourselves in, based on the passed in delimiter. (py-compute-indentation): Fixes for indentation errors when we land inside a triple quoted string. For example: def foo(): if os.path.isfile(o_pri_mbox_file) and os.path.isfile(o_pub_mbox_file): print """\ I found both a private and a public mbox archive file private: %s public : %s I won't move either file, but you should choose one and move it to %s You may want to merge them manually, but be careful about exposing private correspondences to the public.""" % ( o_pri_mbox_file, o_pub_mbox_file, mbox_file) *----indentation would be wrong on this line.
author Barry Warsaw <barry@python.org>
date Tue, 15 Dec 1998 04:36:22 +0000
parents fec862301d6e
children ef97b4f6d187
line wrap: on
line diff
--- a/Misc/python-mode.el	Tue Dec 15 01:04:38 1998 +0000
+++ b/Misc/python-mode.el	Tue Dec 15 04:36:22 1998 +0000
@@ -1577,7 +1577,8 @@
     (beginning-of-line)
     (let* ((bod (py-point 'bod))
 	   (pps (parse-partial-sexp bod (point)))
-	   (boipps (parse-partial-sexp bod (py-point 'boi))))
+	   (boipps (parse-partial-sexp bod (py-point 'boi)))
+	   placeholder)
       (cond
        ;; are we inside a multi-line string or comment?
        ((or (and (nth 3 pps) (nth 3 boipps))
@@ -1620,6 +1621,11 @@
 		      (current-indentation)
 		    ;; else they're about to enter the first item
 		    (goto-char open-bracket-pos)
+		    (setq placeholder (point))
+		    (py-goto-initial-line)
+		    (py-goto-beginning-of-tqs
+		     (save-excursion (nth 3 (parse-partial-sexp
+					     placeholder (point)))))
 		    (+ (current-indentation) py-indent-offset))))
 
 	    ;; else on backslash continuation line
@@ -1726,18 +1732,15 @@
 	;; if we landed inside a string, go to the beginning of that
 	;; string. this handles triple quoted, multi-line spanning
 	;; strings.
-	(let* ((delim (nth 3 (parse-partial-sexp bod (point))))
-	       (skip (and delim (make-string 1 delim))))
-	  (when skip
-	    (save-excursion
-	      (py-safe (search-backward skip))
-	      (if (and (eq (char-before) delim)
-		       (eq (char-before (1- (point))) delim))
-		  (setq skip (make-string 3 delim))))
-	    ;; we're looking at a triple-quoted string
-	    (py-safe (search-backward skip))))
+	(py-goto-beginning-of-tqs (nth 3 (parse-partial-sexp bod (point))))
 	;; now skip backward over continued lines
+	(setq placeholder (point))
 	(py-goto-initial-line)
+	;; we may *now* have landed in a TQS, so find the beginning of
+	;; this string.
+	(py-goto-beginning-of-tqs
+	 (save-excursion (nth 3 (parse-partial-sexp
+				 placeholder (point)))))
 	(+ (current-indentation)
 	   (if (py-statement-opens-block-p)
 	       py-indent-offset
@@ -2747,6 +2750,20 @@
     (or (py-backslash-continuation-line-p)
 	(py-nesting-level))))
 
+(defun py-goto-beginning-of-tqs (delim)
+  "Go to the beginning of the triple quoted string we find ourselves in.
+DELIM is the TQS string delimiter character we're searching backwards
+for."
+  (let ((skip (and delim (make-string 1 delim))))
+    (when skip
+      (save-excursion
+	(py-safe (search-backward skip))
+	(if (and (eq (char-before) delim)
+		 (eq (char-before (1- (point))) delim))
+	    (setq skip (make-string 3 delim))))
+      ;; we're looking at a triple-quoted string
+      (py-safe (search-backward skip)))))
+
 (defun py-goto-initial-line ()
   "Go to the initial line of the current statement.
 Usually this is the line we're on, but if we're on the 2nd or