(py-electric-colon): new command
diff --git a/Misc/python-mode.el b/Misc/python-mode.el
index cdba45a..9e49ec6 100644
--- a/Misc/python-mode.el
+++ b/Misc/python-mode.el
@@ -222,7 +222,8 @@
   (mapcar (function
 	   (lambda (x)
 	     (define-key py-mode-map (car x) (cdr x))))
-	  '(("\C-c\C-c"  . py-execute-buffer)
+	  '((":"         . py-electric-colon)
+	    ("\C-c\C-c"  . py-execute-buffer)
 	    ("\C-c|"	 . py-execute-region)
 	    ("\C-c!"	 . py-shell)
 	    ("\177"	 . py-delete-char)
@@ -363,6 +364,30 @@
     (run-hooks 'py-mode-hook)))
 
 
+;; electric characters
+(defun py-electric-colon (arg)
+  "Insert a colon.
+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
+	       (forward-word -1)
+	       (looking-at "\\(else\\|except\\|finally\\elif\\):"))
+	     (= (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)))
+      )))
+
+
 ;;; Functions that execute Python commands in a subprocess
 (defun py-shell ()
   "Start an interactive Python interpreter in another window.