summaryrefslogtreecommitdiff
path: root/lisp/indent.el
diff options
context:
space:
mode:
authorChong Yidong <cyd@gnu.org>2013-12-21 16:37:08 +0800
committerChong Yidong <cyd@gnu.org>2013-12-21 16:37:08 +0800
commit77221051a20d22ab785b0e0441a320862ec589a0 (patch)
treeb164afe2463da7bfbc0818ce875b2dc8618f99c3 /lisp/indent.el
parent70c8f5ca14b1de558e6f01dc745822fb957a11d1 (diff)
downloademacs-77221051a20d22ab785b0e0441a320862ec589a0.tar.gz
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.
Diffstat (limited to 'lisp/indent.el')
-rw-r--r--lisp/indent.el85
1 files changed, 62 insertions, 23 deletions
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-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