annotate lisp/align.el @ 39625:e441240482b2

(add-change-log-entry): Skip copyright notice and copying permission notice at start of file, if any. Make use of terms "entry" and "item" accord with Emacs manual. Simplify the logic for moving point while entering or creating an entry and then an item. (add-change-log-entry-other-window): Doc fix.
author Richard M. Stallman <rms@gnu.org>
date Sat, 06 Oct 2001 02:32:54 +0000
parents b174db545cfd
children 8cf8fe6b2497
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
38436
b174db545cfd Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents: 32451
diff changeset
1 ;;; align.el --- align text to a specific column, by regexp
27327
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3 ;; Copyright (C) 1999, 2000 Free Sofware Foundation
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
4
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
5 ;; Author: John Wiegley <johnw@gnu.org>
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
6 ;; Keywords: convenience languages lisp
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
7
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
8 ;; This file is part of GNU Emacs.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
9
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
10 ;; GNU Emacs is free software; you can redistribute it and/or modify
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
11 ;; it under the terms of the GNU General Public License as published by
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
12 ;; the Free Software Foundation; either version 2, or (at your option)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
13 ;; any later version.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
14
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
15 ;; GNU Emacs is distributed in the hope that it will be useful,
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
16 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
18 ;; GNU General Public License for more details.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
19
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
20 ;; You should have received a copy of the GNU General Public License
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
21 ;; along with GNU Emacs; see the file COPYING. If not, write to the
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
22 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
23 ;; Boston, MA 02111-1307, USA.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
24
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
25 ;;; Commentary:
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
26
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
27 ;; This mode allows you to align regions in a context-sensitive fashion.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
28 ;; The classic use is to align assignments:
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
29 ;;
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
30 ;; int a = 1;
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
31 ;; short foo = 2;
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
32 ;; double blah = 4;
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
33 ;;
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
34 ;; becomes
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
35 ;;
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
36 ;; int a = 1;
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
37 ;; short foo = 2;
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
38 ;; double blah = 4;
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
39
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
40 ;;; Usage:
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
41
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
42 ;; There are several variables which define how certain "categories"
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
43 ;; of syntax are to be treated. These variables go by the name
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
44 ;; `align-CATEGORY-modes'. For example, "c++" is such a category.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
45 ;; There are several rules which apply to c++, but since several other
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
46 ;; languages have a syntax similar to c++ (e.g., c, java, etc), these
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
47 ;; modes are treated as belonging to the same category.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
48 ;;
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
49 ;; If you want to add a new mode under a certain category, just
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
50 ;; customize that list, or add the new mode manually. For example, to
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
51 ;; make jde-mode a c++ category mode, use this code in your .emacs
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
52 ;; file:
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
53 ;;
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
54 ;; (setq align-c++-modes (cons 'jde-mode align-c++-modes))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
55
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
56 ;; In some programming modes, it's useful to have the aligner run only
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
57 ;; after indentation is performed. To achieve this, customize or set
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
58 ;; the variable `align-indent-before-aligning' to t.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
59
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
60 ;;; Module Authors:
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
61
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
62 ;; In order to incorporate align's functionality into your own
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
63 ;; modules, there are only a few steps you have to follow.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
64
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
65 ;; 1. Require or load in the align.el library.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
66 ;;
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
67 ;; 2. Define your alignment and exclusion rules lists, either
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
68 ;; customizable or not.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
69 ;;
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
70 ;; 3. In your mode function, set the variables
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
71 ;; `align-mode-rules-list' and `align-mode-exclude-rules-list'
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
72 ;; to your own rules lists.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
73
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
74 ;; If there is any need to add your mode name to one of the
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
75 ;; align-?-modes variables (for example, `align-dq-string-modes'), use
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
76 ;; `add-to-list', or some similar function which checks first to see
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
77 ;; if the value is already there. Since the user may customize that
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
78 ;; mode list, and then write your mode name into their .emacs file,
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
79 ;; causing the symbol already to be present the next time they load
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
80 ;; your package.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
81
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
82 ;; Example:
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
83 ;;
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
84 ;; (require 'align)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
85 ;;
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
86 ;; (defcustom my-align-rules-list
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
87 ;; '((my-rule
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
88 ;; (regexp . "Sample")))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
89 ;; :type align-rules-list-type
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
90 ;; :group 'my-package)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
91 ;;
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
92 ;; (put 'my-align-rules-list 'risky-local-variable t)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
93 ;;
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
94 ;; (add-to-list 'align-dq-string-modes 'my-package-mode)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
95 ;; (add-to-list 'align-open-comment-modes 'my-package-mode)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
96 ;;
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
97 ;; (defun my-mode ()
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
98 ;; ...
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
99 ;; (setq align-mode-rules-list my-align-rules-list))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
100 ;;
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
101 ;; Note that if you need to install your own exclusion rules, then you
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
102 ;; will also need to reproduce any double-quoted string, or open
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
103 ;; comment exclusion rules that are defined in the standard
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
104 ;; `align-exclude-rules-list'. At the moment there is no convenient
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
105 ;; way to mix both mode-local and global rules lists.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
106
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
107 ;;; History:
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
108
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
109 ;; Version 1.0 was created in the earlier part of 1996, using a very
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
110 ;; simple algorithm that understand only basic regular expressions.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
111 ;; Parts of the code were broken up and included in vhdl-mode.el
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
112 ;; around this time. After several comments from users, and a need to
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
113 ;; find a more robust, performant algorithm, 2.0 was born in late
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
114 ;; 1998. Many different approaches were taken (mostly due to the
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
115 ;; complexity of TeX tables), but finally a scheme was discovered
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
116 ;; which worked fairly well for most common usage cases. Development
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
117 ;; beyond version 2.8 is not planned, except for problems that users
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
118 ;; might encounter.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
119
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
120 ;;; Code:
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
121
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
122 (defgroup align nil
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
123 "Align text to a specific column, by regexp."
30890
7bd10623068c (align) <defgroup>: Add :version.
Dave Love <fx@gnu.org>
parents: 30254
diff changeset
124 :version "21.1"
27327
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
125 :group 'fill)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
126
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
127 ;;; User Variables:
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
128
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
129 (defcustom align-load-hook nil
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
130 "*Hook that gets run after the aligner has been loaded."
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
131 :type 'hook
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
132 :group 'align)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
133
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
134 (defcustom align-indent-before-aligning nil
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
135 "*If non-nil, indent the marked region before aligning it."
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
136 :type 'boolean
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
137 :group 'align)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
138
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
139 (defcustom align-default-spacing 1
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
140 "*An integer that represents the default amount of padding to use.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
141 If `align-to-tab-stop' is non-nil, this will represent the number of
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
142 tab stops to use for alignment, rather than the number of spaces.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
143 Each alignment rule can optionally override both this variable. See
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
144 `align-mode-alist'."
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
145 :type 'integer
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
146 :group 'align)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
147
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
148 (defcustom align-to-tab-stop 'indent-tabs-mode
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
149 "*If non-nil, alignments will always fall on a tab boundary.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
150 It may also be a symbol, whose value will be taken."
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
151 :type '(choice (const nil) symbol)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
152 :group 'align)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
153
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
154 (defcustom align-region-heuristic 500
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
155 "*If non-nil, used as a heuristic by `align-current'.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
156 Since each alignment rule can possibly have its own set of alignment
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
157 sections (whenever `align-region-separate' is non-nil, and not a
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
158 string), this heuristic is used to determine how far before and after
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
159 point we should search in looking for a region separator. Larger
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
160 values can mean slower perform in large files, although smaller values
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
161 may cause unexpected behavior at times."
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
162 :type 'integer
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
163 :group 'align)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
164
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
165 (defcustom align-highlight-change-face 'highlight
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
166 "*The face to highlight with if changes are necessary."
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
167 :type 'face
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
168 :group 'align)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
169
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
170 (defcustom align-highlight-nochange-face 'secondary-selection
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
171 "*The face to highlight with if no changes are necessary."
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
172 :type 'face
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
173 :group 'align)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
174
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
175 (defcustom align-large-region 10000
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
176 "*If an integer, defines what constitutes a \"large\" region.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
177 If nil,then no messages will ever be printed to the minibuffer."
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
178 :type 'integer
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
179 :group 'align)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
180
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
181 (defcustom align-c++-modes '(c++-mode c-mode java-mode)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
182 "*A list of modes whose syntax resembles C/C++."
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
183 :type '(repeat symbol)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
184 :group 'align)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
185
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
186 (defcustom align-perl-modes '(perl-mode cperl-mode)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
187 "*A list of modes where perl syntax is to be seen."
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
188 :type '(repeat symbol)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
189 :group 'align)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
190
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
191 (defcustom align-lisp-modes
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
192 '(emacs-lisp-mode lisp-interaction-mode lisp-mode scheme-mode)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
193 "*A list of modes whose syntax resembles Lisp."
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
194 :type '(repeat symbol)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
195 :group 'align)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
196
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
197 (defcustom align-tex-modes
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
198 '(tex-mode plain-tex-mode latex-mode slitex-mode)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
199 "*A list of modes whose syntax resembles TeX (and family)."
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
200 :type '(repeat symbol)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
201 :group 'align)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
202
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
203 (defcustom align-text-modes '(text-mode outline-mode)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
204 "*A list of modes whose content is plain text."
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
205 :type '(repeat symbol)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
206 :group 'align)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
207
29493
0345c6ffb8b4 Update from author.
Gerd Moellmann <gerd@gnu.org>
parents: 27327
diff changeset
208 (defcustom align-dq-string-modes
0345c6ffb8b4 Update from author.
Gerd Moellmann <gerd@gnu.org>
parents: 27327
diff changeset
209 (append align-lisp-modes align-c++-modes align-perl-modes
0345c6ffb8b4 Update from author.
Gerd Moellmann <gerd@gnu.org>
parents: 27327
diff changeset
210 '(python-mode))
27327
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
211 "*A list of modes where double quoted strings should be excluded."
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
212 :type '(repeat symbol)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
213 :group 'align)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
214
29493
0345c6ffb8b4 Update from author.
Gerd Moellmann <gerd@gnu.org>
parents: 27327
diff changeset
215 (defcustom align-sq-string-modes
0345c6ffb8b4 Update from author.
Gerd Moellmann <gerd@gnu.org>
parents: 27327
diff changeset
216 (append align-perl-modes '(python-mode))
27327
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
217 "*A list of modes where single quoted strings should be excluded."
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
218 :type '(repeat symbol)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
219 :group 'align)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
220
29493
0345c6ffb8b4 Update from author.
Gerd Moellmann <gerd@gnu.org>
parents: 27327
diff changeset
221 (defcustom align-open-comment-modes
0345c6ffb8b4 Update from author.
Gerd Moellmann <gerd@gnu.org>
parents: 27327
diff changeset
222 (append align-lisp-modes align-c++-modes align-perl-modes
0345c6ffb8b4 Update from author.
Gerd Moellmann <gerd@gnu.org>
parents: 27327
diff changeset
223 '(python-mode makefile-mode))
27327
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
224 "*A list of modes with a single-line comment syntax.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
225 These are comments as in Lisp, which have a beginning but, end with
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
226 the line (i.e., `comment-end' is an empty string)."
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
227 :type '(repeat symbol)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
228 :group 'align)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
229
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
230 (defcustom align-region-separate "^\\s-*[{}]?\\s-*$"
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
231 "*Select the method by which alignment sections will be separated.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
232 If this is a symbol, that symbol's value will be used.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
233
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
234 For the sake of clarification, consider the following example, which
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
235 will be referred to in the descriptions below.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
236
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
237 int alpha = 1; /* one */
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
238 double beta = 2.0;
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
239 long gamma; /* ten */
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
240
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
241 unsigned int delta = 1; /* one */
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
242 long double epsilon = 3.0;
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
243 long long omega; /* ten */
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
244
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
245 The possible settings for `align-region-separate' are:
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
246
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
247 `entire' The entire region being aligned will be considered as a
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
248 single alignment section. Assuming that comments were not
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
249 being aligned to a particular column, the example would
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
250 become:
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
251
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
252 int alpha = 1; /* one */
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
253 double beta = 2.0;
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
254 long gamma; /* ten */
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
255
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
256 unsigned int delta = 1; /* one */
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
257 long double epsilon;
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
258 long long chi = 10; /* ten */
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
259
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
260 `group' Each contiguous set of lines where a specific alignment
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
261 occurs is considered a section for that alignment rule.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
262 Note that each rule will may have any entirely different
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
263 set of section divisions than another.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
264
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
265 int alpha = 1; /* one */
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
266 double beta = 2.0;
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
267 long gamma; /* ten */
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
268
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
269 unsigned int delta = 1; /* one */
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
270 long double epsilon;
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
271 long long chi = 10; /* ten */
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
272
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
273 `largest' When contiguous rule sets overlap, the largest section
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
274 described will be taken as the alignment section for each
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
275 rule touched by that section.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
276
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
277 int alpha = 1; /* one */
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
278 double beta = 2.0;
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
279 long gamma; /* ten */
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
280
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
281 unsigned int delta = 1; /* one */
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
282 long double epsilon;
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
283 long long chi = 10; /* ten */
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
284
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
285 NOTE: This option is not supported yet, due to algorithmic
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
286 issues which haven't been satisfactorily resolved. There
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
287 are ways to do it, but they're both ugly and resource
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
288 consumptive.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
289
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
290 regexp A regular expression string which defines the section
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
291 divider. If the mode you're in has a consistent divider
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
292 between sections, the behavior will be very similar to
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
293 `largest', and faster. But if the mode does not use clear
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
294 separators (for example, if you collapse your braces onto
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
295 the preceding statement in C or perl), `largest' is
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
296 probably the better alternative.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
297
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
298 function A function that will be passed the beginning and ending
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
299 locations of the region in which to look for the section
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
300 separator. At the very beginning of the attempt to align,
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
301 both of these parameters will be nil, in which case the
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
302 function should return non-nil if it wants each rule to
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
303 define its own section, or nil if it wants the largest
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
304 section found to be used as the common section for all rules
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
305 that occur there.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
306
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
307 list A list of markers within the buffer that represent where
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
308 the section dividers lie. Be certain to use markers! For
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
309 when the aligning begins, the ensuing contract/expanding of
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
310 whitespace will throw off any non-marker positions.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
311
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
312 This method is intended for use in Lisp programs, and not
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
313 by the user."
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
314 :type '(choice
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
315 (const :tag "Entire region is one section" entire)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
316 (const :tag "Align by contiguous groups" group)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
317 ; (const largest)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
318 (regexp :tag "Regexp defines section boundaries")
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
319 (function :tag "Function defines section boundaries"))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
320 :group 'align)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
321
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
322 (put 'align-region-separate 'risky-local-variable t)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
323
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
324 (defvar align-rules-list-type
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
325 '(repeat
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
326 (cons
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
327 :tag "Alignment rule"
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
328 (symbol :tag "Title")
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
329 (cons :tag "Required attributes"
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
330 (cons :tag "Regexp"
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
331 (const :tag "(Regular expression to match)" regexp)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
332 (choice :value "\\(\\s-+\\)" regexp function))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
333 (repeat
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
334 :tag "Optional attributes"
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
335 (choice
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
336 (cons :tag "Repeat"
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
337 (const :tag "(Repeat this rule throughout line)"
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
338 repeat)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
339 (boolean :value t))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
340 (cons :tag "Paren group"
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
341 (const :tag "(Parenthesis group to use)" group)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
342 (choice :value 2
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
343 integer (repeat integer)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
344 (cons :tag "Modes"
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
345 (const :tag "(Modes where this rule applies)" modes)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
346 (sexp :value (text-mode)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
347 (cons :tag "Case-fold"
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
348 (const :tag "(Should case be ignored for this rule)"
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
349 case-fold)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
350 (boolean :value t))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
351 (cons :tag "To Tab Stop"
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
352 (const :tag "(Should rule align to tab stops)"
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
353 tab-stop)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
354 (boolean :value nil))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
355 (cons :tag "Valid"
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
356 (const :tag "(Return non-nil if rule is valid)"
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
357 valid)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
358 (function :value t))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
359 (cons :tag "Run If"
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
360 (const :tag "(Return non-nil if rule should run)"
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
361 run-if)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
362 (function :value t))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
363 (cons :tag "Column"
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
364 (const :tag "(Column to fix alignment at)" column)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
365 (choice :value comment-column
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
366 integer symbol))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
367 (cons :tag "Spacing"
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
368 (const :tag "(Amount of spacing to use)" spacing)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
369 (integer :value 1))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
370 (cons :tag "Justify"
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
371 (const :tag "(Should text be right justified)"
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
372 justify)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
373 (boolean :value t))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
374 ;; make sure this stays up-to-date with any changes
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
375 ;; in `align-region-separate'
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
376 (cons :tag "Separate"
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
377 (const :tag "(Separation to use for this rule)"
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
378 separate)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
379 (choice :value "^\\s-*$"
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
380 (const entire)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
381 (const group)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
382 ; (const largest)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
383 regexp function)))))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
384 "The `type' form for any `align-rules-list' variable.")
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
385
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
386 (unless (functionp 'c-guess-basic-syntax)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
387 (autoload 'c-guess-basic-syntax "cc-engine"))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
388
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
389 (defcustom align-rules-list
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
390 `((lisp-second-arg
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
391 (regexp . "\\(^\\s-+[^( \t\n]\\|(\\(\\S-+\\)\\s-+\\)\\S-+\\(\\s-+\\)")
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
392 (group . 3)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
393 (modes . align-lisp-modes)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
394 (run-if . ,(function (lambda () current-prefix-arg))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
395
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
396 (lisp-alist-dot
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
397 (regexp . "\\(\\s-*\\)\\.\\(\\s-*\\)")
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
398 (group . (1 2))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
399 (modes . align-lisp-modes))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
400
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
401 (open-comment
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
402 (regexp . ,(function
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
403 (lambda (end reverse)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
404 (funcall (if reverse 're-search-backward
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
405 're-search-forward)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
406 (concat "[^ \t\n\\\\]"
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
407 (regexp-quote comment-start)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
408 "\\(.+\\)$") end t))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
409 (modes . align-open-comment-modes))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
410
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
411 (c-macro-definition
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
412 (regexp . "^\\s-*#\\s-*define\\s-+\\S-+\\(\\s-+\\)")
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
413 (modes . align-c++-modes))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
414
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
415 (c-variable-declaration
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
416 (regexp . ,(concat "[*&0-9A-Za-z_]>?[&*]*\\(\\s-+[*&]*\\)"
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
417 "[A-Za-z_][0-9A-Za-z:_]*\\s-*\\(\\()\\|"
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
418 "=[^=\n].*\\|(.*)\\|\\(\\[.*\\]\\)*\\)?"
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
419 "\\s-*[;,]\\|)\\s-*$\\)"))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
420 (group . 1)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
421 (modes . align-c++-modes)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
422 (justify . t)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
423 (valid
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
424 . ,(function
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
425 (lambda ()
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
426 (not (or (save-excursion
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
427 (goto-char (match-beginning 1))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
428 (backward-word 1)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
429 (looking-at
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
430 "\\(goto\\|return\\|new\\|delete\\|throw\\)"))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
431 (if (and (boundp 'font-lock-mode) font-lock-mode)
29493
0345c6ffb8b4 Update from author.
Gerd Moellmann <gerd@gnu.org>
parents: 27327
diff changeset
432 (eq (get-text-property (point) 'face)
27327
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
433 'font-lock-comment-face)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
434 (eq (caar (c-guess-basic-syntax)) 'c))))))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
435
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
436 (c-assignment
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
437 (regexp . ,(concat "[^-=!^&*+<>/| \t\n]\\(\\s-*[-=!^&*+<>/|]*\\)"
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
438 "=\\(\\s-*\\)\\([^= \t\n]\\|$\\)"))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
439 (group . (1 2))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
440 (modes . align-c++-modes)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
441 (justify . t)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
442 (tab-stop . nil))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
443
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
444 (perl-assignment
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
445 (regexp . ,(concat "[^=!^&*-+<>/| \t\n]\\(\\s-*\\)=[~>]?"
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
446 "\\(\\s-*\\)\\([^>= \t\n]\\|$\\)"))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
447 (group . (1 2))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
448 (modes . align-perl-modes)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
449 (tab-stop . nil))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
450
29493
0345c6ffb8b4 Update from author.
Gerd Moellmann <gerd@gnu.org>
parents: 27327
diff changeset
451 (python-assignment
0345c6ffb8b4 Update from author.
Gerd Moellmann <gerd@gnu.org>
parents: 27327
diff changeset
452 (regexp . ,(concat "[^=!<> \t\n]\\(\\s-*\\)="
0345c6ffb8b4 Update from author.
Gerd Moellmann <gerd@gnu.org>
parents: 27327
diff changeset
453 "\\(\\s-*\\)\\([^>= \t\n]\\|$\\)"))
0345c6ffb8b4 Update from author.
Gerd Moellmann <gerd@gnu.org>
parents: 27327
diff changeset
454 (group . (1 2))
0345c6ffb8b4 Update from author.
Gerd Moellmann <gerd@gnu.org>
parents: 27327
diff changeset
455 (modes . '(python-mode))
0345c6ffb8b4 Update from author.
Gerd Moellmann <gerd@gnu.org>
parents: 27327
diff changeset
456 (tab-stop . nil))
0345c6ffb8b4 Update from author.
Gerd Moellmann <gerd@gnu.org>
parents: 27327
diff changeset
457
27327
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
458 (make-assignment
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
459 (regexp . "^\\s-*\\w+\\(\\s-*\\):?=\\(\\s-*\\)\\([^\t\n \\\\]\\|$\\)")
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
460 (group . (1 2))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
461 (modes . '(makefile-mode))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
462 (tab-stop . nil))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
463
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
464 (c-comma-delimiter
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
465 (regexp . ",\\(\\s-*\\)[^/ \t\n]")
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
466 (repeat . t)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
467 (modes . align-c++-modes)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
468 (run-if . ,(function (lambda () current-prefix-arg))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
469 ; (valid
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
470 ; . ,(function
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
471 ; (lambda ()
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
472 ; (memq (caar (c-guess-basic-syntax))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
473 ; '(brace-list-intro
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
474 ; brace-list-entry
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
475 ; brace-entry-open))))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
476
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
477 ;; With a prefix argument, comma delimiter will be aligned. Since
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
478 ;; perl-mode doesn't give us enough syntactic information (and we
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
479 ;; don't do our own parsing yet), this rule is too destructive to
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
480 ;; run normally.
29493
0345c6ffb8b4 Update from author.
Gerd Moellmann <gerd@gnu.org>
parents: 27327
diff changeset
481 (basic-comma-delimiter
27327
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
482 (regexp . ",\\(\\s-*\\)[^# \t\n]")
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
483 (repeat . t)
29493
0345c6ffb8b4 Update from author.
Gerd Moellmann <gerd@gnu.org>
parents: 27327
diff changeset
484 (modes . (append align-perl-modes '(python-mode)))
27327
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
485 (run-if . ,(function (lambda () current-prefix-arg))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
486
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
487 (c++-comment
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
488 (regexp . "\\(\\s-*\\)\\(//.*\\|/\\*.*\\*/\\s-*\\)$")
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
489 (modes . align-c++-modes)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
490 (column . comment-column)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
491 (valid . ,(function
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
492 (lambda ()
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
493 (save-excursion
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
494 (goto-char (match-beginning 1))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
495 (not (bolp)))))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
496
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
497 (c-chain-logic
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
498 (regexp . "\\(\\s-*\\)\\(&&\\|||\\|\\<and\\>\\|\\<or\\>\\)")
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
499 (modes . align-c++-modes)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
500 (valid . ,(function
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
501 (lambda ()
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
502 (save-excursion
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
503 (goto-char (match-end 2))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
504 (looking-at "\\s-*\\(/[*/]\\|$\\)"))))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
505
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
506 (perl-chain-logic
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
507 (regexp . "\\(\\s-*\\)\\(&&\\|||\\|\\<and\\>\\|\\<or\\>\\)")
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
508 (modes . align-perl-modes)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
509 (valid . ,(function
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
510 (lambda ()
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
511 (save-excursion
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
512 (goto-char (match-end 2))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
513 (looking-at "\\s-*\\(#\\|$\\)"))))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
514
29493
0345c6ffb8b4 Update from author.
Gerd Moellmann <gerd@gnu.org>
parents: 27327
diff changeset
515 (python-chain-logic
0345c6ffb8b4 Update from author.
Gerd Moellmann <gerd@gnu.org>
parents: 27327
diff changeset
516 (regexp . "\\(\\s-*\\)\\(\\<and\\>\\|\\<or\\>\\)")
0345c6ffb8b4 Update from author.
Gerd Moellmann <gerd@gnu.org>
parents: 27327
diff changeset
517 (modes . '(python-mode))
0345c6ffb8b4 Update from author.
Gerd Moellmann <gerd@gnu.org>
parents: 27327
diff changeset
518 (valid . ,(function
0345c6ffb8b4 Update from author.
Gerd Moellmann <gerd@gnu.org>
parents: 27327
diff changeset
519 (lambda ()
0345c6ffb8b4 Update from author.
Gerd Moellmann <gerd@gnu.org>
parents: 27327
diff changeset
520 (save-excursion
0345c6ffb8b4 Update from author.
Gerd Moellmann <gerd@gnu.org>
parents: 27327
diff changeset
521 (goto-char (match-end 2))
0345c6ffb8b4 Update from author.
Gerd Moellmann <gerd@gnu.org>
parents: 27327
diff changeset
522 (looking-at "\\s-*\\(#\\|$\\|\\\\\\)"))))))
0345c6ffb8b4 Update from author.
Gerd Moellmann <gerd@gnu.org>
parents: 27327
diff changeset
523
0345c6ffb8b4 Update from author.
Gerd Moellmann <gerd@gnu.org>
parents: 27327
diff changeset
524 (c-macro-line-continuation
0345c6ffb8b4 Update from author.
Gerd Moellmann <gerd@gnu.org>
parents: 27327
diff changeset
525 (regexp . "\\(\\s-*\\)\\\\$")
0345c6ffb8b4 Update from author.
Gerd Moellmann <gerd@gnu.org>
parents: 27327
diff changeset
526 (modes . align-c++-modes)
0345c6ffb8b4 Update from author.
Gerd Moellmann <gerd@gnu.org>
parents: 27327
diff changeset
527 (column . c-backslash-column))
0345c6ffb8b4 Update from author.
Gerd Moellmann <gerd@gnu.org>
parents: 27327
diff changeset
528 ; (valid
0345c6ffb8b4 Update from author.
Gerd Moellmann <gerd@gnu.org>
parents: 27327
diff changeset
529 ; . ,(function
0345c6ffb8b4 Update from author.
Gerd Moellmann <gerd@gnu.org>
parents: 27327
diff changeset
530 ; (lambda ()
0345c6ffb8b4 Update from author.
Gerd Moellmann <gerd@gnu.org>
parents: 27327
diff changeset
531 ; (memq (caar (c-guess-basic-syntax))
0345c6ffb8b4 Update from author.
Gerd Moellmann <gerd@gnu.org>
parents: 27327
diff changeset
532 ; '(cpp-macro cpp-macro-cont))))))
0345c6ffb8b4 Update from author.
Gerd Moellmann <gerd@gnu.org>
parents: 27327
diff changeset
533
0345c6ffb8b4 Update from author.
Gerd Moellmann <gerd@gnu.org>
parents: 27327
diff changeset
534 (basic-line-continuation
0345c6ffb8b4 Update from author.
Gerd Moellmann <gerd@gnu.org>
parents: 27327
diff changeset
535 (regexp . "\\(\\s-*\\)\\\\$")
0345c6ffb8b4 Update from author.
Gerd Moellmann <gerd@gnu.org>
parents: 27327
diff changeset
536 (modes . '(python-mode makefile-mode)))
0345c6ffb8b4 Update from author.
Gerd Moellmann <gerd@gnu.org>
parents: 27327
diff changeset
537
27327
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
538 (tex-record-separator
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
539 (regexp . ,(function
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
540 (lambda (end reverse)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
541 (align-match-tex-pattern "&" end reverse))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
542 (group . (1 2))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
543 (modes . align-tex-modes)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
544 (repeat . t))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
545
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
546 (tex-tabbing-separator
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
547 (regexp . ,(function
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
548 (lambda (end reverse)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
549 (align-match-tex-pattern "\\\\[=>]" end reverse))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
550 (group . (1 2))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
551 (modes . align-tex-modes)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
552 (repeat . t)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
553 (run-if . ,(function
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
554 (lambda ()
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
555 (eq major-mode 'latex-mode)))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
556
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
557 (tex-record-break
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
558 (regexp . "\\(\\s-*\\)\\\\\\\\")
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
559 (modes . align-tex-modes))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
560
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
561 ;; With a numeric prefix argument, or C-u, space delimited text
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
562 ;; tables will be aligned.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
563 (text-column
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
564 (regexp . "\\(^\\|\\S-\\)\\(\\s-+\\)\\(\\S-\\|$\\)")
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
565 (group . 2)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
566 (modes . align-text-modes)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
567 (repeat . t)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
568 (run-if . ,(function
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
569 (lambda ()
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
570 (and current-prefix-arg
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
571 (not (eq '- current-prefix-arg)))))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
572
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
573 ;; With a negative prefix argument, lists of dollar figures will
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
574 ;; be aligned.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
575 (text-dollar-figure
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
576 (regexp . "\\$?\\(\\s-+[0-9]+\\)\\.")
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
577 (modes . align-text-modes)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
578 (justify . t)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
579 (run-if . ,(function
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
580 (lambda ()
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
581 (eq '- current-prefix-arg))))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
582 "*An list describing all of the available alignment rules.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
583 The format is:
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
584
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
585 ((TITLE
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
586 (ATTRIBUTE . VALUE) ...)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
587 ...)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
588
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
589 The following attributes are meaningful:
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
590
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
591 `regexp' This required attribute must be either a string describing
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
592 a regular expression, or a function (described below).
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
593 For every line within the section that this regular
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
594 expression matches, the given rule will be applied to that
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
595 line. The exclusion rules denote which part(s) of the
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
596 line should not be modified; the alignment rules cause the
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
597 identified whitespace group to be contracted/expanded such
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
598 that the \"alignment character\" (the character
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
599 immediately following the identified parenthesis group),
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
600 occurs in the same column for every line within the
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
601 alignment section (see `align-region-separate' for a
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
602 description of how the region is broken up into alignment
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
603 sections).
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
604
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
605 The `regexp' attribute describes how the text should be
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
606 treated. Within this regexp, there must be at least one
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
607 group of characters (typically whitespace) identified by
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
608 the special opening and closing parens used in regexp
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
609 expressions (`\\\\(' and `\\\\)') (see the Emacs manual on
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
610 the syntax of regular expressions for more info).
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
611
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
612 If `regexp' is a function, it will be called as a
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
613 replacement for `re-search-forward'. This means that it
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
614 should return nil if nothing is found to match the rule,
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
615 or it should set the match data appropriately, move point
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
616 to the end of the match, and return the value of point.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
617
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
618 `group' For exclusion rules, the group identifies the range of
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
619 characters that should be ignored. For alignment rules,
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
620 these are the characters that will be deleted/expanded for
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
621 the purposes of alignment. The \"alignment character\" is
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
622 always the first character immediately following this
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
623 parenthesis group. This attribute may also be a list of
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
624 integer, in which case multiple alignment characters will
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
625 be aligned, with the list of integer identifying the
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
626 whitespace groups which precede them. The default for
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
627 this attribute is 1.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
628
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
629 `modes' The `modes' attribute, if set, should name a list of
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
630 major modes -- or evaluate to such a value -- in which the
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
631 rule is valid. If not set, the rule will apply to all
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
632 modes.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
633
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
634 `case-fold' If `regexp' is an ordinary regular expression string
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
635 containing alphabetic character, sometimes you may want
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
636 the search to proceed case-insensitively (for languages
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
637 that ignore case, such as pascal for example). In that
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
638 case, set `case-fold' to nil, and the regular expression
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
639 search will ignore case. If `regexp' is set to a
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
640 function, that function must handle the job of ignoring
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
641 case by itself.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
642
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
643 `tab-stop' If the `tab-stop' attribute is set, and non-nil, the
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
644 alignment character will always fall on a tab stop
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
645 (whether it uses tabs to get there or not depends on the
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
646 value of `indent-tabs-mode'). If the `tab-stop' attribute
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
647 is set to nil, tab stops will never be used. Otherwise,
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
648 the value of `align-to-tab-stop' determines whether or not
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
649 to align to a tab stop. The `tab-stop' attribute may also
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
650 be a list of t or nil values, corresponding to the number
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
651 of parenthesis groups specified by the `group' attribute.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
652
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
653 `repeat' If the `repeat' attribute is present, and non-nil, the
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
654 rule will be applied to the line continuously until no
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
655 further matches are found.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
656
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
657 `valid' If the `valid' attribute is set, it will be used to
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
658 determine whether the rule should be invoked. This form
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
659 is evaluated after the regular expression match has been
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
660 performed, so that it is possible to use the results of
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
661 that match to determine whether the alignment should be
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
662 performed. The buffer should not be modified during the
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
663 evaluation of this form.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
664
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
665 `run-if' Like `valid', the `run-if' attribute tests whether the
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
666 rule should be run at all -- even before any searches are
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
667 done to determine if the rule applies to the alignment
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
668 region. This can save time, since `run-if' will only be
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
669 run once for each rule. If it returns nil, the rule will
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
670 not be attempted.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
671
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
672 `column' For alignment rules, if the `column' attribute is set --
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
673 which must be an integer, or a symbol whose value is an
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
674 integer -- it will be used as the column in which to align
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
675 the alignment character. If the text on a particular line
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
676 happens to overrun that column, a single space character,
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
677 or tab stop (see `align-to-tab-stop') will be added
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
678 between the last text character and the alignment
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
679 character.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
680
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
681 `spacing' Alignment rules may also override the amount of spacing
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
682 that would normally be used by providing a `spacing'
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
683 attribute. This must be an integer, or a list of integers
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
684 corresponding to the number of parenthesis groups matched
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
685 by the `group' attribute. If a list of value is used, and
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
686 any of those values is nil, `align-default-spacing' will
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
687 be used for that subgroup. See `align-default-spacing'
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
688 for more details on spacing, tab stops, and how to
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
689 indicate how much spacing should be used. If TAB-STOP is
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
690 present, it will override the value of `align-to-tab-stop'
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
691 for that rule.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
692
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
693 `justify' It is possible with `regexp' and `group' to identify a
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
694 character group that contains more than just whitespace
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
695 characters. By default, any non-whitespace characters in
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
696 that group will also be deleted while aligning the
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
697 alignment character. However, if the `justify' attribute
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
698 is set to a non-nil value, only the initial whitespace
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
699 characters within that group will be deleted. This has
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
700 the effect of right-justifying the characters that remain,
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
701 and can be used for outdenting or just plain old right-
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
702 justification.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
703
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
704 `separate' Each rule can define its own section separator, which
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
705 describes how to identify the separation of \"sections\"
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
706 within the region to be aligned. Setting the `separate'
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
707 attribute overrides the value of `align-region-separate'
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
708 (see the documentation of that variable for possible
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
709 values), and any separation argument passed to `align'."
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
710 :type align-rules-list-type
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
711 :group 'align)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
712
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
713 (put 'align-rules-list 'risky-local-variable t)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
714
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
715 (defvar align-exclude-rules-list-type
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
716 '(repeat
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
717 (cons
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
718 :tag "Exclusion rule"
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
719 (symbol :tag "Title")
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
720 (cons :tag "Required attributes"
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
721 (cons :tag "Regexp"
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
722 (const :tag "(Regular expression to match)" regexp)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
723 (choice :value "\\(\\s-+\\)" regexp function))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
724 (repeat
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
725 :tag "Optional attributes"
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
726 (choice
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
727 (cons :tag "Repeat"
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
728 (const :tag "(Repeat this rule throughout line)"
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
729 repeat)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
730 (boolean :value t))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
731 (cons :tag "Paren group"
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
732 (const :tag "(Parenthesis group to use)" group)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
733 (choice :value 2
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
734 integer (repeat integer)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
735 (cons :tag "Modes"
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
736 (const :tag "(Modes where this rule applies)" modes)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
737 (sexp :value (text-mode)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
738 (cons :tag "Case-fold"
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
739 (const :tag "(Should case be ignored for this rule)"
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
740 case-fold)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
741 (boolean :value t)))))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
742 "The `type' form for any `align-exclude-rules-list' variable.")
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
743
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
744 (defcustom align-exclude-rules-list
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
745 `((exc-dq-string
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
746 (regexp . "\"\\([^\"\n]+\\)\"")
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
747 (repeat . t)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
748 (modes . align-dq-string-modes))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
749
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
750 (exc-sq-string
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
751 (regexp . "'\\([^'\n]+\\)'")
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
752 (repeat . t)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
753 (modes . align-sq-string-modes))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
754
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
755 (exc-open-comment
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
756 (regexp
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
757 . ,(function
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
758 (lambda (end reverse)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
759 (funcall (if reverse 're-search-backward
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
760 're-search-forward)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
761 (concat "[^ \t\n\\\\]"
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
762 (regexp-quote comment-start)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
763 "\\(.+\\)$") end t))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
764 (modes . align-open-comment-modes))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
765
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
766 (exc-c-comment
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
767 (regexp . "/\\*\\(.+\\)\\*/")
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
768 (repeat . t)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
769 (modes . align-c++-modes))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
770
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
771 (exc-c-func-params
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
772 (regexp . "(\\([^)\n]+\\))")
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
773 (repeat . t)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
774 (modes . align-c++-modes))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
775
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
776 (exc-c-macro
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
777 (regexp . "^\\s-*#\\s-*\\(if\\w*\\|endif\\)\\(.*\\)$")
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
778 (group . 2)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
779 (modes . align-c++-modes)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
780 "*An list describing text that should be excluded from alignment.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
781 See the documentation for `align-rules-list' for more info."
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
782 :type align-exclude-rules-list-type
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
783 :group 'align)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
784
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
785 (put 'align-exclude-rules-list 'risky-local-variable t)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
786
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
787 ;;; Internal Variables:
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
788
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
789 (defvar align-mode-rules-list nil
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
790 "Alignment rules specific to the current major mode.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
791 See the variable `align-rules-list' for more details.")
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
792
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
793 (make-variable-buffer-local 'align-mode-rules-list)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
794
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
795 (defvar align-mode-exclude-rules-list nil
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
796 "Alignment exclusion rules specific to the current major mode.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
797 See the variable `align-exclude-rules-list' for more details.")
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
798
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
799 (make-variable-buffer-local 'align-mode-exclude-rules-list)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
800
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
801 (defvar align-highlight-overlays nil
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
802 "The current overlays highlighting the text matched by a rule.")
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
803
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
804 ;; Sample extension rule set, for vhdl-mode. This should properly be
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
805 ;; in vhdl-mode.el itself.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
806
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
807 (defcustom align-vhdl-rules-list
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
808 `((vhdl-declaration
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
809 (regexp . "\\(signal\\|variable\\|constant\\)\\(\\s-+\\)\\S-")
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
810 (group . 2))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
811
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
812 (vhdl-case
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
813 (regexp . "\\(others\\|[^ \t\n=<]\\)\\(\\s-*\\)=>\\(\\s-*\\)\\S-")
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
814 (group . (2 3))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
815 (valid
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
816 . ,(function
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
817 (lambda ()
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
818 (not (string= (downcase (match-string 1))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
819 "others"))))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
820
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
821 (vhdl-colon
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
822 (regexp . "[^ \t\n:]\\(\\s-*\\):\\(\\s-*\\)[^=\n]")
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
823 (group . (1 2)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
824
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
825 (direction
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
826 (regexp . ":\\s-*\\(in\\|out\\|inout\\|buffer\\)\\(\\s-*\\)")
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
827 (group . 2))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
828
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
829 (sig-assign
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
830 (regexp . "[^ \t\n=<]\\(\\s-*\\)<=\\(\\s-*\\)\\S-")
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
831 (group . (1 2)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
832
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
833 (var-assign
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
834 (regexp . "[^ \t\n:]\\(\\s-*\\):="))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
835
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
836 (use-entity
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
837 (regexp . "\\(\\s-+\\)use\\s-+entity")))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
838 "*Alignment rules for `vhdl-mode'. See `align-rules-list' for more info."
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
839 :type align-rules-list-type
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
840 :group 'align)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
841
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
842 (put 'align-vhdl-rules-list 'risky-local-variable t)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
843
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
844 (defun align-set-vhdl-rules ()
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
845 "Setup the `align-mode-rules-list' variable for `vhdl-mode'."
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
846 (setq align-mode-rules-list align-vhdl-rules-list))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
847
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
848 (add-hook 'vhdl-mode-hook 'align-set-vhdl-rules)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
849
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
850 (add-to-list 'align-dq-string-modes 'vhdl-mode)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
851 (add-to-list 'align-open-comment-modes 'vhdl-mode)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
852
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
853 ;;; User Functions:
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
854
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
855 ;;;###autoload
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
856 (defun align (beg end &optional separate rules exclude-rules)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
857 "Attempt to align a region based on a set of alignment rules.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
858 BEG and END mark the region. If BEG and END are specifically set to
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
859 nil (this can only be done programmatically), the beginning and end of
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
860 the current alignment section will be calculated based on the location
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
861 of point, and the value of `align-region-separate' (or possibly each
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
862 rule's `separate' attribute).
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
863
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
864 If SEPARATE is non-nil, it overrides the value of
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
865 `align-region-separate' for all rules, except those that have their
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
866 `separate' attribute set.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
867
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
868 RULES and EXCLUDE-RULES, if either is non-nil, will replace the
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
869 default rule lists defined in `align-rules-list' and
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
870 `align-exclude-rules-list'. See `align-rules-list' for more details
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
871 on the format of these lists."
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
872 (interactive "r")
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
873 (let ((separator
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
874 (or separate
31241
3099993cba0f See ChangeLog
John Wiegley <johnw@newartisans.com>
parents: 30890
diff changeset
875 (if (and (symbolp align-region-separate)
3099993cba0f See ChangeLog
John Wiegley <johnw@newartisans.com>
parents: 30890
diff changeset
876 (boundp align-region-separate))
27327
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
877 (symbol-value align-region-separate)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
878 align-region-separate)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
879 'entire)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
880 (if (not (or ;(eq separator 'largest)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
881 (and (functionp separator)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
882 (not (funcall separator nil nil)))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
883 (align-region beg end separator
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
884 (or rules align-mode-rules-list align-rules-list)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
885 (or exclude-rules align-mode-exclude-rules-list
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
886 align-exclude-rules-list))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
887 (let ((sec-first end)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
888 (sec-last beg))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
889 (align-region beg end
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
890 (or exclude-rules
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
891 align-mode-exclude-rules-list
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
892 align-exclude-rules-list) nil
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
893 separator
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
894 (function
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
895 (lambda (b e mode)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
896 (when (and mode (listp mode))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
897 (setq sec-first (min sec-first b)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
898 sec-last (max sec-last e))))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
899 (if (< sec-first sec-last)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
900 (align-region sec-first sec-last 'entire
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
901 (or rules align-mode-rules-list align-rules-list)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
902 (or exclude-rules align-mode-exclude-rules-list
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
903 align-exclude-rules-list)))))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
904
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
905 ;;;###autoload
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
906 (defun align-regexp (beg end regexp &optional group spacing repeat)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
907 "Align the current region using an ad-hoc rule read from the minibuffer.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
908 BEG and END mark the limits of the region. This function will prompt
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
909 for the REGEXP to align with. If no prefix arg was specified, you
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
910 only need to supply the characters to be lined up and any preceding
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
911 whitespace is replaced. If a prefix arg was specified, the full
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
912 regexp with parenthesized whitespace should be supplied; it will also
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
913 prompt for which parenthesis GROUP within REGEXP to modify, the amount
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
914 of SPACING to use, and whether or not to REPEAT the rule throughout
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
915 the line. See `align-rules-list' for more information about these
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
916 options.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
917
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
918 For example, let's say you had a list of phone numbers, and wanted to
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
919 align them so that the opening parentheses would line up:
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
920
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
921 Fred (123) 456-7890
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
922 Alice (123) 456-7890
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
923 Mary-Anne (123) 456-7890
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
924 Joe (123) 456-7890
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
925
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
926 There is no predefined rule to handle this, but you could easily do it
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
927 using a REGEXP like \"(\". All you would have to do is to mark the
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
928 region, call `align-regexp' and type in that regular expression."
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
929 (interactive
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
930 (append
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
931 (list (min (point) (mark))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
932 (max (point) (mark)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
933 (if current-prefix-arg
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
934 (list (read-string "Complex align using regexp: "
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
935 "\\(\\s-*\\)")
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
936 (string-to-int
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
937 (read-string
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
938 "Parenthesis group to modify (justify if negative): " "1"))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
939 (string-to-int
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
940 (read-string "Amount of spacing (or column if negative): "
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
941 (number-to-string align-default-spacing)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
942 (y-or-n-p "Repeat throughout line? "))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
943 (list (concat "\\(\\s-*\\)"
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
944 (read-string "Align regexp: "))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
945 1 align-default-spacing nil))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
946 (let ((rule
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
947 (list (list nil (cons 'regexp regexp)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
948 (cons 'group (abs group))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
949 (if (< group 0)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
950 (cons 'justify t)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
951 (cons 'bogus nil))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
952 (if (>= spacing 0)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
953 (cons 'spacing spacing)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
954 (cons 'column (abs spacing)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
955 (cons 'repeat repeat)))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
956 (align-region beg end 'entire rule nil nil)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
957
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
958 ;;;###autoload
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
959 (defun align-entire (beg end &optional rules exclude-rules)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
960 "Align the selected region as if it were one alignment section.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
961 BEG and END mark the extent of the region. If RULES or EXCLUDE-RULES
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
962 is set to a list of rules (see `align-rules-list'), it can be used to
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
963 override the default alignment rules that would have been used to
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
964 align that section."
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
965 (interactive "r")
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
966 (align beg end 'entire rules exclude-rules))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
967
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
968 ;;;###autoload
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
969 (defun align-current (&optional rules exclude-rules)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
970 "Call `align' on the current alignment section.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
971 This function assumes you want to align only the current section, and
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
972 so saves you from having to specify the region. If RULES or
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
973 EXCLUDE-RULES is set to a list of rules (see `align-rules-list'), it
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
974 can be used to override the default alignment rules that would have
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
975 been used to align that section."
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
976 (interactive)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
977 (align nil nil nil rules exclude-rules))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
978
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
979 ;;;###autoload
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
980 (defun align-highlight-rule (beg end title &optional rules exclude-rules)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
981 "Highlight the whitespace which a given rule would have modified.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
982 BEG and END mark the extent of the region. TITLE identifies the rule
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
983 that should be highlighted. If RULES or EXCLUDE-RULES is set to a
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
984 list of rules (see `align-rules-list'), it can be used to override the
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
985 default alignment rules that would have been used to identify the text
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
986 to be colored."
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
987 (interactive
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
988 (list (min (mark) (point))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
989 (max (mark) (point))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
990 (completing-read
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
991 "Title of rule to highlight: "
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
992 (mapcar
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
993 (function
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
994 (lambda (rule)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
995 (list (symbol-name (car rule)))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
996 (append (or align-mode-rules-list align-rules-list)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
997 (or align-mode-exclude-rules-list
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
998 align-exclude-rules-list))) nil t)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
999 (let ((ex-rule (assq (intern title)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1000 (or align-mode-exclude-rules-list
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1001 align-exclude-rules-list)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1002 face)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1003 (align-unhighlight-rule)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1004 (align-region
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1005 beg end 'entire
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1006 (or rules (if ex-rule
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1007 (or exclude-rules align-mode-exclude-rules-list
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1008 align-exclude-rules-list)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1009 (or align-mode-rules-list align-rules-list)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1010 (unless ex-rule (or exclude-rules align-mode-exclude-rules-list
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1011 align-exclude-rules-list))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1012 (function
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1013 (lambda (b e mode)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1014 (if (and mode (listp mode))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1015 (if (equal (symbol-name (car mode)) title)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1016 (setq face (cons align-highlight-change-face
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1017 align-highlight-nochange-face))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1018 (setq face nil))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1019 (when face
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1020 (let ((overlay (make-overlay b e)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1021 (setq align-highlight-overlays
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1022 (cons overlay align-highlight-overlays))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1023 (overlay-put overlay 'face
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1024 (if mode
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1025 (car face)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1026 (cdr face)))))))))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1027
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1028 ;;;###autoload
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1029 (defun align-unhighlight-rule ()
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1030 "Remove any highlighting that was added by `align-highlight-rule'."
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1031 (interactive)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1032 (while align-highlight-overlays
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1033 (delete-overlay (car align-highlight-overlays))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1034 (setq align-highlight-overlays
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1035 (cdr align-highlight-overlays))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1036
30254
857a458d569d Added a new feature to align.el
John Wiegley <johnw@newartisans.com>
parents: 29493
diff changeset
1037 ;;;###autoload
857a458d569d Added a new feature to align.el
John Wiegley <johnw@newartisans.com>
parents: 29493
diff changeset
1038 (defun align-newline-and-indent ()
857a458d569d Added a new feature to align.el
John Wiegley <johnw@newartisans.com>
parents: 29493
diff changeset
1039 "A replacement function for `newline-and-indent', aligning as it goes."
857a458d569d Added a new feature to align.el
John Wiegley <johnw@newartisans.com>
parents: 29493
diff changeset
1040 (interactive)
31241
3099993cba0f See ChangeLog
John Wiegley <johnw@newartisans.com>
parents: 30890
diff changeset
1041 (let ((separate (or (if (and (symbolp align-region-separate)
3099993cba0f See ChangeLog
John Wiegley <johnw@newartisans.com>
parents: 30890
diff changeset
1042 (boundp align-region-separate))
30254
857a458d569d Added a new feature to align.el
John Wiegley <johnw@newartisans.com>
parents: 29493
diff changeset
1043 (symbol-value align-region-separate)
857a458d569d Added a new feature to align.el
John Wiegley <johnw@newartisans.com>
parents: 29493
diff changeset
1044 align-region-separate)
857a458d569d Added a new feature to align.el
John Wiegley <johnw@newartisans.com>
parents: 29493
diff changeset
1045 'entire))
857a458d569d Added a new feature to align.el
John Wiegley <johnw@newartisans.com>
parents: 29493
diff changeset
1046 (end (point)))
857a458d569d Added a new feature to align.el
John Wiegley <johnw@newartisans.com>
parents: 29493
diff changeset
1047 (call-interactively 'newline-and-indent)
857a458d569d Added a new feature to align.el
John Wiegley <johnw@newartisans.com>
parents: 29493
diff changeset
1048 (save-excursion
857a458d569d Added a new feature to align.el
John Wiegley <johnw@newartisans.com>
parents: 29493
diff changeset
1049 (forward-line -1)
857a458d569d Added a new feature to align.el
John Wiegley <johnw@newartisans.com>
parents: 29493
diff changeset
1050 (while (not (or (bobp)
857a458d569d Added a new feature to align.el
John Wiegley <johnw@newartisans.com>
parents: 29493
diff changeset
1051 (align-new-section-p (point) end separate)))
857a458d569d Added a new feature to align.el
John Wiegley <johnw@newartisans.com>
parents: 29493
diff changeset
1052 (forward-line -1))
857a458d569d Added a new feature to align.el
John Wiegley <johnw@newartisans.com>
parents: 29493
diff changeset
1053 (align (point) end))))
857a458d569d Added a new feature to align.el
John Wiegley <johnw@newartisans.com>
parents: 29493
diff changeset
1054
27327
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1055 ;;; Internal Functions:
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1056
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1057 (defun align-match-tex-pattern (regexp end &optional reverse)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1058 "Match REGEXP in TeX mode, counting backslashes appropriately.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1059 END denotes the end of the region to be searched, while REVERSE, if
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1060 non-nil, indicates that the search should proceed backward from the
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1061 current position."
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1062 (let (result)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1063 (while
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1064 (and (setq result
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1065 (funcall
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1066 (if reverse 're-search-backward
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1067 're-search-forward)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1068 (concat "\\(\\s-*\\)" regexp
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1069 "\\(\\s-*\\)") end t))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1070 (let ((pos (match-end 1))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1071 (count 0))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1072 (while (and (> pos (point-min))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1073 (eq (char-before pos) ?\\))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1074 (setq count (1+ count) pos (1- pos)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1075 (eq (mod count 2) 1))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1076 (goto-char (match-beginning 2))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1077 result))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1078
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1079 (defun align-new-section-p (beg end separator)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1080 "Is there a section divider between BEG and END?
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1081 SEPARATOR specifies how to look for the section divider. See the
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1082 documentation for `align-region-separate' for more details."
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1083 (cond ((or (not separator)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1084 (eq separator 'entire))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1085 nil)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1086 ((eq separator 'group)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1087 (let ((amount 2))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1088 (save-excursion
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1089 (goto-char end)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1090 (if (bolp)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1091 (setq amount 1)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1092 (> (count-lines beg end) amount)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1093 ((stringp separator)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1094 (save-excursion
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1095 (goto-char beg)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1096 (re-search-forward separator end t)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1097 ((functionp separator)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1098 (funcall separator beg end))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1099 ((listp separator)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1100 (let ((seps separator) yes)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1101 (while seps
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1102 (if (and (>= (car seps) beg)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1103 (<= (car seps) end))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1104 (setq yes t seps nil)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1105 (setq seps (cdr seps))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1106 yes))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1107
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1108 (defun align-adjust-col-for-rule (column rule spacing tab-stop)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1109 "Adjust COLUMN according to the given RULE.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1110 SPACING specifies how much spacing to use.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1111 TAB-STOP specifies whether SPACING refers to tab-stop boundaries."
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1112 (unless spacing
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1113 (setq spacing align-default-spacing))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1114 (if (<= spacing 0)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1115 column
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1116 (if (not tab-stop)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1117 (+ column spacing)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1118 (let ((stops tab-stop-list))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1119 (while stops
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1120 (if (and (> (car stops) column)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1121 (= (setq spacing (1- spacing)) 0))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1122 (setq column (car stops)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1123 stops nil)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1124 (setq stops (cdr stops)))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1125 column)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1126
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1127 (defsubst align-column (pos)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1128 "Given a position in the buffer, state what column it's in.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1129 POS is the position whose column will be taken. Note that this
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1130 function will change the location of point."
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1131 (goto-char pos)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1132 (current-column))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1133
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1134 (defsubst align-regions (regions props rule func)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1135 "Align the regions specified in REGIONS, a list of cons cells.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1136 PROPS describes formatting features specific to the given regions.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1137 RULE specifies exactly how to perform the alignments.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1138 If FUNC is specified, it will be called with each region that would
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1139 have been aligned, rather than modifying the text."
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1140 (while regions
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1141 (save-excursion
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1142 (align-areas (car regions) (car props) rule func))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1143 (setq regions (cdr regions)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1144 props (cdr props))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1145
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1146 (defun align-areas (areas props rule func)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1147 "Given a list of AREAS and formatting PROPS, align according to RULE.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1148 AREAS should be a list of cons cells containing beginning and ending
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1149 markers. This function sweeps through all of the beginning markers,
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1150 finds out which one starts in the furthermost column, and then deletes
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1151 and inserts text such that all of the ending markers occur in the same
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1152 column.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1153
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1154 If FUNC is non-nil, it will be called for each text region that would
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1155 have been aligned. No changes will be made to the buffer."
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1156 (let* ((column (cdr (assq 'column rule)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1157 (fixed (if (symbolp column)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1158 (symbol-value column)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1159 column))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1160 (justify (cdr (assq 'justify rule)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1161 (col (or fixed 0))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1162 (width 0)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1163 ecol change look)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1164
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1165 ;; Determine the alignment column.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1166 (let ((a areas))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1167 (while a
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1168 (unless fixed
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1169 (setq col (max col (align-column (caar a)))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1170 (unless change
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1171 (goto-char (cdar a))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1172 (if ecol
29493
0345c6ffb8b4 Update from author.
Gerd Moellmann <gerd@gnu.org>
parents: 27327
diff changeset
1173 (if (/= ecol (current-column))
27327
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1174 (setq change t))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1175 (setq ecol (current-column))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1176 (when justify
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1177 (goto-char (caar a))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1178 (if (and (re-search-forward "\\s-*" (cdar a) t)
29493
0345c6ffb8b4 Update from author.
Gerd Moellmann <gerd@gnu.org>
parents: 27327
diff changeset
1179 (/= (point) (cdar a)))
27327
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1180 (let ((bcol (current-column)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1181 (setcdr (car a) (cons (point-marker) (cdar a)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1182 (goto-char (cdr (cdar a)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1183 (setq width (max width (- (current-column) bcol))))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1184 (setq a (cdr a))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1185
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1186 (unless fixed
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1187 (setq col (+ (align-adjust-col-for-rule
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1188 col rule (car props) (cdr props)) width)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1189
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1190 ;; Make all ending positions to occur in the goal column. Since
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1191 ;; the whitespace to be modified was already deleted by
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1192 ;; `align-region', all we have to do here is indent.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1193
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1194 (unless change
29493
0345c6ffb8b4 Update from author.
Gerd Moellmann <gerd@gnu.org>
parents: 27327
diff changeset
1195 (setq change (and ecol (/= col ecol))))
27327
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1196
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1197 (when (or func change)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1198 (while areas
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1199 (let ((area (car areas))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1200 (gocol col) cur)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1201 (when area
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1202 (if func
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1203 (funcall func (car area) (cdr area) change)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1204 (if (not (and justify
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1205 (consp (cdr area))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1206 (goto-char (cdr area))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1207 (goto-char (cddr area))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1208 (let ((ecol (current-column)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1209 (goto-char (cadr area))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1210 (setq gocol (- col (- ecol (current-column))))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1211 (setq cur (current-column))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1212 (cond ((< gocol 0) t) ; don't do anything
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1213 ((= cur gocol) t) ; don't need to
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1214 ((< cur gocol) ; just add space
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1215 (indent-to gocol))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1216 (t
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1217 ;; This code works around an oddity in the
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1218 ;; FORCE argument of `move-to-column', which
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1219 ;; tends to screw up markers if there is any
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1220 ;; tabbing.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1221 (let ((endcol (align-column
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1222 (if (and justify
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1223 (consp (cdr area)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1224 (cadr area)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1225 (cdr area))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1226 (abuts (<= gocol
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1227 (align-column (car area)))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1228 (if abuts
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1229 (goto-char (car area))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1230 (move-to-column gocol t))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1231 (let ((here (point)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1232 (move-to-column endcol t)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1233 (delete-region here (point))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1234 (if abuts
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1235 (indent-to (align-adjust-col-for-rule
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1236 (current-column) rule
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1237 (car props) (cdr props)))))))))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1238 (setq areas (cdr areas))))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1239
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1240 (defun align-region (beg end separate rules exclude-rules
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1241 &optional func)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1242 "Align a region based on a given set of alignment rules.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1243 BEG and END specify the region to be aligned. Either may be nil, in
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1244 which case the range will stop at the nearest section division (see
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1245 `align-region-separate', and `align-region-heuristic' for more
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1246 information').
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1247
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1248 The region will be divided into separate alignment sections based on
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1249 the value of SEPARATE.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1250
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1251 RULES and EXCLUDE-RULES are a pair of lists describing how to align
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1252 the region, and which text areas within it should be excluded from
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1253 alignment. See the `align-rules-list' for more information on the
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1254 required format of these two lists.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1255
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1256 If FUNC is specified, no text will be modified. What `align-region'
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1257 will do with the rules is to search for the alignment areas, as it
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1258 regularly would, taking account for exclusions, and then call FUNC,
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1259 first with the beginning and ending of the region to be aligned
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1260 according to that rule (this can be different for each rule, if BEG
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1261 and END were nil), and then with the beginning and ending of each
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1262 text region that the rule would have applied to.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1263
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1264 The signature of FUNC should thus be:
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1265
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1266 (defun my-align-function (beg end mode)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1267 \"If MODE is a rule (a list), return t if BEG to END are to be searched.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1268 Otherwise BEG to END will be a region of text that matches the rule's
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1269 definition, and MODE will be non-nil if any changes are necessary.\"
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1270 (unless (and mode (listp mode))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1271 (message \"Would have aligned from %d to %d...\" beg end)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1272
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1273 This feature (of passing a FUNC) is used internally to locate the
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1274 position of exclusion areas, but could also be used for any other
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1275 purpose where you might want to know where the regions that the
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1276 aligner would have dealt with are."
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1277 (let ((end-mark (and end (copy-marker end t)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1278 (real-beg beg)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1279 (real-end end)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1280 (report (and (not func) align-large-region beg end
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1281 (>= (- end beg) align-large-region)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1282 (rule-index 1)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1283 (rule-count (length rules)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1284 (if (and align-indent-before-aligning real-beg end-mark)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1285 (indent-region real-beg end-mark nil))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1286 (while rules
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1287 (let* ((rule (car rules))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1288 (run-if (assq 'run-if rule))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1289 (modes (assq 'modes rule)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1290 ;; unless the `run-if' form tells us not to, look for the
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1291 ;; rule..
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1292 (unless (or (and modes (not (memq major-mode
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1293 (eval (cdr modes)))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1294 (and run-if (not (funcall (cdr run-if)))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1295 (let* ((current-case-fold case-fold-search)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1296 (case-fold (assq 'case-fold rule))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1297 (regexp (cdr (assq 'regexp rule)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1298 (regfunc (and (functionp regexp) regexp))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1299 (rulesep (assq 'separate rule))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1300 (thissep (if rulesep (cdr rulesep) separate))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1301 same (eol 0)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1302 group group-c
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1303 spacing spacing-c
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1304 tab-stop tab-stop-c
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1305 repeat repeat-c
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1306 valid valid-c
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1307 pos-list first
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1308 regions index
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1309 last-point b e
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1310 save-match-data
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1311 exclude-p
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1312 align-props)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1313 (save-excursion
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1314 ;; if beg and end were not given, figure out what the
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1315 ;; current alignment region should be. Depending on the
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1316 ;; value of `align-region-separate' it's possible for
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1317 ;; each rule to have its own definition of what that
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1318 ;; current alignment section is.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1319 (if real-beg
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1320 (goto-char beg)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1321 (if (or (not thissep) (eq thissep 'entire))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1322 (error "Cannot determine alignment region for '%s'"
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1323 (symbol-name (cdr (assq 'title rule)))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1324 (beginning-of-line)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1325 (while (and (not (eobp))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1326 (looking-at "^\\s-*$"))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1327 (forward-line))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1328 (let* ((here (point))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1329 (start here))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1330 (while (and here
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1331 (let ((terminus
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1332 (and align-region-heuristic
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1333 (- (point)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1334 align-region-heuristic))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1335 (if regfunc
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1336 (funcall regfunc terminus t)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1337 (re-search-backward regexp
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1338 terminus t))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1339 (if (align-new-section-p (point) here thissep)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1340 (setq beg here
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1341 here nil)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1342 (setq here (point))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1343 (if (not here)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1344 (goto-char beg))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1345 (beginning-of-line)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1346 (setq beg (point))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1347 (goto-char start)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1348 (setq here (point))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1349 (while (and here
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1350 (let ((terminus
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1351 (and align-region-heuristic
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1352 (+ (point)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1353 align-region-heuristic))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1354 (if regfunc
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1355 (funcall regfunc terminus nil)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1356 (re-search-forward regexp terminus t))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1357 (if (align-new-section-p here (point) thissep)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1358 (setq end here
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1359 here nil)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1360 (setq here (point))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1361 (if (not here)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1362 (goto-char end))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1363 (forward-line)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1364 (setq end (point)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1365 end-mark (copy-marker end t))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1366 (goto-char beg)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1367
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1368 ;; If we have a region to align, and `func' is set and
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1369 ;; reports back that the region is ok, then align it.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1370 (when (or (not func)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1371 (funcall func beg end rule))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1372 (unwind-protect
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1373 (let (exclude-areas)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1374 ;; determine first of all where the exclusions
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1375 ;; lie in this region
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1376 (when exclude-rules
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1377 ;; guard against a problem with recursion and
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1378 ;; dynamic binding vs. lexical binding, since
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1379 ;; the call to `align-region' below will
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1380 ;; re-enter this function, and rebind
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1381 ;; `exclude-areas'
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1382 (set (setq exclude-areas
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1383 (make-symbol "align-exclude-areas"))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1384 nil)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1385 (align-region
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1386 beg end 'entire
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1387 exclude-rules nil
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1388 `(lambda (b e mode)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1389 (or (and mode (listp mode))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1390 (set (quote ,exclude-areas)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1391 (cons (cons b e)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1392 ,exclude-areas)))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1393 (setq exclude-areas
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1394 (sort (symbol-value exclude-areas)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1395 (function
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1396 (lambda (l r)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1397 (>= (car l) (car r)))))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1398
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1399 ;; set `case-fold-search' according to the
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1400 ;; (optional) `case-fold' property
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1401 (and case-fold
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1402 (setq case-fold-search (cdr case-fold)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1403
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1404 ;; while we can find the rule in the alignment
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1405 ;; region..
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1406 (while (and (< (point) end-mark)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1407 (if regfunc
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1408 (funcall regfunc end-mark nil)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1409 (re-search-forward regexp
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1410 end-mark t)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1411
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1412 ;; give the user some indication of where we
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1413 ;; are, if it's a very large region being
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1414 ;; aligned
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1415 (if report
30254
857a458d569d Added a new feature to align.el
John Wiegley <johnw@newartisans.com>
parents: 29493
diff changeset
1416 (let ((name (symbol-name (car rule))))
857a458d569d Added a new feature to align.el
John Wiegley <johnw@newartisans.com>
parents: 29493
diff changeset
1417 (if name
857a458d569d Added a new feature to align.el
John Wiegley <johnw@newartisans.com>
parents: 29493
diff changeset
1418 (message
857a458d569d Added a new feature to align.el
John Wiegley <johnw@newartisans.com>
parents: 29493
diff changeset
1419 "Aligning `%s' (rule %d of %d) %d%%..."
857a458d569d Added a new feature to align.el
John Wiegley <johnw@newartisans.com>
parents: 29493
diff changeset
1420 rule-index rule-count
857a458d569d Added a new feature to align.el
John Wiegley <johnw@newartisans.com>
parents: 29493
diff changeset
1421 (/ (* (- (point) real-beg) 100)
857a458d569d Added a new feature to align.el
John Wiegley <johnw@newartisans.com>
parents: 29493
diff changeset
1422 (- end-mark real-beg)))
857a458d569d Added a new feature to align.el
John Wiegley <johnw@newartisans.com>
parents: 29493
diff changeset
1423 (message
857a458d569d Added a new feature to align.el
John Wiegley <johnw@newartisans.com>
parents: 29493
diff changeset
1424 "Aligning %d%%..."
857a458d569d Added a new feature to align.el
John Wiegley <johnw@newartisans.com>
parents: 29493
diff changeset
1425 (/ (* (- (point) real-beg) 100)
857a458d569d Added a new feature to align.el
John Wiegley <johnw@newartisans.com>
parents: 29493
diff changeset
1426 (- end-mark real-beg))))))
27327
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1427
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1428 ;; if the search ended us on the beginning of
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1429 ;; the next line, move back to the end of the
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1430 ;; previous line.
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1431 (if (bolp)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1432 (forward-char -1))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1433
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1434 ;; lookup the `group' attribute the first time
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1435 ;; that we need it
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1436 (unless group-c
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1437 (setq group (or (cdr (assq 'group rule)) 1))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1438 (if (listp group)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1439 (setq first (car group))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1440 (setq first group group (list group)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1441 (setq group-c t))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1442
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1443 (unless spacing-c
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1444 (setq spacing (cdr (assq 'spacing rule))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1445 spacing-c t))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1446
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1447 (unless tab-stop-c
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1448 (setq tab-stop
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1449 (let ((rule-ts (assq 'tab-stop rule)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1450 (if rule-ts
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1451 (cdr rule-ts)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1452 (if (symbolp align-to-tab-stop)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1453 (symbol-value align-to-tab-stop)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1454 align-to-tab-stop)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1455 tab-stop-c t))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1456
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1457 ;; test whether we have found a match on the same
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1458 ;; line as a previous match
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1459 (if (> (point) eol)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1460 (setq same nil
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1461 eol (save-excursion
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1462 (end-of-line)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1463 (point-marker))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1464
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1465 ;; lookup the `repeat' attribute the first time
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1466 (or repeat-c
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1467 (setq repeat (cdr (assq 'repeat rule))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1468 repeat-c t))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1469
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1470 ;; lookup the `valid' attribute the first time
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1471 (or valid-c
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1472 (setq valid (assq 'valid rule)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1473 valid-c t))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1474
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1475 ;; remember the beginning position of this rule
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1476 ;; match, and save the match-data, since either
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1477 ;; the `valid' form, or the code that searches for
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1478 ;; section separation, might alter it
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1479 (setq b (match-beginning first)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1480 save-match-data (match-data))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1481
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1482 ;; unless the `valid' attribute is set, and tells
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1483 ;; us that the rule is not valid at this point in
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1484 ;; the code..
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1485 (unless (and valid (not (funcall (cdr valid))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1486
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1487 ;; look to see if this match begins a new
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1488 ;; section. If so, we should align what we've
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1489 ;; collected so far, and then begin collecting
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1490 ;; anew for the next alignment section
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1491 (if (and last-point
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1492 (align-new-section-p last-point b
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1493 thissep))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1494 (progn
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1495 (align-regions regions align-props
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1496 rule func)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1497 (setq last-point (copy-marker b t)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1498 regions nil
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1499 align-props nil))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1500 (setq last-point (copy-marker b t)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1501
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1502 ;; restore the match data
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1503 (set-match-data save-match-data)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1504
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1505 ;; check whether the region to be aligned
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1506 ;; straddles an exclusion area
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1507 (let ((excls exclude-areas))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1508 (setq exclude-p nil)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1509 (while excls
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1510 (if (and (< (match-beginning (car group))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1511 (cdar excls))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1512 (> (match-end (car (last group)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1513 (caar excls)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1514 (setq exclude-p t
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1515 excls nil)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1516 (setq excls (cdr excls)))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1517
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1518 ;; go through the list of parenthesis groups
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1519 ;; matching whitespace text to be
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1520 ;; contracted/expanded (or possibly
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1521 ;; justified, if the `justify' attribute was
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1522 ;; set)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1523 (unless exclude-p
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1524 (let ((g group))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1525 (while g
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1526
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1527 ;; we have to use markers, since
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1528 ;; `align-areas' may modify the buffer
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1529 (setq b (copy-marker
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1530 (match-beginning (car g)) t)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1531 e (copy-marker (match-end (car g)) t))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1532
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1533 ;; record this text region for alignment
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1534 (setq index (if same (1+ index) 0))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1535 (let ((region (cons b e))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1536 (props (cons
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1537 (if (listp spacing)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1538 (car spacing)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1539 spacing)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1540 (if (listp tab-stop)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1541 (car tab-stop)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1542 tab-stop))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1543 (if (nth index regions)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1544 (setcar (nthcdr index regions)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1545 (cons region
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1546 (nth index regions)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1547 (if regions
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1548 (progn
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1549 (nconc regions
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1550 (list (list region)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1551 (nconc align-props (list props)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1552 (setq regions
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1553 (list (list region)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1554 (setq align-props (list props)))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1555
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1556 ;; if any further rule matches are
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1557 ;; found before `eol', then they are
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1558 ;; on the same line as this one; this
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1559 ;; can only happen if the `repeat'
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1560 ;; attribute is non-nil
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1561 (if (listp spacing)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1562 (setq spacing (cdr spacing)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1563 (if (listp tab-stop)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1564 (setq tab-stop (cdr tab-stop)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1565 (setq same t g (cdr g))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1566
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1567 ;; if `repeat' has not been set, move to
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1568 ;; the next line; don't bother searching
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1569 ;; anymore on this one
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1570 (if (and (not repeat) (not (bolp)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1571 (forward-line)))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1572
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1573 ;; when they are no more matches for this rule,
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1574 ;; align whatever was left over
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1575 (if regions
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1576 (align-regions regions align-props rule func)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1577
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1578 (setq case-fold-search current-case-fold)))))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1579 (setq rules (cdr rules)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1580 rule-index (1+ rule-index)))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1581
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1582 (if report
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1583 (message "Aligning...done"))))
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1584
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1585 ;; Provide:
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1586
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1587 (provide 'align)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1588
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1589 (run-hooks 'align-load-hook)
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1590
c7597f93c50d *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1591 ;;; align.el ends here