Tweak C-x TAB behavior changes, and update docs.

* lisp/indent.el (indent-rigidly-map): Add docstring, and move commands
into named functions.
(indent-rigidly-left, indent-rigidly-right)
(indent-rigidly-left-to-tab-stop)
(indent-rigidly-right-to-tab-stop): New functions.  Decide on
indentation direction based on bidi direction, and accumulate
sequential commands in a single undo boundary.
(indent-rigidly--pop-undo): New utility function.

* doc/emacs/indent.texi (Indentation Commands): Document C-x TAB changes.

* doc/lispref/text.texi (Region Indent): Note the new interactive
behavior of indent-rigidly.
This commit is contained in:
Chong Yidong 2013-12-21 16:37:08 +08:00
parent 70c8f5ca14
commit 77221051a2
6 changed files with 110 additions and 41 deletions

View file

@ -1,3 +1,7 @@
2013-12-21 Chong Yidong <cyd@gnu.org>
* indent.texi (Indentation Commands): Document C-x TAB changes.
2013-12-20 Tassilo Horn <tsdh@gnu.org>
* rmail.texi: Document `S-SPC' as alternative to scrolling down

View file

@ -127,14 +127,26 @@ that column number.
@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 is used to change the indentation of all lines that begin
in the region, moving the affected lines as a ``rigid'' unit.
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}}.
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

View file

@ -1,3 +1,8 @@
2013-12-21 Chong Yidong <cyd@gnu.org>
* text.texi (Region Indent): Note the new interactive behavior of
indent-rigidly.
2013-12-20 Tassilo Horn <tsdh@gnu.org>
* numbers.texi (numbers): Document that =, <, <=, >, >= now accept

View file

@ -2344,21 +2344,19 @@ a different meaning and does not use this variable.
@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

View file

@ -1,3 +1,14 @@
2013-12-21 Chong Yidong <cyd@gnu.org>
* indent.el (indent-rigidly-map): Add docstring, and move commands
into named functions.
(indent-rigidly-left, indent-rigidly-right)
(indent-rigidly-left-to-tab-stop)
(indent-rigidly-right-to-tab-stop): New functions. Decide on
indentation direction based on bidi direction, and accumulate
sequential commands in a single undo boundary.
(indent-rigidly--pop-undo): New utility function.
2013-12-20 Juanma Barranquero <lekktu@gmail.com>
* faces.el (read-face-name): Require crm.el when using crm-separator.

View file

@ -169,31 +169,28 @@ Blank lines are ignored."
(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
@ -217,6 +214,48 @@ and <S-right>.")
(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