(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