(py-indent-right, py-indent-left): support indentation of regions or
current line.
diff --git a/Misc/python-mode.el b/Misc/python-mode.el
index e2659c0..5958020 100644
--- a/Misc/python-mode.el
+++ b/Misc/python-mode.el
@@ -434,6 +434,13 @@
     (run-hooks 'py-mode-hook)))
 
 
+(defun py-keep-region-active ()
+  ;; Do whatever is necessary to keep the region active in
+  ;; XEmacs 19.  This is unnecessary, but no-op in Emacs 19, so just
+  ;; ignore byte-compiler warnings you might see.
+  (and (boundp 'zmacs-region-stays)
+       (setq zmacs-region-stays t)))
+
 ;; electric characters
 (defun py-outdent-p ()
   ;; returns non-nil if the current line should outdent one level
@@ -485,43 +492,71 @@
 	    (indent-to (- indent outdent))
 	    )))))
 
-(defun py-indent-right (arg)
-  "Indent the line by one `py-indent-offset' level.
+(defun py-indent-right (start end arg)
+  "Indent lines in the region by one `py-indent-offset' level.
 With numeric arg, indent by that many levels.  You cannot indent
 farther right than the distance the line would be indented by
-\\[py-indent-line]."
-  (interactive "p")
-  (let ((col (current-indentation))
-	(want (* arg py-indent-offset))
-	(indent (py-compute-indentation))
-	(pos (- (point-max) (point)))
-	(bol (save-excursion (beginning-of-line) (point))))
-    (if (<= (+ col want) indent)
-	(progn
-	  (beginning-of-line)
-	  (delete-horizontal-space)
-	  (indent-to (+ col want))
-	  (if (> (- (point-max) pos) (point))
-	      (goto-char (- (point-max) pos)))
-	  ))))
+\\[py-indent-line].  With no active region, indent only the
+current line."
+  (interactive
+   (let ((p (point))
+	 (m (mark)))
+     (list (min p m) (max p m) (prefix-numeric-value current-prefix-arg))))
+  (let ((pos (- (point-max) (point)))
+	(end (save-excursion
+	       (goto-char (or end (1+ start)))
+	       (and (not (bolp))
+		    (forward-line 1))
+	       (set-marker (make-marker) (point))))
+	col want indent)
+    (goto-char start)
+    (beginning-of-line)
+    (unwind-protect
+	(while (< (point) end)
+	  (setq col (current-indentation)
+		want (* arg py-indent-offset)
+		indent (py-compute-indentation))
+	  (if (<= (+ col want) indent)
+	      (progn
+		(beginning-of-line)
+		(delete-horizontal-space)
+		(indent-to (+ col want))))
+	  (forward-line 1))
+      (set-marker end nil))
+    (goto-char (- (point-max) pos))
+    (py-keep-region-active)))
 
-(defun py-outdent-left (arg)
-  "Outdent the line by one `py-indent-offset' level.
+(defun py-outdent-left (start end arg)
+  "Outdent lines in the region by one `py-indent-offset' level.
 With numeric arg, outdent by that many levels.  You cannot outdent
-farther left than column zero."
-  (interactive "p")
-  (let ((col (current-indentation))
-	(want (* arg py-indent-offset))
-	(pos (- (point-max) (point)))
-	(bol (save-excursion (beginning-of-line) (point))))
-    (if (<= 0 (- col want))
-	(progn
-	  (beginning-of-line)
-	  (delete-horizontal-space)
-	  (indent-to (- col want))
-	  (if (> (- (point-max) pos) (point))
-	      (goto-char (- (point-max) pos)))
-	  ))))
+farther left than column zero.  With no active region, outdent only
+the current line."
+  (interactive
+   (let ((p (point))
+	 (m (mark)))
+     (list (min p m) (max p m) (prefix-numeric-value current-prefix-arg))))
+  (let ((pos (- (point-max) (point)))
+	(end (save-excursion
+	       (goto-char (or end (1+ start)))
+	       (and (not (bolp))
+		    (forward-line 1))
+	       (set-marker (make-marker) (point))))
+	col want)
+    (goto-char start)
+    (beginning-of-line)
+    (unwind-protect
+	(while (< (point) end)
+	  (setq col (current-indentation)
+		want (* arg py-indent-offset))
+	  (if (<= 0 (- col want))
+	      (progn
+		(beginning-of-line)
+		(delete-horizontal-space)
+		(indent-to (- col want))))
+	  (forward-line 1))
+      (set-marker end nil))
+    (goto-char (- (point-max) pos))
+    (py-keep-region-active)))
 
 
 ;;; Functions that execute Python commands in a subprocess