]> code.delx.au - gnu-emacs/blob - lisp/progmodes/cc-vars.el
Byte compile dynamic.
[gnu-emacs] / lisp / progmodes / cc-vars.el
1 ;;; cc-vars.el --- user customization variables for CC Mode
2
3 ;; Copyright (C) 1985,1987,1992-1999 Free Software Foundation, Inc.
4
5 ;; Authors: 1998-1999 Barry A. Warsaw and Martin Stjernholm
6 ;; 1992-1997 Barry A. Warsaw
7 ;; 1987 Dave Detlefs and Stewart Clamen
8 ;; 1985 Richard M. Stallman
9 ;; Maintainer: bug-cc-mode@gnu.org
10 ;; Created: 22-Apr-1997 (split from cc-mode.el)
11 ;; Version: See cc-mode.el
12 ;; Keywords: c languages oop
13
14 ;; This file is part of GNU Emacs.
15
16 ;; GNU Emacs is free software; you can redistribute it and/or modify
17 ;; it under the terms of the GNU General Public License as published by
18 ;; the Free Software Foundation; either version 2, or (at your option)
19 ;; any later version.
20
21 ;; GNU Emacs is distributed in the hope that it will be useful,
22 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
23 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24 ;; GNU General Public License for more details.
25
26 ;; You should have received a copy of the GNU General Public License
27 ;; along with GNU Emacs; see the file COPYING. If not, write to the
28 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
29 ;; Boston, MA 02111-1307, USA.
30
31 (eval-when-compile
32 (let ((load-path
33 (if (and (boundp 'byte-compile-current-file)
34 (stringp byte-compile-current-file))
35 (cons (file-name-directory byte-compile-current-file)
36 load-path)
37 load-path)))
38 (load "cc-defs" nil t)))
39 (require 'custom)
40
41
42 \f
43 ;;; Helpers
44
45 ;; This widget will show up in newer versions of the Custom library
46 (or (get 'other 'widget-type)
47 (define-widget 'other 'sexp
48 "Matches everything, but doesn't let the user edit the value.
49 Useful as last item in a `choice' widget."
50 :tag "Other"
51 :format "%t%n"
52 :value 'other))
53
54 (define-widget 'c-const-symbol 'item
55 "An uneditable lisp symbol."
56 :value nil
57 :tag "Symbol"
58 :format "%t: %v\n%d"
59 :match (lambda (widget value) (symbolp value))
60 :value-to-internal
61 (lambda (widget value)
62 (let ((s (if (symbolp value)
63 (symbol-name value)
64 value))
65 (l (widget-get widget :size)))
66 (if l
67 (setq s (concat s (make-string (- l (length s)) ?\ ))))
68 s))
69 :value-to-external
70 (lambda (widget value)
71 (if (stringp value)
72 (intern (progn
73 (string-match "\\`[^ ]*" value)
74 (match-string 0 value)))
75 value)))
76
77 (defvar c-style-variables
78 '(c-basic-offset c-comment-only-line-offset c-block-comment-prefix
79 c-comment-prefix-regexp c-cleanup-list c-hanging-braces-alist
80 c-hanging-colons-alist c-hanging-semi&comma-criteria c-backslash-column
81 c-special-indent-hook c-label-minimum-indentation c-offsets-alist)
82 "List of the style variables.")
83
84 (defmacro defcustom-c-stylevar (name val doc &rest args)
85 "Defines a style variable."
86 (setq val (if (eq (car-safe val) 'quote)
87 (nth 1 val)
88 (eval val)))
89 `(progn
90 (put ',name 'c-stylevar-fallback ',val)
91 (defcustom ,name 'set-from-style
92 ,(concat doc "
93
94 This is a style variable. Apart from the valid values described
95 above, it can be set to the symbol `set-from-style'. In that case, it
96 takes its value from the style system (see `c-default-style' and
97 `c-styles-alist') when a CC Mode buffer is initialized. Otherwise,
98 the value set here overrides the style system (there is a variable
99 `c-old-style-variable-behavior' that changes this, though).")
100 ,@(plist-put
101 args ':type
102 `'(radio
103 (const :tag "Use style settings"
104 set-from-style)
105 ,(let ((type (eval (plist-get args ':type))))
106 (unless (consp type)
107 (setq type (list type)))
108 (unless (c-safe (plist-get (cdr type) ':value))
109 (setcdr type (append `(:value ,val)
110 (cdr type))))
111 (unless (c-safe (plist-get (cdr type) ':tag))
112 (setcdr type (append '(:tag "Override style settings")
113 (cdr type))))
114 type))))))
115
116 (defun c-valid-offset (offset)
117 "Return non-nil iff OFFSET is a valid offset for a syntactic symbol.
118 See `c-offsets-alist'."
119 (or (eq offset '+)
120 (eq offset '-)
121 (eq offset '++)
122 (eq offset '--)
123 (eq offset '*)
124 (eq offset '/)
125 (integerp offset)
126 (functionp offset)
127 (and (symbolp offset)
128 (or (boundp offset)
129 (fboundp offset)))
130 (progn
131 (while (and (consp offset)
132 (c-valid-offset (car offset)))
133 (setq offset (cdr offset)))
134 (null offset))))
135
136
137 \f
138 ;;; User variables
139
140 (defcustom c-strict-syntax-p nil
141 "*If non-nil, all syntactic symbols must be found in `c-offsets-alist'.
142 If the syntactic symbol for a particular line does not match a symbol
143 in the offsets alist, or if no non-nil offset value can be determined
144 for a symbol, an error is generated, otherwise no error is reported
145 and the syntactic symbol is ignored.
146
147 This variable is considered obsolete; it doesn't work well with lineup
148 functions that return nil to support the feature of using lists on
149 syntactic symbols in `c-offsets-alist'. Please keep it set to nil."
150 :type 'boolean
151 :group 'c)
152
153 (defcustom c-echo-syntactic-information-p nil
154 "*If non-nil, syntactic info is echoed when the line is indented."
155 :type 'boolean
156 :group 'c)
157
158 (defcustom-c-stylevar c-basic-offset 4
159 "*Amount of basic offset used by + and - symbols in `c-offsets-alist'."
160 :type 'integer
161 :group 'c)
162
163 (defcustom c-tab-always-indent t
164 "*Controls the operation of the TAB key.
165 If t, hitting TAB always just indents the current line. If nil,
166 hitting TAB indents the current line if point is at the left margin or
167 in the line's indentation, otherwise it insert a `real' tab character
168 \(see note\). If the symbol `other', then tab is inserted only within
169 literals -- defined as comments and strings -- and inside preprocessor
170 directives, but the line is always reindented.
171
172 Note: The value of `indent-tabs-mode' will determine whether a real
173 tab character will be inserted, or the equivalent number of spaces.
174 When inserting a tab, actually the function stored in the variable
175 `c-insert-tab-function' is called.
176
177 Note: indentation of lines containing only comments is also controlled
178 by the `c-comment-only-line-offset' variable."
179 :type '(radio
180 :extra-offset 8
181 :format "%{C Tab Always Indent%}:\n The TAB key:\n%v"
182 (const :tag "always indents, never inserts TAB" t)
183 (const :tag "indents in left margin, otherwise inserts TAB" nil)
184 (other :tag "inserts TAB in literals, otherwise indent" other))
185 :group 'c)
186
187 (defcustom c-insert-tab-function 'insert-tab
188 "*Function used when inserting a tab for \\[TAB].
189 Only used when `c-tab-always-indent' indicates a `real' tab character
190 should be inserted. Value must be a function taking no arguments."
191 :type 'function
192 :group 'c)
193
194 (defcustom-c-stylevar c-comment-only-line-offset 0
195 "*Extra offset for line which contains only the start of a comment.
196 Can contain an integer or a cons cell of the form:
197
198 (NON-ANCHORED-OFFSET . ANCHORED-OFFSET)
199
200 Where NON-ANCHORED-OFFSET is the amount of offset given to
201 non-column-zero anchored comment-only lines, and ANCHORED-OFFSET is
202 the amount of offset to give column-zero anchored comment-only lines.
203 Just an integer as value is equivalent to (<val> . -1000).
204
205 Note that this variable only has effect when the `c-lineup-comment'
206 lineup function is used on the `comment-intro' syntactic symbol (the
207 default)."
208 :type '(choice (integer :tag "Non-anchored offset" 0)
209 (cons :tag "Non-anchored & anchored offset"
210 :value (0 . 0)
211 :extra-offset 8
212 (integer :tag "Non-anchored offset")
213 (integer :tag "Anchored offset")))
214 :group 'c)
215
216 (defcustom c-indent-comments-syntactically-p nil
217 "*Specifies how \\[indent-for-comment] should handle comment-only lines.
218 When this variable is non-nil, comment-only lines are indented
219 according to syntactic analysis via `c-offsets-alist'. Otherwise, the
220 comment is indented as if it was preceded by code. Note that this
221 variable does not affect how the normal line indentation treats
222 comment-only lines."
223 :type 'boolean
224 :group 'c)
225
226 (defcustom-c-stylevar c-block-comment-prefix
227 (if (boundp 'c-comment-continuation-stars)
228 c-comment-continuation-stars
229 "* ")
230 "*Specifies the line prefix of continued C-style block comments.
231 You should set this variable to the literal string that gets inserted
232 at the front of continued block style comment lines. This should
233 either be the empty string, or some characters without preceding
234 spaces. To adjust the alignment under the comment starter, put an
235 appropriate value on the `c' syntactic symbol (see the
236 `c-offsets-alist' variable).
237
238 It's only used when a one-line block comment is broken into two or
239 more lines for the first time; otherwise the appropriate prefix is
240 adapted from the comment. This variable is not used for C++ line
241 style comments."
242 :type 'string
243 :group 'c)
244
245 (make-obsolete-variable 'c-comment-continuation-stars
246 'c-block-comment-prefix)
247
248 (defcustom-c-stylevar c-comment-prefix-regexp "//+\\|\\**"
249 "*Regexp to match the line prefix inside comments.
250 This regexp is used to recognize the fill prefix inside comments for
251 correct paragraph filling and other things.
252
253 It should match the prefix used in both C++ style line comments and C
254 style block comments, but it does not need to match a block comment
255 starter. In other words, it should at least match \"//\" for line
256 comments and the string in `c-block-comment-prefix', which is
257 sometimes inserted by CC Mode inside block comments. It should not
258 match any surrounding whitespace.
259
260 Note that CC Mode modifies other variables from this one at mode
261 initialization, so you might need to do \\[c-mode] (or whatever mode
262 you're currently using) if you change it in a CC Mode buffer."
263 :type 'regexp
264 :group 'c)
265
266 (defcustom c-ignore-auto-fill '(string cpp code)
267 "*List of contexts in which automatic filling never occurs.
268 If Auto Fill mode is active, it will be temporarily disabled if point
269 is in any context on this list. It's e.g. useful to enable Auto Fill
270 in comments only, but not in strings or normal code. The valid
271 contexts are:
272
273 string -- inside a string or character literal
274 c -- inside a C style block comment
275 c++ -- inside a C++ style line comment
276 cpp -- inside a preprocessor directive
277 code -- anywhere else, i.e. in normal code"
278 :type '(set
279 :extra-offset 8
280 (const :tag "String literals" string)
281 (const :tag "C style block comments" c)
282 (const :tag "C++ style line comments" c++)
283 (const :tag "Preprocessor directives" cpp)
284 (const :tag "Normal code" code))
285 :group 'c)
286
287 (defcustom-c-stylevar c-cleanup-list '(scope-operator)
288 "*List of various C/C++/ObjC constructs to \"clean up\".
289 These clean ups only take place when the auto-newline feature is
290 turned on, as evidenced by the `/a' or `/ah' appearing next to the
291 mode name. Valid symbols are:
292
293 brace-else-brace -- cleans up `} else {' constructs by placing entire
294 construct on a single line. This clean up
295 only takes place when there is nothing but
296 white space between the braces and the `else'.
297 Clean up occurs when the open brace after the
298 `else' is typed.
299 brace-elseif-brace -- similar to brace-else-brace, but cleans up
300 `} else if (...) {' constructs. Clean up occurs
301 after the open parenthesis and the open brace.
302 brace-catch-brace -- similar to brace-elseif-brace, but cleans up
303 `} catch (...) {' constructs.
304 empty-defun-braces -- cleans up empty defun braces by placing the
305 braces on the same line. Clean up occurs when
306 the defun closing brace is typed.
307 defun-close-semi -- cleans up the terminating semi-colon on defuns
308 by placing the semi-colon on the same line as
309 the closing brace. Clean up occurs when the
310 semi-colon is typed.
311 list-close-comma -- cleans up commas following braces in array
312 and aggregate initializers. Clean up occurs
313 when the comma is typed.
314 scope-operator -- cleans up double colons which may designate
315 a C++ scope operator split across multiple
316 lines. Note that certain C++ constructs can
317 generate ambiguous situations. This clean up
318 only takes place when there is nothing but
319 whitespace between colons. Clean up occurs
320 when the second colon is typed."
321 :type '(set
322 :extra-offset 8
323 (const :tag "Put `} else {' on one line" brace-else-brace)
324 (const :tag "Put `} else if (...) {' on one line" brace-elseif-brace)
325 (const :tag "Put `} catch (...) {' on one line" brace-catch-brace)
326 (const :tag "Put empty defun braces on one line" empty-defun-braces)
327 (const :tag "Put `};' ending defuns on one line" defun-close-semi)
328 (const :tag "Put `},' in aggregates on one line" list-close-comma)
329 (const :tag "Put C++ style `::' on one line" scope-operator))
330 :group 'c)
331
332 (defcustom-c-stylevar c-hanging-braces-alist '((brace-list-open)
333 (brace-entry-open)
334 (substatement-open after)
335 (block-close . c-snug-do-while)
336 (extern-lang-open after)
337 (inexpr-class-open after)
338 (inexpr-class-close before))
339 "*Controls the insertion of newlines before and after braces
340 when the auto-newline feature is active. This variable contains an
341 association list with elements of the following form:
342 \(SYNTACTIC-SYMBOL . ACTION).
343
344 When a brace (either opening or closing) is inserted, the syntactic
345 context it defines is looked up in this list, and if found, the
346 associated ACTION is used to determine where newlines are inserted.
347 If the context is not found, the default is to insert a newline both
348 before and after the brace.
349
350 SYNTACTIC-SYMBOL can be any of: defun-open, defun-close, class-open,
351 class-close, inline-open, inline-close, block-open, block-close,
352 substatement-open, statement-case-open, extern-lang-open,
353 extern-lang-close, brace-list-open, brace-list-close,
354 brace-list-intro, brace-entry-open, namespace-open, namespace-close,
355 inexpr-class-open, or inexpr-class-close. See `c-offsets-alist' for
356 details, except for inexpr-class-open and inexpr-class-close, which
357 doesn't have any corresponding symbols there. Those two symbols are
358 used for the opening and closing braces, respectively, of anonymous
359 inner classes in Java.
360
361 ACTION can be either a function symbol or a list containing any
362 combination of the symbols `before' or `after'. If the list is empty,
363 no newlines are inserted either before or after the brace.
364
365 When ACTION is a function symbol, the function is called with a two
366 arguments: the syntactic symbol for the brace and the buffer position
367 at which the brace was inserted. The function must return a list as
368 described in the preceding paragraph. Note that during the call to
369 the function, the variable `c-syntactic-context' is set to the entire
370 syntactic context for the brace line."
371 :type
372 `(set ,@(mapcar
373 (lambda (elt)
374 `(cons :format "%v"
375 (c-const-symbol :format "%v: "
376 :size 20
377 :value ,elt)
378 (choice :format "%[Choice%] %v"
379 :value (before after)
380 (set :menu-tag "Before/after"
381 :format "Newline %v brace\n"
382 (const :format "%v, " before)
383 (const :format "%v" after))
384 (function :menu-tag "Function"
385 :format "Run function: %v"
386 :value c-))))
387 '(defun-open defun-close
388 class-open class-close
389 inline-open inline-close
390 block-open block-close
391 substatement-open statement-case-open
392 extern-lang-open extern-lang-close
393 brace-list-open brace-list-close
394 brace-list-intro brace-entry-open
395 namespace-open namespace-close
396 inexpr-class-open inexpr-class-close)))
397 :group 'c)
398
399 (defcustom-c-stylevar c-hanging-colons-alist nil
400 "*Controls the insertion of newlines before and after certain colons.
401 This variable contains an association list with elements of the
402 following form: (SYNTACTIC-SYMBOL . ACTION).
403
404 SYNTACTIC-SYMBOL can be any of: case-label, label, access-label,
405 member-init-intro, or inher-intro.
406
407 See the variable `c-hanging-braces-alist' for the semantics of this
408 variable. Note however that making ACTION a function symbol is
409 currently not supported for this variable."
410 :type
411 `(set ,@(mapcar
412 (lambda (elt)
413 `(cons :format "%v"
414 (c-const-symbol :format "%v: "
415 :size 20
416 :value ,elt)
417 (set :format "Newline %v brace\n"
418 (const :format "%v, " before)
419 (const :format "%v" after))))
420 '(case-label label access-label member-init-intro inher-intro)))
421 :group 'c)
422
423 (defcustom-c-stylevar c-hanging-semi&comma-criteria
424 '(c-semi&comma-inside-parenlist)
425 "*List of functions that decide whether to insert a newline or not.
426 The functions in this list are called, in order, whenever the
427 auto-newline minor mode is activated (as evidenced by a `/a' or `/ah'
428 string in the mode line), and a semicolon or comma is typed (see
429 `c-electric-semi&comma'). Each function in this list is called with
430 no arguments, and should return one of the following values:
431
432 nil -- no determination made, continue checking
433 'stop -- do not insert a newline, and stop checking
434 (anything else) -- insert a newline, and stop checking
435
436 If every function in the list is called with no determination made,
437 then no newline is inserted."
438 :type '(repeat function)
439 :group 'c)
440
441 (defcustom-c-stylevar c-backslash-column 48
442 "*Column to insert backslashes when macroizing a region."
443 :type 'integer
444 :group 'c)
445
446 (defcustom c-special-indent-hook nil
447 "*Hook for user defined special indentation adjustments.
448 This hook gets called after a line is indented by the mode."
449 :type 'hook
450 :group 'c)
451
452 (defcustom c-backspace-function 'backward-delete-char-untabify
453 "*Function called by `c-electric-backspace' when deleting backwards."
454 :type 'function
455 :group 'c)
456
457 (defcustom c-delete-function 'delete-char
458 "*Function called by `c-electric-delete' when deleting forwards."
459 :type 'function
460 :group 'c)
461
462 (defcustom c-electric-pound-behavior nil
463 "*List of behaviors for electric pound insertion.
464 Only currently supported behavior is `alignleft'."
465 :type '(set :extra-offset 8 (const alignleft))
466 :group 'c)
467
468 (defcustom-c-stylevar c-label-minimum-indentation 1
469 "*Minimum indentation for lines inside of top-level constructs.
470 This variable typically only affects code using the `gnu' style, which
471 mandates a minimum of one space in front of every line inside
472 top-level constructs. Specifically, the function
473 `c-gnu-impose-minimum' on your `c-special-indent-hook' is what
474 enforces this."
475 :type 'integer
476 :group 'c)
477
478 (defcustom c-progress-interval 5
479 "*Interval used to update progress status during long re-indentation.
480 If a number, percentage complete gets updated after each interval of
481 that many seconds. To inhibit all messages during indentation, set
482 this variable to nil."
483 :type 'integer
484 :group 'c)
485
486 (defcustom c-default-style "gnu"
487 "*Style which gets installed by default when a file is visited.
488
489 The value of this variable can be any style defined in
490 `c-style-alist', including styles you add. The value can also be an
491 association list of major mode symbols to style names.
492
493 When the value is a string, all CC Mode major modes will install this
494 style by default, except `java-mode', which always installs the
495 \"java\" style (this is for backwards compatibility).
496
497 When the value is an alist, the major mode symbol is looked up in it
498 and the associated style is installed. If the major mode is not
499 listed in the alist, then the symbol `other' is looked up in it, and
500 if found, the style in that entry is used. If `other' is not found in
501 the alist, then \"gnu\" style is used.
502
503 The default style gets installed before your mode hooks run, so you
504 can always override the use of `c-default-style' by making calls to
505 `c-set-style' in the appropriate mode hook.
506
507 Tip: If you use different styles in different languages, you probably
508 want to set `c-style-variables-are-local-p'."
509 :type '(radio
510 (string :tag "Style in all modes (except Java)")
511 (repeat :tag "Mode-specific styles"
512 :value ((other . "user"))
513 (cons :format "%v"
514 (choice :tag "Mode"
515 (const c-mode) (const c++-mode)
516 (const objc-mode) (const java-mode)
517 (const idl-mode) (const pike-mode)
518 (const other))
519 (string :tag "Style")
520 )))
521 :group 'c)
522
523 (put 'c-offsets-alist 'c-stylevar-fallback
524 '((string . c-lineup-dont-change)
525 ;; Relpos: Beg of previous line.
526 (c . c-lineup-C-comments)
527 ;; Relpos: Beg of the comment.
528 (defun-open . 0)
529 ;; Relpos: Boi at the func decl start when inside classes, bol
530 ;; at the func decl start when at top level.
531 (defun-close . 0)
532 ;; Relpos: Boi at the func decl start.
533 (defun-block-intro . +)
534 ;; Relpos: Boi at the block open.
535 (class-open . 0)
536 ;; Relpos: Boi at the class decl start.
537 (class-close . 0)
538 ;; Relpos: Boi at the class decl start.
539 (inline-open . +)
540 ;; Relpos: None for functions (inclass got the relpos then),
541 ;; boi at the lambda start for lambdas.
542 (inline-close . 0)
543 ;; Relpos: For functions: Boi at the func decl start. For
544 ;; lambdas: At the block open if it's at boi, at the boi of the
545 ;; lambda start otherwise.
546 (func-decl-cont . +)
547 ;; Relpos: Boi at the func decl start.
548 (knr-argdecl-intro . +)
549 ;; Relpos: Boi at the current line.
550 (knr-argdecl . 0)
551 ;; Relpos: Boi at the argdecl intro line.
552 (topmost-intro . 0)
553 ;; Relpos: Bol at the last line of previous construct.
554 (topmost-intro-cont . 0)
555 ;; Relpos: Boi at the topmost intro line.
556 (member-init-intro . +)
557 ;; Relpos: Boi at the func decl arglist open.
558 (member-init-cont . 0)
559 ;; Relpos: Beg of the first member init.
560 (inher-intro . +)
561 ;; Relpos: Java: Boi at the class decl start. Otherwise: Boi
562 ;; of current line (a bug?), unless it begins with an inher
563 ;; start colon, in which case boi of previous line is used.
564 (inher-cont . c-lineup-multi-inher)
565 ;; Relpos: Java: At the implements/extends keyword start.
566 ;; Otherwise: At the inher start colon, or boi at the class
567 ;; decl start if the first inherit clause hangs and it's not a
568 ;; func-local inherit clause (when does that occur?).
569 (block-open . 0)
570 ;; Relpos: Inexpr statement: Boi at the the preceding
571 ;; paren. Otherwise: None.
572 (block-close . 0)
573 ;; Relpos: At the open brace if it's at boi. Otherwise boi at
574 ;; the start of the statement the open brace hangs on, or boi
575 ;; at the preceding paren for inexpr statements.
576 (brace-list-open . 0)
577 ;; Relpos: Boi at the brace list decl start, but a starting
578 ;; "typedef" token is ignored.
579 (brace-list-close . 0)
580 ;; Relpos: Boi at the brace list open.
581 (brace-list-intro . +)
582 ;; Relpos: Boi at the brace list open.
583 (brace-list-entry . 0)
584 ;; Relpos: At the first non-ws char after the open paren if the
585 ;; first token is on the same line, otherwise boi at that
586 ;; token.
587 (brace-entry-open . 0)
588 ;; Relpos: Same as brace-list-entry.
589 (statement . 0)
590 ;; Relpos: After a ';' in the condition clause of a for
591 ;; statement: At the first token after the starting paren.
592 ;; Otherwise: Boi at the start of the closest non-hanging
593 ;; previous statement, but after any switch label.
594 (statement-cont . +)
595 ;; Relpos: After the first token in the condition clause of a
596 ;; for statement: At the first token after the starting paren.
597 ;; On the first line in a continued expression that starts with
598 ;; a stream op and there's no stream op on the previous line:
599 ;; Boi of previous line. Otherwise: Boi at the beginning of
600 ;; the statement, but after any type of label.
601 (statement-block-intro . +)
602 ;; Relpos: At the block start if it's at boi, otherwise boi at
603 ;; the start of the statement the open brace hangs on, or boi
604 ;; at the preceding paren for inexpr statements.
605 (statement-case-intro . +)
606 ;; Relpos: At the label keyword (always at boi).
607 (statement-case-open . 0)
608 ;; Relpos: At the label keyword (always at boi).
609 (substatement . +)
610 ;; Relpos: Boi at the containing statement or else clause.
611 (substatement-open . +)
612 ;; Relpos: Boi at the containing statement or else clause.
613 (case-label . 0)
614 ;; Relpos: At the switch block start if it's at boi, otherwise
615 ;; boi at the start of the switch condition clause.
616 (access-label . -)
617 ;; Relpos: Eol (a bug?).
618 (label . 2)
619 ;; Relpos: At the start of the containing block if it's at boi,
620 ;; otherwise boi at the start of the sexp before the block.
621 (do-while-closure . 0)
622 ;; Relpos: Boi at the corresponding while keyword.
623 (else-clause . 0)
624 ;; Relpos: Boi at the corresponding if keyword.
625 (catch-clause . 0)
626 ;; Relpos: Boi at the previous try or catch keyword in the try
627 ;; statement.
628 (comment-intro . c-lineup-comment)
629 ;; Relpos: None.
630 (arglist-intro . +)
631 ;; Relpos: Boi at the open paren.
632 (arglist-cont . 0)
633 ;; Relpos: At the first token after the open paren.
634 (arglist-cont-nonempty . c-lineup-arglist)
635 ;; Relpos: Boi at the open paren.
636 (arglist-close . +)
637 ;; Relpos: Boi at the open paren.
638 (stream-op . c-lineup-streamop)
639 ;; Relpos: Boi at the first stream op in the statement.
640 (inclass . +)
641 ;; Relpos: At the class open brace if it's at boi, otherwise
642 ;; boi at the class decl start.
643 (cpp-macro . -1000)
644 ;; Relpos: Boi.
645 (cpp-macro-cont . c-lineup-dont-change)
646 ;; Relpos: At the macro start (always at boi).
647 (friend . 0)
648 ;; Relpos: None.
649 (objc-method-intro . -1000)
650 ;; Relpos: Boi.
651 (objc-method-args-cont . c-lineup-ObjC-method-args)
652 ;; Relpos: At the method start (always at boi).
653 (objc-method-call-cont . c-lineup-ObjC-method-call)
654 ;; Relpos: At the open bracket.
655 (extern-lang-open . 0)
656 ;; Relpos: Boi at the extern keyword.
657 (extern-lang-close . 0)
658 ;; Relpos: Boi at the corresponding extern keyword.
659 (inextern-lang . +)
660 ;; Relpos: At the extern block open brace if it's at boi,
661 ;; otherwise boi at the extern keyword.
662 (namespace-open . 0)
663 ;; Relpos: Boi at the namespace keyword.
664 (namespace-close . 0)
665 ;; Relpos: Boi at the corresponding namespace keyword.
666 (innamespace . +)
667 ;; Relpos: At the namespace block open brace if it's at boi,
668 ;; otherwise boi at the namespace keyword.
669 (template-args-cont . (c-lineup-template-args +))
670 ;; Relpos: Boi at the decl start.
671 (inlambda . c-lineup-inexpr-block)
672 ;; Relpos: None.
673 (lambda-intro-cont . +)
674 ;; Relpos: Boi at the lambda start.
675 (inexpr-statement . 0)
676 ;; Relpos: None.
677 (inexpr-class . +)
678 ;; Relpos: None.
679 ))
680 (defcustom c-offsets-alist nil
681 "Association list of syntactic element symbols and indentation offsets.
682 As described below, each cons cell in this list has the form:
683
684 (SYNTACTIC-SYMBOL . OFFSET)
685
686 When a line is indented, CC Mode first determines the syntactic
687 context of it by generating a list of symbols called syntactic
688 elements. This list can contain more than one syntactic element and
689 the global variable `c-syntactic-context' contains the context list
690 for the line being indented. Each element in this list is actually a
691 cons cell of the syntactic symbol and a buffer position. This buffer
692 position is called the relative indent point for the line. Some
693 syntactic symbols may not have a relative indent point associated with
694 them.
695
696 After the syntactic context list for a line is generated, CC Mode
697 calculates the absolute indentation for the line by looking at each
698 syntactic element in the list. It compares the syntactic element
699 against the SYNTACTIC-SYMBOL's in `c-offsets-alist'. When it finds a
700 match, it adds the OFFSET to the column of the relative indent point.
701 The sum of this calculation for each element in the syntactic list is
702 the absolute offset for line being indented.
703
704 If the syntactic element does not match any in the `c-offsets-alist',
705 an error is generated if `c-strict-syntax-p' is non-nil, otherwise the
706 element is ignored.
707
708 Actually, OFFSET can be an integer, a function, a variable, or one of
709 the following symbols: `+', `-', `++', `--', `*', or `/'. These
710 latter designate positive or negative multiples of `c-basic-offset',
711 respectively: 1, -1, 2, -2, 0.5, and -0.5. If OFFSET is a function,
712 it is called with a single argument containing the cons of the
713 syntactic element symbol and the relative indent point. The function
714 should return an integer offset or nil if it can't decide.
715
716 OFFSET can also be a list, in which case it is recursively evaluated
717 using the semantics described above. The first element of the list to
718 return a non-nil value succeeds. If none of the elements returns a
719 non-nil value, then what happends depends on the value of
720 `c-strict-syntax-p'. When `c-strict-syntax-p' is nil, then an offset
721 of zero is used, otherwise an error is generated.
722
723 `c-offsets-alist' is a style variable. This means that the offsets on
724 this variable are normally taken from the style system in CC Mode
725 \(see `c-default-style' and `c-styles-alist'). However, any offsets
726 put explicitly on this list will override the style system when a CC
727 Mode buffer is initialized \(there is a variable
728 `c-old-style-variable-behavior' that changes this, though).
729
730 Here is the current list of valid syntactic element symbols:
731
732 string -- Inside multi-line string.
733 c -- Inside a multi-line C style block comment.
734 defun-open -- Brace that opens a function definition.
735 defun-close -- Brace that closes a function definition.
736 defun-block-intro -- The first line in a top-level defun.
737 class-open -- Brace that opens a class definition.
738 class-close -- Brace that closes a class definition.
739 inline-open -- Brace that opens an in-class inline method.
740 inline-close -- Brace that closes an in-class inline method.
741 func-decl-cont -- The region between a function definition's
742 argument list and the function opening brace
743 (excluding K&R argument declarations). In C, you
744 cannot put anything but whitespace and comments
745 between them; in C++ and Java, throws declarations
746 and other things can appear in this context.
747 knr-argdecl-intro -- First line of a K&R C argument declaration.
748 knr-argdecl -- Subsequent lines in a K&R C argument declaration.
749 topmost-intro -- The first line in a topmost construct definition.
750 topmost-intro-cont -- Topmost definition continuation lines.
751 member-init-intro -- First line in a member initialization list.
752 member-init-cont -- Subsequent member initialization list lines.
753 inher-intro -- First line of a multiple inheritance list.
754 inher-cont -- Subsequent multiple inheritance lines.
755 block-open -- Statement block open brace.
756 block-close -- Statement block close brace.
757 brace-list-open -- Open brace of an enum or static array list.
758 brace-list-close -- Close brace of an enum or static array list.
759 brace-list-intro -- First line in an enum or static array list.
760 brace-list-entry -- Subsequent lines in an enum or static array list.
761 brace-entry-open -- Subsequent lines in an enum or static array
762 list that start with an open brace.
763 statement -- A C (or like) statement.
764 statement-cont -- A continuation of a C (or like) statement.
765 statement-block-intro -- The first line in a new statement block.
766 statement-case-intro -- The first line in a case \"block\".
767 statement-case-open -- The first line in a case block starting with brace.
768 substatement -- The first line after an if/while/for/do/else.
769 substatement-open -- The brace that opens a substatement block.
770 case-label -- A `case' or `default' label.
771 access-label -- C++ private/protected/public access label.
772 label -- Any ordinary label.
773 do-while-closure -- The `while' that ends a do/while construct.
774 else-clause -- The `else' of an if/else construct.
775 catch-clause -- The `catch' or `finally' of a try/catch construct.
776 comment-intro -- A line containing only a comment introduction.
777 arglist-intro -- The first line in an argument list.
778 arglist-cont -- Subsequent argument list lines when no
779 arguments follow on the same line as the
780 arglist opening paren.
781 arglist-cont-nonempty -- Subsequent argument list lines when at
782 least one argument follows on the same
783 line as the arglist opening paren.
784 arglist-close -- The solo close paren of an argument list.
785 stream-op -- Lines continuing a stream operator construct.
786 inclass -- The construct is nested inside a class definition.
787 Used together with e.g. `topmost-intro'.
788 cpp-macro -- The start of a C preprocessor macro definition.
789 cpp-macro-cont -- Subsequent lines in a multi-line C preprocessor
790 macro definition.
791 friend -- A C++ friend declaration.
792 objc-method-intro -- The first line of an Objective-C method definition.
793 objc-method-args-cont -- Lines continuing an Objective-C method definition.
794 objc-method-call-cont -- Lines continuing an Objective-C method call.
795 extern-lang-open -- Brace that opens an external language block.
796 extern-lang-close -- Brace that closes an external language block.
797 inextern-lang -- Analogous to the `inclass' syntactic symbol,
798 but used inside extern constructs.
799 namespace-open -- Brace that opens a C++ namespace block.
800 namespace-close -- Brace that closes a C++ namespace block.
801 innamespace -- Analogous to the `inextern-lang' syntactic
802 symbol, but used inside C++ namespace constructs.
803 template-args-cont -- C++ template argument list continuations.
804 inlambda -- In the header or body of a lambda function.
805 lambda-intro-cont -- Continuation of the header of a lambda function.
806 inexpr-statement -- The statement is inside an expression.
807 inexpr-class -- The class is inside an expression. Used e.g. for
808 Java anonymous classes."
809 :type
810 `(set :format "%{%t%}:
811 Override style setting
812 | Syntax Offset
813 %v"
814 ,@(mapcar
815 (lambda (elt)
816 `(cons :format "%v"
817 :value ,elt
818 (c-const-symbol :format "%v: "
819 :size 25)
820 (sexp :format "%v"
821 :validate
822 (lambda (widget)
823 (unless (c-valid-offset (widget-value widget))
824 (widget-put widget :error "Invalid offset")
825 widget)))))
826 (get 'c-offsets-alist 'c-stylevar-fallback)))
827 :group 'c)
828
829 (defcustom c-style-variables-are-local-p nil
830 "*Whether style variables should be buffer local by default.
831 If non-nil, then all indentation style related variables will be made
832 buffer local by default. If nil, they will remain global. Variables
833 are made buffer local when this file is loaded, and once buffer
834 localized, they cannot be made global again.
835
836 The list of variables to buffer localize are:
837 c-offsets-alist
838 c-basic-offset
839 c-comment-only-line-offset
840 c-block-comment-prefix
841 c-comment-prefix-regexp
842 c-cleanup-list
843 c-hanging-braces-alist
844 c-hanging-colons-alist
845 c-hanging-semi&comma-criteria
846 c-backslash-column
847 c-label-minimum-indentation
848 c-special-indent-hook
849 c-indentation-style"
850 :type 'boolean
851 :group 'c)
852
853 (defcustom c-mode-hook nil
854 "*Hook called by `c-mode'."
855 :type 'hook
856 :group 'c)
857
858 (defcustom c++-mode-hook nil
859 "*Hook called by `c++-mode'."
860 :type 'hook
861 :group 'c)
862
863 (defcustom objc-mode-hook nil
864 "*Hook called by `objc-mode'."
865 :type 'hook
866 :group 'c)
867
868 (defcustom java-mode-hook nil
869 "*Hook called by `java-mode'."
870 :type 'hook
871 :group 'c)
872
873 (defcustom idl-mode-hook nil
874 "*Hook called by `idl-mode'."
875 :type 'hook
876 :group 'c)
877
878 (defcustom pike-mode-hook nil
879 "*Hook called by `pike-mode'."
880 :type 'hook
881 :group 'c)
882
883 (defcustom c-mode-common-hook nil
884 "*Hook called by all CC Mode modes for common initializations."
885 :type '(hook :format "%{CC Mode Common Hook%}:\n%v")
886 :group 'c)
887
888 (defcustom c-initialization-hook nil
889 "*Hook called when the CC Mode package gets initialized.
890 This hook is only run once per Emacs session and can be used as a
891 `load-hook' or in place of using `eval-after-load'."
892 :type 'hook
893 :group 'c)
894
895 (defcustom c-enable-xemacs-performance-kludge-p nil
896 "*Enables a XEmacs only hack that may improve speed for some coding styles.
897 For styles that hang top-level opening braces (as is common with JDK
898 Java coding styles) this can improve performance between 3 and 60
899 times for core indentation functions (e.g. `c-parse-state'). For
900 styles that conform to the Emacs recommendation of putting these
901 braces in column zero, this can degrade performance about as much.
902 This variable only has effect in XEmacs.")
903
904 (defcustom c-old-style-variable-behavior nil
905 "*Enables the old style variable behavior when non-nil.
906
907 Normally the values of the style variables will override the style
908 settings specified by the variables `c-default-style' and
909 `c-styles-alist'. However, in CC Mode 5.25 and earlier, it was the
910 other way around, meaning that changes made to the style variables
911 from e.g. Customize would not take effect unless special precautions
912 were taken. That was confusing, especially for novice users.
913
914 It's believed that despite this change, the new behavior will still
915 produce the same results for most old CC Mode configurations, since
916 all style variables are per default set in a special non-override
917 state. Set this variable only if your configuration has stopped
918 working due to this change.")
919
920
921 \f
922 ;; Non-customizable variables, still part of the interface to CC Mode
923 (defvar c-file-style nil
924 "Variable interface for setting style via File Local Variables.
925 In a file's Local Variable section, you can set this variable to a
926 string suitable for `c-set-style'. When the file is visited, CC Mode
927 will set the style of the file to this value automatically.
928
929 Note that file style settings are applied before file offset settings
930 as designated in the variable `c-file-offsets'.")
931 (make-variable-buffer-local 'c-file-style)
932
933 (defvar c-file-offsets nil
934 "Variable interface for setting offsets via File Local Variables.
935 In a file's Local Variable section, you can set this variable to an
936 association list similar to the values allowed in `c-offsets-alist'.
937 When the file is visited, CC Mode will institute these offset settings
938 automatically.
939
940 Note that file offset settings are applied after file style settings
941 as designated in the variable `c-file-style'.")
942 (make-variable-buffer-local 'c-file-offsets)
943
944 (defvar c-syntactic-context nil
945 "Variable containing syntactic analysis list during indentation.")
946
947 (defvar c-indentation-style nil
948 "Name of the currently installed style.")
949
950
951 \f
952 ;; Figure out what features this Emacs has
953 ;;;###autoload
954 (defconst c-emacs-features
955 (let ((infodock-p (boundp 'infodock-version))
956 (comments
957 ;; XEmacs 19 and beyond use 8-bit modify-syntax-entry flags.
958 ;; Emacs 19 uses a 1-bit flag. We will have to set up our
959 ;; syntax tables differently to handle this.
960 (let ((table (copy-syntax-table))
961 entry)
962 (modify-syntax-entry ?a ". 12345678" table)
963 (cond
964 ;; XEmacs 19, and beyond Emacs 19.34
965 ((arrayp table)
966 (setq entry (aref table ?a))
967 ;; In Emacs, table entries are cons cells
968 (if (consp entry) (setq entry (car entry))))
969 ;; XEmacs 20
970 ((fboundp 'get-char-table) (setq entry (get-char-table ?a table)))
971 ;; before and including Emacs 19.34
972 ((and (fboundp 'char-table-p)
973 (char-table-p table))
974 (setq entry (car (char-table-range table [?a]))))
975 ;; incompatible
976 (t (error "CC Mode is incompatible with this version of Emacs")))
977 (if (= (logand (lsh entry -16) 255) 255)
978 '8-bit
979 '1-bit))))
980 (if infodock-p
981 (list comments 'infodock)
982 (list comments)))
983 "A list of features extant in the Emacs you are using.
984 There are many flavors of Emacs out there, each with different
985 features supporting those needed by CC Mode. Here's the current
986 supported list, along with the values for this variable:
987
988 XEmacs 19, 20, 21: (8-bit)
989 Emacs 19, 20: (1-bit)
990
991 Infodock (based on XEmacs) has an additional symbol on this list:
992 `infodock'.")
993
994
995 \f
996 (provide 'cc-vars)
997 ;;; cc-vars.el ends here