From 77221051a20d22ab785b0e0441a320862ec589a0 Mon Sep 17 00:00:00 2001 From: Chong Yidong Date: Sat, 21 Dec 2013 16:37:08 +0800 Subject: [PATCH] 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. --- doc/emacs/ChangeLog | 4 ++ doc/emacs/indent.texi | 28 ++++++++++---- doc/lispref/ChangeLog | 5 +++ doc/lispref/text.texi | 20 +++++----- lisp/ChangeLog | 11 ++++++ lisp/indent.el | 85 +++++++++++++++++++++++++++++++------------ 6 files changed, 111 insertions(+), 42 deletions(-) diff --git a/doc/emacs/ChangeLog b/doc/emacs/ChangeLog index 65b9e4836be..850c38a4dd4 100644 --- a/doc/emacs/ChangeLog +++ b/doc/emacs/ChangeLog @@ -1,3 +1,7 @@ +2013-12-21 Chong Yidong + + * indent.texi (Indentation Commands): Document C-x TAB changes. + 2013-12-20 Tassilo Horn * rmail.texi: Document `S-SPC' as alternative to scrolling down diff --git a/doc/emacs/indent.texi b/doc/emacs/indent.texi index 43294866b7b..0e35a63aa98 100644 --- a/doc/emacs/indent.texi +++ b/doc/emacs/indent.texi @@ -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 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 diff --git a/doc/lispref/ChangeLog b/doc/lispref/ChangeLog index 15730515301..ccd236403b8 100644 --- a/doc/lispref/ChangeLog +++ b/doc/lispref/ChangeLog @@ -1,3 +1,8 @@ +2013-12-21 Chong Yidong + + * text.texi (Region Indent): Note the new interactive behavior of + indent-rigidly. + 2013-12-20 Tassilo Horn * numbers.texi (numbers): Document that =, <, <=, >, >= now accept diff --git a/doc/lispref/text.texi b/doc/lispref/text.texi index b814d553296..1deb4a6530a 100644 --- a/doc/lispref/text.texi +++ b/doc/lispref/text.texi @@ -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 diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 2699bcb25ea..fc42cbedca6 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,14 @@ +2013-12-21 Chong Yidong + + * 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 * faces.el (read-face-name): Require crm.el when using crm-separator. diff --git a/lisp/indent.el b/lisp/indent.el index ab5860dd10c..d8bd765f559 100644 --- a/lisp/indent.el +++ b/lisp/indent.el @@ -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-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 .") (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 -- 2.39.2