@kindex C-x TAB
@findex indent-rigidly
@cindex remove indentation
-Shift each line in the region by a fixed distance, to the right or
-left (@code{indent-rigidly}). The distance to move is determined by
-the numeric argument (positive to move rightward, negative to move
-leftward).
-
-This command can be used to remove all indentation from the lines in
-the region, by invoking it with a large negative argument,
-e.g., @kbd{C-u -1000 C-x @key{TAB}}.
+This command is used to change the indentation of all lines that begin
+in the region, moving the affected lines as a ``rigid'' unit.
+
+If called with no argument, the command activates a transient mode for
+adjusting the indentation of the affected lines interactively. While
+this transient mode is active, typing @key{LEFT} or @key{RIGHT}
+indents leftward and rightward, respectively, by one space. You can
+also type @kbd{S-@key{LEFT}} or @kbd{S-@key{RIGHT}} to indent leftward
+or rightward to the next tab stop (@pxref{Tab Stops}). Typing any
+other key disables the transient mode, and resumes normal editing.
+
+If called with a prefix argument @var{n}, this command indents the
+lines forward by @var{n} spaces (without enabling the transient mode).
+Negative values of @var{n} indent backward, so you can remove all
+indentation from the lines in the region using a large negative
+argument, like this:
+
+@smallexample
+C-u -999 C-x @key{TAB}
+@end smallexample
@end table
@node Tab Stops
@end defvar
@deffn Command indent-rigidly start end count
-This command indents all lines starting between @var{start}
+This function indents all lines starting between @var{start}
(inclusive) and @var{end} (exclusive) sideways by @var{count} columns.
This ``preserves the shape'' of the affected region, moving it as a
-rigid unit. Consequently, this command is useful not only for indenting
-regions of unindented text, but also for indenting regions of formatted
-code.
+rigid unit.
-For example, if @var{count} is 3, this command adds 3 columns of
-indentation to each of the lines beginning in the region specified.
+This is useful not only for indenting regions of unindented text, but
+also for indenting regions of formatted code. For example, if
+@var{count} is 3, this command adds 3 columns of indentation to every
+line that begins in the specified region.
-@c FIXME: I suggest using message-indent-citation as the example, or
-@c just remove this paragraph. --xfq
-In Mail mode, @kbd{C-c C-y} (@code{mail-yank-original}) uses
-@code{indent-rigidly} to indent the text copied from the message being
-replied to.
+If called interactively with no prefix argument, this command invokes
+a transient mode for adjusting indentation rigidly. @xref{Indentation
+Commands,,, emacs, The GNU Emacs Manual}.
@end deffn
@deffn Command indent-code-rigidly start end columns &optional nochange-regexp
(defvar indent-rigidly-map
(let ((map (make-sparse-keymap)))
- (define-key map [left]
- (lambda (beg end) (interactive "r") (indent-rigidly beg end -1)))
-
- (define-key map [right]
- (lambda (beg end) (interactive "r") (indent-rigidly beg end 1)))
-
- (define-key map [S-right]
- (lambda (beg end) (interactive "r")
- (let* ((current (indent-rigidly--current-indentation beg end))
- (next (indent--next-tab-stop current)))
- (indent-rigidly beg end (- next current)))))
-
- (define-key map [S-left]
- (lambda (beg end) (interactive "r")
- (let* ((current (indent-rigidly--current-indentation beg end))
- (next (indent--next-tab-stop current 'prev)))
- (indent-rigidly beg end (- next current)))))
- map))
+ (define-key map [left] 'indent-rigidly-left)
+ (define-key map [right] 'indent-rigidly-right)
+ (define-key map [S-left] 'indent-rigidly-left-to-tab-stop)
+ (define-key map [S-right] 'indent-rigidly-right-to-tab-stop)
+ map)
+ "Transient keymap for adjusting indentation interactively.
+It is activated by calling `indent-rigidly' interactively.")
(defun indent-rigidly (start end arg &optional interactive)
- "Indent all lines starting in the region sideways by ARG columns.
-Called from a program, takes three arguments, START, END and ARG.
-You can remove all indentation from a region by giving a large negative ARG.
-If used interactively and no prefix argument is given, use a transient
-mode that lets you move the text with cursor keys."
+ "Indent all lines starting in the region.
+If called interactively with no prefix argument, activate a
+transient mode in which the indentation can be adjusted interactively
+by typing \\<indent-rigidly-map>\\[indent-rigidly-left], \\[indent-rigidly-right], \\[indent-rigidly-left-to-tab-stop], or \\[indent-rigidly-right-to-tab-stop].
+Typing any other key deactivates the transient mode.
+
+If called from a program, or interactively with prefix ARG,
+indent all lines starting in the region forward by ARG columns.
+If called from a program, START and END specify the beginning and
+end of the text to act on, in place of the region.
+
+Negative values of ARG indent backward, so you can remove all
+indentation by specifying a large negative ARG."
(interactive "r\nP\np")
(if (and (not arg) interactive)
(progn
(forward-line 1))
(move-marker end nil))))
+(defun indent-rigidly--pop-undo ()
+ (and (memq last-command '(indent-rigidly-left indent-rigidly-right
+ indent-rigidly-left-to-tab-stop
+ indent-rigidly-right-to-tab-stop))
+ (consp buffer-undo-list)
+ (eq (car buffer-undo-list) nil)
+ (pop buffer-undo-list)))
+
+(defun indent-rigidly-left (beg end)
+ "Indent all lines between BEG and END leftward by one space."
+ (interactive "r")
+ (indent-rigidly--pop-undo)
+ (indent-rigidly
+ beg end
+ (if (eq (current-bidi-paragraph-direction) 'right-to-left) 1 -1)))
+
+(defun indent-rigidly-right (beg end)
+ "Indent all lines between BEG and END rightward by one space."
+ (interactive "r")
+ (indent-rigidly--pop-undo)
+ (indent-rigidly
+ beg end
+ (if (eq (current-bidi-paragraph-direction) 'right-to-left) -1 1)))
+
+(defun indent-rigidly-left-to-tab-stop (beg end)
+ "Indent all lines between BEG and END leftward to a tab stop."
+ (interactive "r")
+ (indent-rigidly--pop-undo)
+ (let* ((current (indent-rigidly--current-indentation beg end))
+ (rtl (eq (current-bidi-paragraph-direction) 'right-to-left))
+ (next (indent--next-tab-stop current (if rtl nil 'prev))))
+ (indent-rigidly beg end (- next current))))
+
+(defun indent-rigidly-right-to-tab-stop (beg end)
+ "Indent all lines between BEG and END rightward to a tab stop."
+ (interactive "r")
+ (indent-rigidly--pop-undo)
+ (let* ((current (indent-rigidly--current-indentation beg end))
+ (rtl (eq (current-bidi-paragraph-direction) 'right-to-left))
+ (next (indent--next-tab-stop current (if rtl 'prev))))
+ (indent-rigidly beg end (- next current))))
+
(defun indent-line-to (column)
"Indent current line to COLUMN.
This function removes or adds spaces and tabs at beginning of line