]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
(py-no-outdent-re): new constant
authorBarry Warsaw <barry@python.org>
Tue, 14 Mar 1995 20:53:08 +0000 (20:53 +0000)
committerBarry Warsaw <barry@python.org>
Tue, 14 Mar 1995 20:53:08 +0000 (20:53 +0000)
(py-indent-line, py-electric-colon): watch for compound statements one
line after another.

Misc/python-mode.el

index 217a65504f1a4b5b4b7ba260f111d96212a0f2a5..0d5df7b40e2fb77c1bb773f40bc1ec20676d5dca 100644 (file)
@@ -310,13 +310,25 @@ Currently-active file is at the head of the list.")
 (defconst py-outdent-re
   (concat "\\(" (mapconcat 'identity
                           '("else:"
-                            "except\\s +.*:"
+                            "except\\(\\s +.*\\)?:"
                             "finally:"
                             "elif\\s +.*:")
                           "\\|")
          "\\)")
   "Regexp matching clauses to be outdented one level.")
 
+(defconst py-no-outdent-re
+  (concat "\\(" (mapconcat 'identity
+                          '("try\\s +.*:"
+                            "except\\(\\s +.*\\)?:"
+                            "while\\s +.*:"
+                            "for\\s +.*:"
+                            "if\\s +.*:"
+                            "elif\\s +.*:")
+                          "\\|")
+         "\\)")
+  "Regexp matching lines to not outdent after.")
+
 \f
 ;;;###autoload
 (defun python-mode ()
@@ -397,20 +409,27 @@ In certain cases the line is outdented appropriately.  If a numeric
 argument is provided, that many colons are inserted non-electrically."
   (interactive "P")
   (self-insert-command (prefix-numeric-value arg))
-  (let (this-indent)
-    (if (and (not arg)
-            (save-excursion
-              (back-to-indentation)
-              (looking-at py-outdent-re))
-            (= (setq this-indent (py-compute-indentation))
-               (save-excursion
-                 (forward-line -1)
-                 (py-compute-indentation)))
-            )
-       (save-excursion
-         (beginning-of-line)
-         (delete-horizontal-space)
-         (indent-to (- this-indent py-indent-offset)))
+  (save-excursion
+    (let ((here (point))
+         (outdent 0)
+         (indent (py-compute-indentation)))
+      (if (and (not arg)
+              (progn
+                (back-to-indentation)
+                (looking-at py-outdent-re))
+              (prog2
+                  (backward-to-indentation 1)
+                  (not (looking-at py-no-outdent-re))
+                (goto-char here))
+              (= indent (progn
+                          (forward-line -1)
+                          (py-compute-indentation)))
+              )
+         (setq outdent py-indent-offset))
+      (goto-char here)
+      (beginning-of-line)
+      (delete-horizontal-space)
+      (indent-to (- indent outdent))
       )))
 
 \f
@@ -630,10 +649,12 @@ needed so that only a single column position is deleted."
   (let* ((ci (current-indentation))
         (move-to-indentation-p (<= (current-column) ci))
         (need (py-compute-indentation)))
-    ;; watch for outdents
+    ;; see if we need to outdent
     (if (save-excursion
-         (back-to-indentation)
-         (looking-at py-outdent-re))
+         (and (progn (back-to-indentation)
+                     (looking-at py-outdent-re))
+              (progn (backward-to-indentation 1)
+                     (not (looking-at py-no-outdent-re)))))
        (setq need (- need py-indent-offset)))
     (if (/= ci need)
        (save-excursion