Mercurial > emacs
annotate lisp/emacs-lisp/cl-indent.el @ 30408:e3e2c9051c5f
Got rid of all byte-compiler warnings on Emacs.
Add to the menu when the file is loaded, not in ada-mode-hook.
Add -toolbar to the default ddd command Switches moved from
ada-prj-default-comp-cmd and ada-prj-default-make-cmd to
ada-prj-default-comp-opt
(ada-add-ada-menu): Remove the map and name parameters Add the Ada
Reference Manual to the menu
(ada-check-current): rewritten as a call to ada-compile-current
(ada-compile): Removed.
(ada-compile-application, ada-compile-current, ada-check-current):
Set the compilation-search-path so that compile.el automatically
finds the sources in src_dir. Automatic scrollong of the
compilation buffer. C-uC-cC-c asks for confirmation before
compiling
(ada-compile-current): New parameter, prj-field
(ada-complete-identifier): Load the .ali file before doing
processing
(ada-find-ali-file-in-dir): prepend build_dir to obj_dir to
conform to gnatmake's behavior.
(ada-find-file-in-dir): New function
(ada-find-references): Set the environment variables for gnatfind
(ada-find-src-file-in-dir): New function.
(ada-first-non-nil): Removed
(ada-gdb-application): Add support for jdb, the java debugger.
(ada-get-ada-file-name): Load the original-file first if not done
yet.
(ada-get-all-references): Handles the new ali syntax (parent types
are found between <>).
(ada-initialize-runtime-library): New function
(ada-mode-hook): Always load a project file when a file is opened,
so that the casing exceptions are correctly read.
(ada-operator-re): Add all missing operators ("abs", "rem", "**").
(ada-parse-prj-file): Use find-file-noselect instead of find-file
to open the project file, since the latter does not work with
speedbar Get default values before loading the prj file, or the
default executable file name is wrong. Use the absolute value of
src_dir to initialize ada-search-directories and
compilation-search-path,... Add the standard runtime library to
the search path for find-file.
(ada-prj-default-debugger): Was missing an opening '{'
(ada-prj-default-bind-opt, ada-prj-default-link-opt): New
variables.
(ada-prj-default-gnatmake-opt): New variable
(ada-prj-find-prj-file): Handles non-file buffers For non-Ada
buffers, the project file is the default one Save the windows
configuration before displaying the menu.
(ada-prj-src-dir, ada-prj-obj-dir, ada-prj-comp-opt,...): Removed
(ada-read-identifier): Fix xrefs on operators (for "mod", "and",
...) regexp-quote identifiers names to support operators +,
-,... in regexps.
(ada-remote): New function.
(ada-run-application): Erase the output buffer before starting the
run Support remote execution of the application. Use
call-process, or the arguments are incorrectly parsed
(ada-set-default-project-file): Reread the content of the active
project file, not the one from the current buffer When a project
file is set as the default project, all directories are
automatically associated with it.
(ada-set-environment): New function
(ada-treat-cmd-string): New special variable ${current}
(ada-treat-cmd-string): Revised. The substitution is now done for
any ${...} substring
(ada-xref-current): If no body was found, compiles the spec
instead. Setup ADA_{SOURCE,OBJECTS}_PATH before running the
compiler to get rid of command line length limitations.
(ada-xref-get-project-field): New function
(ada-xref-project-files): New variable
(ada-xref-runtime-library-specs-path)
(ada-xref-runtime-library-ali-path): New variables
(ada-xref-set-default-prj-values): Default run command now does a
cd to the build directory. New field: main_unit Provide a default
file name even if the current buffer has no prj file.
author | Gerd Moellmann <gerd@gnu.org> |
---|---|
date | Mon, 24 Jul 2000 11:13:11 +0000 |
parents | 3bf98b923af0 |
children | 61c2f9fcb8f6 |
rev | line source |
---|---|
662
8a533acedb77
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
257
diff
changeset
|
1 ;;; cl-indent.el --- enhanced lisp-indent mode |
8a533acedb77
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
257
diff
changeset
|
2 |
257 | 3 ;; Copyright (C) 1987 Free Software Foundation, Inc. |
2307
10e417efb12a
Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
845
diff
changeset
|
4 |
14040 | 5 ;; Author: Richard Mlynarik <mly@eddie.mit.edu> |
2307
10e417efb12a
Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
845
diff
changeset
|
6 ;; Created: July 1987 |
845 | 7 ;; Maintainer: FSF |
8 ;; Keywords: lisp, tools | |
9 | |
257 | 10 ;; This file is part of GNU Emacs. |
11 | |
12 ;; GNU Emacs is free software; you can redistribute it and/or modify | |
13 ;; it under the terms of the GNU General Public License as published by | |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
14 ;; the Free Software Foundation; either version 2, or (at your option) |
257 | 15 ;; any later version. |
16 | |
17 ;; GNU Emacs is distributed in the hope that it will be useful, | |
18 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
20 ;; GNU General Public License for more details. | |
21 | |
22 ;; You should have received a copy of the GNU General Public License | |
14169 | 23 ;; along with GNU Emacs; see the file COPYING. If not, write to the |
24 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
25 ;; Boston, MA 02111-1307, USA. | |
257 | 26 |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
27 ;;; Commentary: |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
28 |
2307
10e417efb12a
Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
845
diff
changeset
|
29 ;; This package supplies a single entry point, common-lisp-indent-function, |
10e417efb12a
Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
845
diff
changeset
|
30 ;; which performs indentation in the preferred style for Common Lisp code. |
10e417efb12a
Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
845
diff
changeset
|
31 ;; To enable it: |
10e417efb12a
Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
845
diff
changeset
|
32 ;; |
10e417efb12a
Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
845
diff
changeset
|
33 ;; (setq lisp-indent-function 'common-lisp-indent-function) |
10e417efb12a
Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
845
diff
changeset
|
34 |
257 | 35 ;;>> TODO |
36 ;; :foo | |
37 ;; bar | |
38 ;; :baz | |
39 ;; zap | |
40 ;; &key (like &body)?? | |
41 | |
42 ;; &rest 1 in lambda-lists doesn't work | |
43 ;; -- really want (foo bar | |
44 ;; baz) | |
45 ;; not (foo bar | |
46 ;; baz) | |
47 ;; Need something better than &rest for such cases | |
48 | |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
49 ;;; Code: |
257 | 50 |
17413
9fa0ed8da0b1
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
14169
diff
changeset
|
51 (defgroup lisp-indent nil |
9fa0ed8da0b1
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
14169
diff
changeset
|
52 "Indentation in Lisp" |
9fa0ed8da0b1
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
14169
diff
changeset
|
53 :group 'lisp) |
9fa0ed8da0b1
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
14169
diff
changeset
|
54 |
9fa0ed8da0b1
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
14169
diff
changeset
|
55 |
9fa0ed8da0b1
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
14169
diff
changeset
|
56 (defcustom lisp-indent-maximum-backtracking 3 |
257 | 57 "*Maximum depth to backtrack out from a sublist for structured indentation. |
58 If this variable is 0, no backtracking will occur and forms such as flet | |
17413
9fa0ed8da0b1
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
14169
diff
changeset
|
59 may not be correctly indented." |
9fa0ed8da0b1
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
14169
diff
changeset
|
60 :type 'integer |
9fa0ed8da0b1
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
14169
diff
changeset
|
61 :group 'lisp-indent) |
257 | 62 |
17413
9fa0ed8da0b1
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
14169
diff
changeset
|
63 (defcustom lisp-tag-indentation 1 |
257 | 64 "*Indentation of tags relative to containing list. |
17413
9fa0ed8da0b1
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
14169
diff
changeset
|
65 This variable is used by the function `lisp-indent-tagbody'." |
9fa0ed8da0b1
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
14169
diff
changeset
|
66 :type 'integer |
9fa0ed8da0b1
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
14169
diff
changeset
|
67 :group 'lisp-indent) |
257 | 68 |
17413
9fa0ed8da0b1
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
14169
diff
changeset
|
69 (defcustom lisp-tag-body-indentation 3 |
257 | 70 "*Indentation of non-tagged lines relative to containing list. |
71 This variable is used by the function `lisp-indent-tagbody' to indent normal | |
72 lines (lines without tags). | |
73 The indentation is relative to the indentation of the parenthesis enclosing | |
74 the special form. If the value is t, the body of tags will be indented | |
75 as a block at the same indentation as the first s-expression following | |
76 the tag. In this case, any forms before the first tag are indented | |
17413
9fa0ed8da0b1
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
14169
diff
changeset
|
77 by `lisp-body-indent'." |
9fa0ed8da0b1
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
14169
diff
changeset
|
78 :type 'integer |
9fa0ed8da0b1
Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents:
14169
diff
changeset
|
79 :group 'lisp-indent) |
257 | 80 |
81 | |
22212
b95ba3830bc9
(lisp-indent-error-function): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
22180
diff
changeset
|
82 (defvar lisp-indent-error-function) |
22858
77090a500417
(lisp-indent-defun-method): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
22756
diff
changeset
|
83 (defvar lisp-indent-defun-method '(4 &lambda &body)) |
22212
b95ba3830bc9
(lisp-indent-error-function): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
22180
diff
changeset
|
84 |
257 | 85 ;;;###autoload |
86 (defun common-lisp-indent-function (indent-point state) | |
87 (let ((normal-indent (current-column))) | |
88 ;; Walk up list levels until we see something | |
89 ;; which does special things with subforms. | |
90 (let ((depth 0) | |
91 ;; Path describes the position of point in terms of | |
3591
507f64624555
Apply typo patches from Paul Eggert.
Jim Blandy <jimb@redhat.com>
parents:
2307
diff
changeset
|
92 ;; list-structure with respect to containing lists. |
257 | 93 ;; `foo' has a path of (0 4 1) in `((a b c (d foo) f) g)' |
94 (path ()) | |
95 ;; set non-nil when somebody works out the indentation to use | |
96 calculated | |
97 (last-point indent-point) | |
98 ;; the position of the open-paren of the innermost containing list | |
99 (containing-form-start (elt state 1)) | |
100 ;; the column of the above | |
101 sexp-column) | |
102 ;; Move to start of innermost containing list | |
103 (goto-char containing-form-start) | |
104 (setq sexp-column (current-column)) | |
105 ;; Look over successively less-deep containing forms | |
106 (while (and (not calculated) | |
107 (< depth lisp-indent-maximum-backtracking)) | |
108 (let ((containing-sexp (point))) | |
109 (forward-char 1) | |
110 (parse-partial-sexp (point) indent-point 1 t) | |
111 ;; Move to the car of the relevant containing form | |
112 (let (tem function method) | |
113 (if (not (looking-at "\\sw\\|\\s_")) | |
114 ;; This form doesn't seem to start with a symbol | |
115 (setq function nil method nil) | |
116 (setq tem (point)) | |
117 (forward-sexp 1) | |
22858
77090a500417
(lisp-indent-defun-method): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
22756
diff
changeset
|
118 (setq function (downcase (buffer-substring-no-properties |
77090a500417
(lisp-indent-defun-method): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
22756
diff
changeset
|
119 tem (point)))) |
257 | 120 (goto-char tem) |
121 (setq tem (intern-soft function) | |
122 method (get tem 'common-lisp-indent-function)) | |
123 (cond ((and (null method) | |
124 (string-match ":[^:]+" function)) | |
125 ;; The pleblisp package feature | |
126 (setq function (substring function | |
127 (1+ (match-beginning 0))) | |
128 method (get (intern-soft function) | |
129 'common-lisp-indent-function))) | |
130 ((and (null method)) | |
131 ;; backwards compatibility | |
132 (setq method (get tem 'lisp-indent-function))))) | |
133 (let ((n 0)) | |
134 ;; How far into the containing form is the current form? | |
135 (if (< (point) indent-point) | |
136 (while (condition-case () | |
137 (progn | |
138 (forward-sexp 1) | |
139 (if (>= (point) indent-point) | |
140 nil | |
141 (parse-partial-sexp (point) | |
142 indent-point 1 t) | |
143 (setq n (1+ n)) | |
144 t)) | |
145 (error nil)))) | |
146 (setq path (cons n path))) | |
147 | |
148 ;; backwards compatibility. | |
149 (cond ((null function)) | |
150 ((null method) | |
22858
77090a500417
(lisp-indent-defun-method): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
22756
diff
changeset
|
151 (when (null (cdr path)) |
257 | 152 ;; (package prefix was stripped off above) |
153 (setq method (cond ((string-match "\\`def" | |
154 function) | |
22858
77090a500417
(lisp-indent-defun-method): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
22756
diff
changeset
|
155 lisp-indent-defun-method) |
257 | 156 ((string-match "\\`\\(with\\|do\\)-" |
157 function) | |
22858
77090a500417
(lisp-indent-defun-method): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
22756
diff
changeset
|
158 '(&lambda &body)))))) |
257 | 159 ;; backwards compatibility. Bletch. |
160 ((eq method 'defun) | |
22858
77090a500417
(lisp-indent-defun-method): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
22756
diff
changeset
|
161 (setq method lisp-indent-defun-method))) |
257 | 162 |
163 (cond ((and (memq (char-after (1- containing-sexp)) '(?\' ?\`)) | |
26047
e6efd0ace0f3
(common-lisp-indent-function): Use `eq' instead of `eql'.
Gerd Moellmann <gerd@gnu.org>
parents:
23725
diff
changeset
|
164 (not (eq (char-after (- containing-sexp 2)) ?\#))) |
257 | 165 ;; No indentation for "'(...)" elements |
166 (setq calculated (1+ sexp-column))) | |
29797
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
167 ((or (eq (char-after (1- containing-sexp)) ?\,) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
168 (and (eq (char-after (1- containing-sexp)) ?\@) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
169 (eq (char-after (- containing-sexp 2)) ?\,))) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
170 ;; ",(...)" or ",@(...)" |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
171 (setq calculated normal-indent)) |
26047
e6efd0ace0f3
(common-lisp-indent-function): Use `eq' instead of `eql'.
Gerd Moellmann <gerd@gnu.org>
parents:
23725
diff
changeset
|
172 ((eq (char-after (1- containing-sexp)) ?\#) |
257 | 173 ;; "#(...)" |
174 (setq calculated (1+ sexp-column))) | |
175 ((null method)) | |
176 ((integerp method) | |
177 ;; convenient top-level hack. | |
178 ;; (also compatible with lisp-indent-function) | |
179 ;; The number specifies how many `distinguished' | |
180 ;; forms there are before the body starts | |
181 ;; Equivalent to (4 4 ... &body) | |
182 (setq calculated (cond ((cdr path) | |
183 normal-indent) | |
184 ((<= (car path) method) | |
185 ;; `distinguished' form | |
186 (list (+ sexp-column 4) | |
187 containing-form-start)) | |
188 ((= (car path) (1+ method)) | |
189 ;; first body form. | |
190 (+ sexp-column lisp-body-indent)) | |
191 (t | |
192 ;; other body form | |
193 normal-indent)))) | |
194 ((symbolp method) | |
29797
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
195 (let ((lisp-indent-error-function function)) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
196 (setq calculated (funcall method |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
197 path state indent-point |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
198 sexp-column normal-indent)))) |
257 | 199 (t |
29797
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
200 (let ((lisp-indent-error-function function)) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
201 (setq calculated (lisp-indent-259 |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
202 method path state indent-point |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
203 sexp-column normal-indent)))))) |
257 | 204 (goto-char containing-sexp) |
205 (setq last-point containing-sexp) | |
22858
77090a500417
(lisp-indent-defun-method): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
22756
diff
changeset
|
206 (unless calculated |
257 | 207 (condition-case () |
208 (progn (backward-up-list 1) | |
209 (setq depth (1+ depth))) | |
210 (error (setq depth lisp-indent-maximum-backtracking)))))) | |
211 calculated))) | |
212 | |
213 | |
214 (defun lisp-indent-report-bad-format (m) | |
215 (error "%s has a badly-formed %s property: %s" | |
216 ;; Love those free variable references!! | |
22212
b95ba3830bc9
(lisp-indent-error-function): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
22180
diff
changeset
|
217 lisp-indent-error-function 'common-lisp-indent-function m)) |
257 | 218 |
219 ;; Blame the crufty control structure on dynamic scoping | |
220 ;; -- not on me! | |
221 (defun lisp-indent-259 (method path state indent-point | |
222 sexp-column normal-indent) | |
223 (catch 'exit | |
224 (let ((p path) | |
225 (containing-form-start (elt state 1)) | |
226 n tem tail) | |
227 ;; Isn't tail-recursion wonderful? | |
228 (while p | |
229 ;; This while loop is for destructuring. | |
230 ;; p is set to (cdr p) each iteration. | |
231 (if (not (consp method)) (lisp-indent-report-bad-format method)) | |
232 (setq n (1- (car p)) | |
233 p (cdr p) | |
234 tail nil) | |
235 (while n | |
236 ;; This while loop is for advancing along a method | |
237 ;; until the relevant (possibly &rest/&body) pattern | |
238 ;; is reached. | |
239 ;; n is set to (1- n) and method to (cdr method) | |
240 ;; each iteration. | |
241 (setq tem (car method)) | |
242 | |
243 (or (eq tem 'nil) ;default indentation | |
29797
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
244 (eq tem '&lambda) ;lambda list |
257 | 245 (and (eq tem '&body) (null (cdr method))) |
246 (and (eq tem '&rest) | |
29797
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
247 (consp (cdr method)) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
248 (null (cddr method))) |
257 | 249 (integerp tem) ;explicit indentation specified |
250 (and (consp tem) ;destructuring | |
251 (eq (car tem) '&whole) | |
29797
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
252 (or (symbolp (cadr tem)) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
253 (integerp (cadr tem)))) |
257 | 254 (and (symbolp tem) ;a function to call to do the work. |
255 (null (cdr method))) | |
256 (lisp-indent-report-bad-format method)) | |
257 | |
258 (cond ((and tail (not (consp tem))) | |
259 ;; indent tail of &rest in same way as first elt of rest | |
260 (throw 'exit normal-indent)) | |
261 ((eq tem '&body) | |
262 ;; &body means (&rest <lisp-body-indent>) | |
263 (throw 'exit | |
264 (if (and (= n 0) ;first body form | |
265 (null p)) ;not in subforms | |
266 (+ sexp-column | |
267 lisp-body-indent) | |
268 normal-indent))) | |
269 ((eq tem '&rest) | |
270 ;; this pattern holds for all remaining forms | |
271 (setq tail (> n 0) | |
272 n 0 | |
273 method (cdr method))) | |
274 ((> n 0) | |
275 ;; try next element of pattern | |
276 (setq n (1- n) | |
277 method (cdr method)) | |
278 (if (< n 0) | |
279 ;; Too few elements in pattern. | |
280 (throw 'exit normal-indent))) | |
281 ((eq tem 'nil) | |
282 (throw 'exit (list normal-indent containing-form-start))) | |
22858
77090a500417
(lisp-indent-defun-method): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
22756
diff
changeset
|
283 ((eq tem '&lambda) |
77090a500417
(lisp-indent-defun-method): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
22756
diff
changeset
|
284 (throw 'exit |
77090a500417
(lisp-indent-defun-method): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
22756
diff
changeset
|
285 (cond ((null p) |
77090a500417
(lisp-indent-defun-method): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
22756
diff
changeset
|
286 (list (+ sexp-column 4) containing-form-start)) |
77090a500417
(lisp-indent-defun-method): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
22756
diff
changeset
|
287 ((null (cdr p)) |
77090a500417
(lisp-indent-defun-method): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
22756
diff
changeset
|
288 (+ sexp-column 1)) |
77090a500417
(lisp-indent-defun-method): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
22756
diff
changeset
|
289 (t normal-indent)))) |
257 | 290 ((integerp tem) |
291 (throw 'exit | |
292 (if (null p) ;not in subforms | |
293 (list (+ sexp-column tem) containing-form-start) | |
294 normal-indent))) | |
295 ((symbolp tem) ;a function to call | |
296 (throw 'exit | |
297 (funcall tem path state indent-point | |
298 sexp-column normal-indent))) | |
299 (t | |
300 ;; must be a destructing frob | |
301 (if (not (null p)) | |
302 ;; descend | |
22858
77090a500417
(lisp-indent-defun-method): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
22756
diff
changeset
|
303 (setq method (cddr tem) |
257 | 304 n nil) |
22858
77090a500417
(lisp-indent-defun-method): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
22756
diff
changeset
|
305 (setq tem (cadr tem)) |
257 | 306 (throw 'exit |
307 (cond (tail | |
308 normal-indent) | |
309 ((eq tem 'nil) | |
310 (list normal-indent | |
311 containing-form-start)) | |
312 ((integerp tem) | |
313 (list (+ sexp-column tem) | |
314 containing-form-start)) | |
315 (t | |
316 (funcall tem path state indent-point | |
317 sexp-column normal-indent)))))))))))) | |
318 | |
319 (defun lisp-indent-tagbody (path state indent-point sexp-column normal-indent) | |
320 (if (not (null (cdr path))) | |
321 normal-indent | |
322 (save-excursion | |
323 (goto-char indent-point) | |
324 (beginning-of-line) | |
325 (skip-chars-forward " \t") | |
326 (list (cond ((looking-at "\\sw\\|\\s_") | |
327 ;; a tagbody tag | |
328 (+ sexp-column lisp-tag-indentation)) | |
329 ((integerp lisp-tag-body-indentation) | |
330 (+ sexp-column lisp-tag-body-indentation)) | |
331 ((eq lisp-tag-body-indentation 't) | |
332 (condition-case () | |
333 (progn (backward-sexp 1) (current-column)) | |
334 (error (1+ sexp-column)))) | |
335 (t (+ sexp-column lisp-body-indent))) | |
336 ; (cond ((integerp lisp-tag-body-indentation) | |
337 ; (+ sexp-column lisp-tag-body-indentation)) | |
338 ; ((eq lisp-tag-body-indentation 't) | |
339 ; normal-indent) | |
340 ; (t | |
341 ; (+ sexp-column lisp-body-indent))) | |
342 (elt state 1) | |
343 )))) | |
344 | |
345 (defun lisp-indent-do (path state indent-point sexp-column normal-indent) | |
346 (if (>= (car path) 3) | |
347 (let ((lisp-tag-body-indentation lisp-body-indent)) | |
348 (funcall (function lisp-indent-tagbody) | |
29797
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
349 path state indent-point sexp-column normal-indent)) |
257 | 350 (funcall (function lisp-indent-259) |
29797
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
351 '((&whole nil &rest |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
352 ;; the following causes weird indentation |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
353 ;;(&whole 1 1 2 nil) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
354 ) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
355 (&whole nil &rest 1)) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
356 path state indent-point sexp-column normal-indent))) |
257 | 357 |
358 (defun lisp-indent-function-lambda-hack (path state indent-point | |
359 sexp-column normal-indent) | |
360 ;; indent (function (lambda () <newline> <body-forms>)) kludgily. | |
361 (if (or (cdr path) ; wtf? | |
362 (> (car path) 3)) | |
363 ;; line up under previous body form | |
364 normal-indent | |
365 ;; line up under function rather than under lambda in order to | |
366 ;; conserve horizontal space. (Which is what #' is for.) | |
367 (condition-case () | |
368 (save-excursion | |
369 (backward-up-list 2) | |
370 (forward-char 1) | |
371 (if (looking-at "\\(lisp:+\\)?function\\(\\Sw\\|\\S_\\)") | |
372 (+ lisp-body-indent -1 (current-column)) | |
373 (+ sexp-column lisp-body-indent))) | |
374 (error (+ sexp-column lisp-body-indent))))) | |
375 | |
376 | |
377 (let ((l '((block 1) | |
29797
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
378 (case (4 &rest (&whole 2 &rest 1))) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
379 (ccase . case) (ecase . case) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
380 (condition-case ((1 4) (&whole 2 ((0 1) (1 3) (2 &body))))) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
381 (typecase . case) (etypecase . case) (ctypecase . case) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
382 (catch 1) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
383 (cond (&rest (&whole 2 &rest 1))) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
384 (defvar (4 2 2)) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
385 (defclass ((&whole 4 &rest (&whole 2 &rest 1)) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
386 &rest (&whole 2 &rest 1))) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
387 (defconstant . defvar) |
27231
e9725bb98b6e
Add defclass, define-condition, defmethod, symbol-macrolet.
Dave Love <fx@gnu.org>
parents:
26047
diff
changeset
|
388 (defcustom (4 2 2 2)) |
29797
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
389 (defparameter . defvar) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
390 (define-modify-macro |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
391 (4 &body)) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
392 (defsetf (4 &lambda 4 &body)) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
393 (defun (4 &lambda &body)) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
394 (define-setf-method . defun) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
395 (define-setf-expander . defun) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
396 (defmacro . defun) (defsubst . defun) (deftype . defun) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
397 (defmethod (4 4 (&whole 4 &rest 1) &body)) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
398 (defpackage (4 2)) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
399 (defstruct ((&whole 4 &rest (&whole 2 &rest 1)) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
400 &rest (&whole 2 &rest 1))) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
401 (destructuring-bind |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
402 ((&whole 6 &rest 1) 4 &body)) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
403 (do lisp-indent-do) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
404 (do* . do) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
405 (dolist ((&whole 4 2 1) &body)) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
406 (dotimes . dolist) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
407 (eval-when 1) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
408 (flet ((&whole 4 &rest (&whole 1 &lambda &body)) &body)) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
409 (labels . flet) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
410 (macrolet . flet) |
22858
77090a500417
(lisp-indent-defun-method): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
22756
diff
changeset
|
411 (handler-case (4 &rest (&whole 2 &lambda &body))) |
22756
6103b46f200a
Indent `restart-case', `handler-bind' and `restart-bind' correctly.
Richard M. Stallman <rms@gnu.org>
parents:
22731
diff
changeset
|
412 (restart-case . handler-case) |
29797
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
413 ;; `else-body' style |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
414 (if (nil nil &body)) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
415 ;; single-else style (then and else equally indented) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
416 (if (&rest nil)) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
417 (lambda (&lambda &rest lisp-indent-function-lambda-hack)) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
418 (let ((&whole 4 &rest (&whole 1 1 2)) &body)) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
419 (let* . let) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
420 (compiler-let . let) ;barf |
22756
6103b46f200a
Indent `restart-case', `handler-bind' and `restart-bind' correctly.
Richard M. Stallman <rms@gnu.org>
parents:
22731
diff
changeset
|
421 (handler-bind . let) (restart-bind . let) |
29797
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
422 (locally 1) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
423 ;(loop ...) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
424 (multiple-value-bind |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
425 ((&whole 6 &rest 1) 4 &body)) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
426 (multiple-value-call |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
427 (4 &body)) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
428 (multiple-value-prog1 1) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
429 (multiple-value-setq (4 2)) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
430 (multiple-value-setf . multiple-value-setq) |
27872
277f4365f2fa
Indent `pprint-logical-block' properly.
Gerd Moellmann <gerd@gnu.org>
parents:
27802
diff
changeset
|
431 (pprint-logical-block (4 2)) |
29797
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
432 (print-unreadable-object ((&whole 4 1 &rest 1) &body)) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
433 ;; Combines the worst features of BLOCK, LET and TAGBODY |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
434 (prog (&lambda &rest lisp-indent-tagbody)) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
435 (prog* . prog) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
436 (prog1 1) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
437 (prog2 2) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
438 (progn 0) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
439 (progv (4 4 &body)) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
440 (return 0) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
441 (return-from (nil &body)) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
442 (symbol-macrolet . multiple-value-bind) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
443 (tagbody lisp-indent-tagbody) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
444 (throw 1) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
445 (unless 1) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
446 (unwind-protect (5 &body)) |
22180
485917486caf
Indent `with-standard-io-syntax' correctly.
Richard M. Stallman <rms@gnu.org>
parents:
21750
diff
changeset
|
447 (when 1) |
23725
222d58586999
indent `with-output-to-string' as a CL
Karl Heuer <kwzh@gnu.org>
parents:
22913
diff
changeset
|
448 (with-output-to-string (4 2)) |
22180
485917486caf
Indent `with-standard-io-syntax' correctly.
Richard M. Stallman <rms@gnu.org>
parents:
21750
diff
changeset
|
449 (with-standard-io-syntax (2))))) |
257 | 450 (while l |
22858
77090a500417
(lisp-indent-defun-method): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
22756
diff
changeset
|
451 (put (caar l) 'common-lisp-indent-function |
29797
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
452 (if (symbolp (cdar l)) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
453 (get (cdar l) 'common-lisp-indent-function) |
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
454 (car (cdar l)))) |
257 | 455 (setq l (cdr l)))) |
456 | |
457 | |
458 ;(defun foo (x) | |
459 ; (tagbody | |
460 ; foo | |
461 ; (bar) | |
462 ; baz | |
463 ; (when (losing) | |
464 ; (with-big-loser | |
465 ; (yow) | |
466 ; ((lambda () | |
467 ; foo) | |
468 ; big))) | |
469 ; (flet ((foo (bar baz zap) | |
470 ; (zip)) | |
471 ; (zot () | |
472 ; quux)) | |
473 ; (do () | |
474 ; ((lose) | |
475 ; (foo 1)) | |
476 ; (quux) | |
477 ; foo | |
478 ; (lose)) | |
479 ; (cond ((x) | |
480 ; (win 1 2 | |
481 ; (foo))) | |
482 ; (t | |
483 ; (lose | |
484 ; 3)))))) | |
29797
3bf98b923af0
handle print-unreadable-object
Sam Steingold <sds@gnu.org>
parents:
27872
diff
changeset
|
485 |
257 | 486 |
487 ;(put 'while 'common-lisp-indent-function 1) | |
488 ;(put 'defwrapper'common-lisp-indent-function ...) | |
489 ;(put 'def 'common-lisp-indent-function ...) | |
490 ;(put 'defflavor 'common-lisp-indent-function ...) | |
491 ;(put 'defsubst 'common-lisp-indent-function ...) | |
492 | |
493 ;(put 'with-restart 'common-lisp-indent-function '((1 4 ((* 1))) (2 &body))) | |
494 ;(put 'restart-case 'common-lisp-indent-function '((1 4) (* 2 ((0 1) (* 1))))) | |
495 ;(put 'define-condition 'common-lisp-indent-function '((1 6) (2 6 ((* 1))) (3 4 ((* 1))) (4 &body))) | |
496 ;(put 'with-condition-handler 'common-lisp-indent-function '((1 4 ((* 1))) (2 &body))) | |
497 ;(put 'condition-case 'common-lisp-indent-function '((1 4) (* 2 ((0 1) (1 3) (2 &body))))) | |
498 | |
662
8a533acedb77
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
257
diff
changeset
|
499 ;;; cl-indent.el ends here |