2009-02-19 Carsten Dominik <dominik@science.uva.nl>
[bpt/emacs.git] / lisp / align.el
index a481ba1..cb69bc5 100644 (file)
@@ -1,17 +1,18 @@
 ;;; align.el --- align text to a specific column, by regexp
 
-;; Copyright (C) 1999, 2000, 2002, 2003, 2004,
-;;   2005 Free Software Foundation, Inc.
+;; Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004,
+;;   2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
 
 ;; Author: John Wiegley <johnw@gnu.org>
+;; Maintainer: FSF
 ;; Keywords: convenience languages lisp
 
 ;; This file is part of GNU Emacs.
 
-;; GNU Emacs is free software; you can redistribute it and/or modify
+;; GNU Emacs is free software: you can redistribute it and/or modify
 ;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 2, or (at your option)
-;; any later version.
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
 
 ;; GNU Emacs is distributed in the hope that it will be useful,
 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -19,9 +20,7 @@
 ;; GNU General Public License for more details.
 
 ;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-;; Boston, MA 02110-1301, USA.
+;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
 
 ;;; Commentary:
 
 ;;; User Variables:
 
 (defcustom align-load-hook nil
-  "*Hook that gets run after the aligner has been loaded."
+  "Hook that gets run after the aligner has been loaded."
   :type 'hook
   :group 'align)
 
 (defcustom align-indent-before-aligning nil
-  "*If non-nil, indent the marked region before aligning it."
+  "If non-nil, indent the marked region before aligning it."
   :type 'boolean
   :group 'align)
 
 (defcustom align-default-spacing 1
-  "*An integer that represents the default amount of padding to use.
+  "An integer that represents the default amount of padding to use.
 If `align-to-tab-stop' is non-nil, this will represent the number of
 tab stops to use for alignment, rather than the number of spaces.
 Each alignment rule can optionally override both this variable.  See
@@ -147,13 +146,13 @@ Each alignment rule can optionally override both this variable.  See
   :group 'align)
 
 (defcustom align-to-tab-stop 'indent-tabs-mode
-  "*If non-nil, alignments will always fall on a tab boundary.
+  "If non-nil, alignments will always fall on a tab boundary.
 It may also be a symbol, whose value will be taken."
   :type '(choice (const nil) symbol)
   :group 'align)
 
 (defcustom align-region-heuristic 500
-  "*If non-nil, used as a heuristic by `align-current'.
+  "If non-nil, used as a heuristic by `align-current'.
 Since each alignment rule can possibly have its own set of alignment
 sections (whenever `align-region-separate' is non-nil, and not a
 string), this heuristic is used to determine how far before and after
@@ -164,72 +163,72 @@ may cause unexpected behavior at times."
   :group 'align)
 
 (defcustom align-highlight-change-face 'highlight
-  "*The face to highlight with if changes are necessary."
+  "The face to highlight with if changes are necessary."
   :type 'face
   :group 'align)
 
 (defcustom align-highlight-nochange-face 'secondary-selection
-  "*The face to highlight with if no changes are necessary."
+  "The face to highlight with if no changes are necessary."
   :type 'face
   :group 'align)
 
 (defcustom align-large-region 10000
-  "*If an integer, defines what constitutes a \"large\" region.
+  "If an integer, defines what constitutes a \"large\" region.
 If nil,then no messages will ever be printed to the minibuffer."
   :type 'integer
   :group 'align)
 
 (defcustom align-c++-modes '(c++-mode c-mode java-mode)
-  "*A list of modes whose syntax resembles C/C++."
+  "A list of modes whose syntax resembles C/C++."
   :type '(repeat symbol)
   :group 'align)
 
 (defcustom align-perl-modes '(perl-mode cperl-mode)
-  "*A list of modes where perl syntax is to be seen."
+  "A list of modes where perl syntax is to be seen."
   :type '(repeat symbol)
   :group 'align)
 
 (defcustom align-lisp-modes
   '(emacs-lisp-mode lisp-interaction-mode lisp-mode scheme-mode)
-  "*A list of modes whose syntax resembles Lisp."
+  "A list of modes whose syntax resembles Lisp."
   :type '(repeat symbol)
   :group 'align)
 
 (defcustom align-tex-modes
   '(tex-mode plain-tex-mode latex-mode slitex-mode)
-  "*A list of modes whose syntax resembles TeX (and family)."
+  "A list of modes whose syntax resembles TeX (and family)."
   :type '(repeat symbol)
   :group 'align)
 
 (defcustom align-text-modes '(text-mode outline-mode)
-  "*A list of modes whose content is plain text."
+  "A list of modes whose content is plain text."
   :type '(repeat symbol)
   :group 'align)
 
 (defcustom align-dq-string-modes
   (append align-lisp-modes align-c++-modes align-perl-modes
          '(python-mode))
-  "*A list of modes where double quoted strings should be excluded."
+  "A list of modes where double quoted strings should be excluded."
   :type '(repeat symbol)
   :group 'align)
 
 (defcustom align-sq-string-modes
   (append align-perl-modes '(python-mode))
-  "*A list of modes where single quoted strings should be excluded."
+  "A list of modes where single quoted strings should be excluded."
   :type '(repeat symbol)
   :group 'align)
 
 (defcustom align-open-comment-modes
   (append align-lisp-modes align-c++-modes align-perl-modes
          '(python-mode makefile-mode))
-  "*A list of modes with a single-line comment syntax.
+  "A list of modes with a single-line comment syntax.
 These are comments as in Lisp, which have a beginning but, end with
 the line (i.e., `comment-end' is an empty string)."
   :type '(repeat symbol)
   :group 'align)
 
 (defcustom align-region-separate "^\\s-*[{}]?\\s-*$"
-  "*Select the method by which alignment sections will be separated.
+  "Select the method by which alignment sections will be separated.
 If this is a symbol, that symbol's value will be used.
 
 For the sake of clarification, consider the following example, which
@@ -384,9 +383,6 @@ The possible settings for `align-region-separate' are:
                           regexp function)))))))
   "The `type' form for any `align-rules-list' variable.")
 
-(unless (functionp 'c-guess-basic-syntax)
-  (autoload 'c-guess-basic-syntax "cc-engine"))
-
 (defcustom align-rules-list
   `((lisp-second-arg
      (regexp   . "\\(^\\s-+[^( \t\n]\\|(\\(\\S-+\\)\\s-+\\)\\S-+\\(\\s-+\\)")
@@ -562,7 +558,7 @@ The possible settings for `align-region-separate' are:
     ;; With a numeric prefix argument, or C-u, space delimited text
     ;; tables will be aligned.
     (text-column
-     (regexp   . "\\(^\\|\\S-\\)\\(\\s-+\\)\\(\\S-\\|$\\)")
+     (regexp   . "\\(^\\|\\S-\\)\\([ \t]+\\)\\(\\S-\\|$\\)")
      (group    . 2)
      (modes    . align-text-modes)
      (repeat   . t)
@@ -585,7 +581,7 @@ The possible settings for `align-region-separate' are:
      (regexp . "^\\s-*\\w+:\\(\\s-*\\).*;")
      (group . (1))
      (modes . '(css-mode html-mode))))
-  "*A list describing all of the available alignment rules.
+  "A list describing all of the available alignment rules.
 The format is:
 
    ((TITLE
@@ -783,7 +779,7 @@ The following attributes are meaningful:
      (regexp . "^\\s-*#\\s-*\\(if\\w*\\|endif\\)\\(.*\\)$")
      (group  . 2)
      (modes  . align-c++-modes)))
-  "*A list describing text that should be excluded from alignment.
+  "A list describing text that should be excluded from alignment.
 See the documentation for `align-rules-list' for more info."
   :type align-exclude-rules-list-type
   :group 'align)
@@ -841,7 +837,7 @@ See the variable `align-exclude-rules-list' for more details.")
 
     (use-entity
      (regexp   . "\\(\\s-+\\)use\\s-+entity")))
-  "*Alignment rules for `vhdl-mode'.  See `align-rules-list' for more info."
+  "Alignment rules for `vhdl-mode'.  See `align-rules-list' for more info."
   :type align-rules-list-type
   :group 'align)
 
@@ -934,8 +930,7 @@ using a REGEXP like \"(\". All you would have to do is to mark the
 region, call `align-regexp' and type in that regular expression."
   (interactive
    (append
-    (list (min (point) (mark))
-         (max (point) (mark)))
+    (list (region-beginning) (region-end))
     (if current-prefix-arg
        (list (read-string "Complex align using regexp: "
                           "\\(\\s-*\\)")
@@ -991,8 +986,7 @@ list of rules (see `align-rules-list'), it can be used to override the
 default alignment rules that would have been used to identify the text
 to be colored."
   (interactive
-   (list (min (mark) (point))
-        (max (mark) (point))
+   (list (region-beginning) (region-end)
         (completing-read
          "Title of rule to highlight: "
          (mapcar
@@ -1079,7 +1073,7 @@ current position."
                           (eq (char-before pos) ?\\))
                 (setq count (1+ count) pos (1- pos)))
               (eq (mod count 2) 1))
-            (goto-char (match-beginning 2))))
+            (goto-char (match-beginning (if reverse 1 2)))))
     result))
 
 (defun align-new-section-p (beg end separator)
@@ -1313,6 +1307,7 @@ aligner would have dealt with are."
                 (rulesep (assq 'separate rule))
                 (thissep (if rulesep (cdr rulesep) separate))
                 same (eol 0)
+                search-start
                 group group-c
                 spacing spacing-c
                 tab-stop tab-stop-c
@@ -1418,6 +1413,7 @@ aligner would have dealt with are."
                      ;; while we can find the rule in the alignment
                      ;; region..
                      (while (and (< (point) end-mark)
+                                 (setq search-start (point))
                                  (if regfunc
                                      (funcall regfunc end-mark nil)
                                    (re-search-forward regexp
@@ -1442,7 +1438,7 @@ aligner would have dealt with are."
                        ;; if the search ended us on the beginning of
                        ;; the next line, move back to the end of the
                        ;; previous line.
-                       (if (bolp)
+                       (if (and (bolp) (> (point) search-start))
                            (forward-char -1))
 
                        ;; lookup the `group' attribute the first time
@@ -1582,7 +1578,12 @@ aligner would have dealt with are."
                            ;; the next line; don't bother searching
                            ;; anymore on this one
                            (if (and (not repeat) (not (bolp)))
-                               (forward-line)))))
+                               (forward-line))
+
+                           ;; if the search did not change point,
+                           ;; move forward to avoid an infinite loop
+                           (if (= (point) search-start)
+                               (forward-char)))))
 
                      ;; when they are no more matches for this rule,
                      ;; align whatever was left over
@@ -1602,5 +1603,5 @@ aligner would have dealt with are."
 
 (run-hooks 'align-load-hook)
 
-;;; arch-tag: ef79cccf-1db8-4888-a8a1-d7ce2d1532f7
+;; arch-tag: ef79cccf-1db8-4888-a8a1-d7ce2d1532f7
 ;;; align.el ends here