X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/0c382083b6b550c26fad8ac7f59b1ba09663e728..e70b5064d77602ba43cd31216ca8f3eb9a4c2c42:/lisp/indent.el diff --git a/lisp/indent.el b/lisp/indent.el index e57d6068ef..f5850de8b8 100644 --- a/lisp/indent.el +++ b/lisp/indent.el @@ -1,7 +1,6 @@ ;;; indent.el --- indentation commands for Emacs -;; Copyright (C) 1985, 1995, 2001, 2002, 2003, 2004, 2005, 2006, 2007, -;; 2008, 2009, 2010 Free Software Foundation, Inc. +;; Copyright (C) 1985, 1995, 2001-2011 Free Software Foundation, Inc. ;; Maintainer: FSF ;; Package: emacs @@ -64,9 +63,11 @@ e.g., `c-tab-always-indent', and do not respect this variable." (defun indent-according-to-mode () "Indent line in proper way for current major mode. -The buffer-local variable `indent-line-function' determines how to do this, -but the functions `indent-relative' and `indent-relative-maybe' are -special; we don't actually use them here." +Normally, this is done by calling the function specified by the +variable `indent-line-function'. However, if the value of that +variable is `indent-relative' or `indent-relative-maybe', handle +it specially (since those functions are used for tabbing); in +that case, indent by aligning to the previous non-blank line." (interactive) (syntax-propertize (line-end-position)) (if (memq indent-line-function @@ -85,22 +86,25 @@ special; we don't actually use them here." (funcall indent-line-function))) (defun indent-for-tab-command (&optional arg) - "Indent line or region in proper way for current major mode or insert a tab. -Depending on `tab-always-indent', either insert a tab or indent. - -In most major modes, if point was in the current line's indentation, -it is moved to the first non-whitespace character after indenting; -otherwise it stays at the same position in the text. - -If a prefix argument is given, also rigidly indent the entire + "Indent the current line or region, or insert a tab, as appropriate. +This function either inserts a tab, or indents the current line, +or performs symbol completion, depending on `tab-always-indent'. +The function called to actually indent the line or insert a tab +is given by the variable `indent-line-function'. + +If a prefix argument is given, after this function indents the +current line or inserts a tab, it also rigidly indents the entire balanced expression which starts at the beginning of the current -line to reflect the current line's change in indentation. +line, to reflect the current line's indentation. -If `transient-mark-mode' is turned on and the region is active, -indent the region (in this case, any prefix argument is ignored). +In most major modes, if point was in the current line's +indentation, it is moved to the first non-whitespace character +after indenting; otherwise it stays at the same position relative +to the text. -The function actually called to indent the line is determined by the value of -`indent-line-function'." +If `transient-mark-mode' is turned on and the region is active, +this function instead calls `indent-region'. In this case, any +prefix argument is ignored." (interactive "P") (cond ;; The region is active, indent it. @@ -394,34 +398,14 @@ indents all the lines with it: with it. 2) If `indent-region-function' is non-nil, call that function to indent the region. - 3) Indent each line as specified by the variable `indent-line-function'. + 3) Indent each line via `indent-according-to-mode'. Called from a program, START and END specify the region to indent. If the third argument COLUMN is an integer, it specifies the column to indent to; if it is nil, use one of the three methods above." (interactive "r\nP") - (if (null column) - (if fill-prefix - (save-excursion - (goto-char end) - (setq end (point-marker)) - (goto-char start) - (let ((regexp (regexp-quote fill-prefix))) - (while (< (point) end) - (or (looking-at regexp) - (and (bolp) (eolp)) - (insert fill-prefix)) - (forward-line 1)))) - (if indent-region-function - (funcall indent-region-function start end) - (save-excursion - (setq end (copy-marker end)) - (goto-char start) - (while (< (point) end) - (or (and (bolp) (eolp)) - (indent-according-to-mode)) - (forward-line 1)) - (move-marker end nil)))) + (cond + (column (setq column (prefix-numeric-value column)) (save-excursion (goto-char end) @@ -434,6 +418,28 @@ column to indent to; if it is nil, use one of the three methods above." (indent-to column 0)) (forward-line 1)) (move-marker end nil))) + (fill-prefix + (save-excursion + (goto-char end) + (setq end (point-marker)) + (goto-char start) + (let ((regexp (regexp-quote fill-prefix))) + (while (< (point) end) + (or (looking-at regexp) + (and (bolp) (eolp)) + (insert fill-prefix)) + (forward-line 1))))) + (indent-region-function + (funcall indent-region-function start end)) + (t + (save-excursion + (setq end (copy-marker end)) + (goto-char start) + (while (< (point) end) + (or (and (bolp) (eolp)) + (indent-according-to-mode)) + (forward-line 1)) + (move-marker end nil)))) ;; In most cases, reindenting modifies the buffer, but it may also ;; leave it unmodified, in which case we have to deactivate the mark ;; by hand. @@ -562,8 +568,8 @@ Use \\[edit-tab-stops] to edit them interactively." (while (and tabs (>= (current-column) (car tabs))) (setq tabs (cdr tabs))) (if tabs - (let ((opoint (point))) - (delete-horizontal-space t) + (progn + (delete-horizontal-space t) (indent-to (car tabs))) (insert ?\s)))) @@ -595,5 +601,4 @@ Use \\[edit-tab-stops] to edit them interactively." (define-key ctl-x-map "\t" 'indent-rigidly) (define-key esc-map "i" 'tab-to-tab-stop) -;; arch-tag: f402b2a7-e44f-492f-b5b8-38996020b7c3 ;;; indent.el ends here