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