Second half of changes in version 1.4.
[bpt/emacs.git] / lisp / progmodes / cc-vars.el
1 ;;; cc-vars.el --- user customization variables for CC Mode
2
3 ;; Copyright (C) 1985,87,92,93,94,95,96,97,98 Free Software Foundation, Inc.
4
5 ;; Authors: 1992-1997 Barry A. Warsaw
6 ;; 1987 Dave Detlefs and Stewart Clamen
7 ;; 1985 Richard M. Stallman
8 ;; Maintainer: cc-mode-help@python.org
9 ;; Created: 22-Apr-1997 (split from cc-mode.el)
10 ;; Version: See cc-mode.el
11 ;; Keywords: c languages oop
12
13 ;; This file is part of GNU Emacs.
14
15 ;; GNU Emacs is free software; you can redistribute it and/or modify
16 ;; it under the terms of the GNU General Public License as published by
17 ;; the Free Software Foundation; either version 2, or (at your option)
18 ;; any later version.
19
20 ;; GNU Emacs is distributed in the hope that it will be useful,
21 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
22 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 ;; GNU General Public License for more details.
24
25 ;; You should have received a copy of the GNU General Public License
26 ;; along with GNU Emacs; see the file COPYING. If not, write to the
27 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
28 ;; Boston, MA 02111-1307, USA.
29
30 (require 'custom)
31
32 \f
33 (defcustom c-strict-syntax-p nil
34 "*If non-nil, all syntactic symbols must be found in `c-offsets-alist'.
35 If the syntactic symbol for a particular line does not match a symbol
36 in the offsets alist, an error is generated, otherwise no error is
37 reported and the syntactic symbol is ignored."
38 :type 'boolean
39 :group 'c)
40
41 (defcustom c-echo-syntactic-information-p nil
42 "*If non-nil, syntactic info is echoed when the line is indented."
43 :type 'boolean
44 :group 'c)
45
46 (defcustom c-basic-offset 4
47 "*Amount of basic offset used by + and - symbols in `c-offsets-alist'."
48 :type 'integer
49 :group 'c)
50
51 (defcustom c-tab-always-indent t
52 "*Controls the operation of the TAB key.
53 If t, hitting TAB always just indents the current line. If nil,
54 hitting TAB indents the current line if point is at the left margin or
55 in the line's indentation, otherwise it insert a `real' tab character
56 \(see note\). If other than nil or t, then tab is inserted only
57 within literals -- defined as comments and strings -- and inside
58 preprocessor directives, but line is always reindented.
59
60 Note: The value of `indent-tabs-mode' will determine whether a real
61 tab character will be inserted, or the equivalent number of space.
62 When inserting a tab, actually the function stored in the variable
63 `c-insert-tab-function' is called.
64
65 Note: indentation of lines containing only comments is also controlled
66 by the `c-comment-only-line-offset' variable."
67 :type '(radio
68 :extra-offset 8
69 :format "%{C Tab Always Indent%}:\n The TAB key:\n%v"
70 (const :tag "always indents, never inserts TAB" t)
71 (const :tag "indents in left margin, otherwise inserts TAB" nil)
72 (const :tag "inserts TAB in literals, otherwise indent" other))
73 :group 'c)
74
75 (defcustom c-insert-tab-function 'insert-tab
76 "*Function used when inserting a tab for \\[TAB].
77 Only used when `c-tab-always-indent' indicates a `real' tab character
78 should be inserted. Value must be a function taking no arguments."
79 :type 'function
80 :group 'c)
81
82 (defcustom c-comment-only-line-offset 0
83 "*Extra offset for line which contains only the start of a comment.
84 Can contain an integer or a cons cell of the form:
85
86 (NON-ANCHORED-OFFSET . ANCHORED-OFFSET)
87
88 Where NON-ANCHORED-OFFSET is the amount of offset given to
89 non-column-zero anchored comment-only lines, and ANCHORED-OFFSET is
90 the amount of offset to give column-zero anchored comment-only lines.
91 Just an integer as value is equivalent to (<val> . -1000)."
92 :type '(choice (integer :tag "Non-anchored offset")
93 (cons :tag "Non-anchored & anchored offset"
94 :value (0 . 0)
95 :extra-offset 8
96 (integer :tag "Non-anchored offset")
97 (integer :tag "Anchored offset")))
98 :group 'c)
99
100 (defcustom c-indent-comments-syntactically-p nil
101 "*Specifies how comment-only lines should be indented.
102 When this variable is non-nil, comment-only lines are indented
103 according to syntactic analysis via `c-offsets-alist', even when
104 \\[indent-for-comment] is used."
105 :type 'boolean
106 :group 'c)
107
108 (defcustom c-comment-continuation-stars "* "
109 "*Specifies the leader of continued block comments.
110 You should set this variable to the literal string that gets inserted
111 at the front of continued block style comment lines. This should
112 either be the empty string, or some number of stars followed by a
113 single space. Note that for line style comments, this variable is not
114 used."
115 :type '(choice (const :tag "Use old semantics" nil)
116 string)
117 :group 'c)
118
119 (defcustom c-cleanup-list '(scope-operator)
120 "*List of various C/C++/ObjC constructs to \"clean up\".
121 These clean ups only take place when the auto-newline feature is
122 turned on, as evidenced by the `/a' or `/ah' appearing next to the
123 mode name. Valid symbols are:
124
125 brace-else-brace -- cleans up `} else {' constructs by placing entire
126 construct on a single line. This clean up
127 only takes place when there is nothing but
128 white space between the braces and the `else'.
129 Clean up occurs when the open-brace after the
130 `else' is typed.
131 brace-elseif-brace -- similar to brace-else-brace, but cleans up
132 `} else if {' constructs.
133 empty-defun-braces -- cleans up empty defun braces by placing the
134 braces on the same line. Clean up occurs when
135 the defun closing brace is typed.
136 defun-close-semi -- cleans up the terminating semi-colon on defuns
137 by placing the semi-colon on the same line as
138 the closing brace. Clean up occurs when the
139 semi-colon is typed.
140 list-close-comma -- cleans up commas following braces in array
141 and aggregate initializers. Clean up occurs
142 when the comma is typed.
143 scope-operator -- cleans up double colons which may designate
144 a C++ scope operator split across multiple
145 lines. Note that certain C++ constructs can
146 generate ambiguous situations. This clean up
147 only takes place when there is nothing but
148 whitespace between colons. Clean up occurs
149 when the second colon is typed."
150 :type '(set
151 :extra-offset 8
152 (const :tag "Put `} else {' on one line" brace-else-brace)
153 (const :tag "Put `} else if {' on one line" brace-elseif-brace)
154 (const :tag "Put empty defun braces on one line" empty-defun-braces)
155 (const :tag "Put `},' in aggregates on one line" list-close-comma)
156 (const :tag "Put C++ style `::' on one line" scope-operator))
157 :group 'c)
158
159 (defcustom c-hanging-braces-alist '((brace-list-open)
160 (substatement-open after)
161 (block-close . c-snug-do-while)
162 (extern-lang-open after)
163 )
164 "*Controls the insertion of newlines before and after braces.
165 This variable contains an association list with elements of the
166 following form: (SYNTACTIC-SYMBOL . ACTION).
167
168 When a brace (either opening or closing) is inserted, the syntactic
169 context it defines is looked up in this list, and if found, the
170 associated ACTION is used to determine where newlines are inserted.
171 If the context is not found, the default is to insert a newline both
172 before and after the brace.
173
174 SYNTACTIC-SYMBOL can be any of: defun-open, defun-close, class-open,
175 class-close, inline-open, inline-close, block-open, block-close,
176 substatement-open, statement-case-open, extern-lang-open,
177 extern-lang-close, brace-list-open, brace-list-close,
178 brace-list-intro, or brace-list-entry. See `c-offsets-alist' for
179 details.
180
181 ACTION can be either a function symbol or a list containing any
182 combination of the symbols `before' or `after'. If the list is empty,
183 no newlines are inserted either before or after the brace.
184
185 When ACTION is a function symbol, the function is called with a two
186 arguments: the syntactic symbol for the brace and the buffer position
187 at which the brace was inserted. The function must return a list as
188 described in the preceding paragraph. Note that during the call to
189 the function, the variable `c-syntactic-context' is set to the entire
190 syntactic context for the brace line."
191 :type '(repeat
192 (cons :format "%v"
193 (choice :tag "Syntax"
194 (const defun-open) (const defun-close)
195 (const class-open) (const class-close)
196 (const inline-open) (const inline-close)
197 (const block-open) (const block-close)
198 (const substatement-open) (const statement-case-open)
199 (const extern-lang-open) (const extern-lang-close)
200 (const brace-list-open) (const brace-list-close)
201 (const brace-list-intro) (const brace-list-entry))
202 (choice :tag "Action"
203 (set :format "Insert a newline %v"
204 :extra-offset 38
205 (const :tag "before brace" before)
206 (const :tag "after brace" after))
207 (function :format "Run function %v" :value c-)
208 )))
209 :group 'c)
210
211 (defcustom c-hanging-colons-alist nil
212 "*Controls the insertion of newlines before and after certain colons.
213 This variable contains an association list with elements of the
214 following form: (SYNTACTIC-SYMBOL . ACTION).
215
216 SYNTACTIC-SYMBOL can be any of: case-label, label, access-label,
217 member-init-intro, or inher-intro.
218
219 See the variable `c-hanging-braces-alist' for the semantics of this
220 variable. Note however that making ACTION a function symbol is
221 currently not supported for this variable."
222 :type '(repeat
223 (cons :format "%v"
224 (choice :tag "Syntax"
225 (const case-label) (const label) (const access-label)
226 (const member-init-intro) (const inher-intro))
227 (set :tag "Action"
228 :format "%t: %v"
229 :extra-offset 8
230 (const before) (const after))))
231 :group 'c)
232
233 (defcustom c-hanging-semi&comma-criteria '(c-semi&comma-inside-parenlist)
234 "*List of functions that decide whether to insert a newline or not.
235 The functions in this list are called, in order, whenever the
236 auto-newline minor mode is activated (as evidenced by a `/a' or `/ah'
237 string in the mode line), and a semicolon or comma is typed (see
238 `c-electric-semi&comma'). Each function in this list is called with
239 no arguments, and should return one of the following values:
240
241 nil -- no determination made, continue checking
242 'stop -- do not insert a newline, and stop checking
243 (anything else) -- insert a newline, and stop checking
244
245 If every function in the list is called with no determination made,
246 then no newline is inserted."
247 :type '(repeat function)
248 :group 'c)
249
250 (defcustom c-hanging-comment-ender-p t
251 "*Controls what \\[fill-paragraph] does to C block comment enders.
252 When set to nil, C block comment enders are left on their own line.
253 When set to t, block comment enders will be placed at the end of the
254 previous line (i.e. they `hang' on that line)."
255 :type 'boolean
256 :group 'c)
257
258 (defcustom c-hanging-comment-starter-p t
259 "*Controls what \\[fill-paragraph] does to C block comment starters.
260 When set to nil, C block comment starters are left on their own line.
261 When set to t, text that follows a block comment starter will be
262 placed on the same line as the block comment starter (i.e. the text
263 `hangs' on that line)."
264 :type 'boolean
265 :group 'c)
266
267 (defcustom c-backslash-column 48
268 "*Column to insert backslashes when macroizing a region."
269 :type 'integer
270 :group 'c)
271
272 (defcustom c-special-indent-hook nil
273 "*Hook for user defined special indentation adjustments.
274 This hook gets called after a line is indented by the mode."
275 :type 'hook
276 :group 'c)
277
278 (defcustom c-backspace-function 'backward-delete-char-untabify
279 "*Function called by `c-electric-backspace' when deleting backwards."
280 :type 'function
281 :group 'c)
282
283 (defcustom c-delete-function 'delete-char
284 "*Function called by `c-electric-delete' when deleting forwards."
285 :type 'function
286 :group 'c)
287
288 (defcustom c-electric-pound-behavior nil
289 "*List of behaviors for electric pound insertion.
290 Only currently supported behavior is `alignleft'."
291 :type '(set :extra-offset 8 (const alignleft))
292 :group 'c)
293
294 (defcustom c-label-minimum-indentation 1
295 "*Minimum indentation for lines inside of top-level constructs.
296 This variable typically only affects code using the `gnu' style, which
297 mandates a minimum of one space in front of every line inside
298 top-level constructs. Specifically, the function
299 `c-gnu-impose-minimum' on your `c-special-indent-hook' is what
300 enforces this."
301 :type 'integer
302 :group 'c)
303
304 (defcustom c-progress-interval 5
305 "*Interval used to update progress status during long re-indentation.
306 If a number, percentage complete gets updated after each interval of
307 that many seconds. To inhibit all messages during indentation, set
308 this variable to nil."
309 :type 'integer
310 :group 'c)
311
312 (defcustom c-default-style "gnu"
313 "*Style which gets installed by default.
314
315 The value of this variable can be any style defined in
316 `c-style-alist', including styles you add, if you add them before CC
317 Mode gets initialized. Note that if you set any CC Mode variables in
318 the top-level of your .emacs file (i.e. *not* in a hook), these get
319 incorporated into the `user' style so you would need to add:
320
321 (setq c-default-style \"user\")
322
323 to see your customizations. This is also true if you use the Custom
324 interface -- be sure to set the default style to `user'."
325 :type 'string
326 :group 'c)
327
328 (defcustom c-style-variables-are-local-p nil
329 "*Whether style variables should be buffer local by default.
330 If non-nil, then all indentation style related variables will be made
331 buffer local by default. If nil, they will remain global. Variables
332 are made buffer local when this file is loaded, and once buffer
333 localized, they cannot be made global again.
334
335 The list of variables to buffer localize are:
336 c-offsets-alist
337 c-basic-offset
338 c-file-style
339 c-file-offsets
340 c-comment-only-line-offset
341 c-cleanup-list
342 c-hanging-braces-alist
343 c-hanging-colons-alist
344 c-hanging-comment-starter-p
345 c-hanging-comment-ender-p
346 c-backslash-column
347 c-label-minimum-indentation
348 c-special-indent-hook
349 c-indentation-style"
350 :type 'boolean
351 :group 'c)
352
353 (defcustom c-mode-hook nil
354 "*Hook called by `c-mode'."
355 :type '(hook :format "%{C Mode Hook%}:\n%v")
356 :group 'c)
357
358 (defcustom c++-mode-hook nil
359 "*Hook called by `c++-mode'."
360 :type 'hook
361 :group 'c)
362
363 (defcustom objc-mode-hook nil
364 "*Hook called by `objc-mode'."
365 :type 'hook
366 :group 'c)
367
368 (defcustom java-mode-hook nil
369 "*Hook called by `java-mode'."
370 :type 'hook
371 :group 'c)
372
373 (defcustom idl-mode-hook nil
374 "*Hook called by `idl-mode'."
375 :type 'hook
376 :group 'c)
377
378 (defcustom c-mode-common-hook nil
379 "*Hook called by all CC Mode modes for common initializations."
380 :type '(hook :format "%{CC Mode Common Hook%}:\n%v")
381 :group 'c)
382
383 (defcustom c-initialization-hook nil
384 "*Hook called when the CC Mode package gets initialized.
385 This hook is only run once per Emacs session and can be used as a
386 `load-hook' or in place of using `eval-after-load'."
387 :type 'hook
388 :group 'c)
389
390 (defcustom c-enable-xemacs-performance-kludge-p t
391 "*Enables a XEmacs only hack that may improve speed for some coding styles.
392 For styles that hang top-level opening braces (as is common with JDK
393 Java coding styles) this can improve performance between 3 and 60
394 times for core indentation functions (e.g. `c-parse-state'). For
395 styles that conform to the Emacs recommendation of putting these
396 braces in column zero, this may slightly degrade performance in some
397 situations, but only by a few percentage points. This variable only
398 has effect in XEmacs.")
399
400 \f
401 ;; Non-customizable variables, still part of the interface to CC Mode
402 (defvar c-file-style nil
403 "Variable interface for setting style via File Local Variables.
404 In a file's Local Variable section, you can set this variable to a
405 string suitable for `c-set-style'. When the file is visited, CC Mode
406 will set the style of the file to this value automatically.
407
408 Note that file style settings are applied before file offset settings
409 as designated in the variable `c-file-offsets'.")
410
411 (defvar c-file-offsets nil
412 "Variable interface for setting offsets via File Local Variables.
413 In a file's Local Variable section, you can set this variable to an
414 association list similar to the values allowed in `c-offsets-alist'.
415 When the file is visited, CC Mode will institute these offset settings
416 automatically.
417
418 Note that file offset settings are applied after file style settings
419 as designated in the variable `c-file-style'.")
420
421 (defvar c-syntactic-context nil
422 "Variable containing syntactic analysis list during indentation.")
423
424 (defvar c-indentation-style c-default-style
425 "Name of style installed in the current buffer.")
426
427
428 \f
429 ;; Figure out what features this Emacs has
430 ;;;###autoload
431 (defconst c-emacs-features
432 (let ((infodock-p (boundp 'infodock-version))
433 (comments
434 ;; XEmacs 19 and beyond use 8-bit modify-syntax-entry flags.
435 ;; Emacs 19 uses a 1-bit flag. We will have to set up our
436 ;; syntax tables differently to handle this.
437 (let ((table (copy-syntax-table))
438 entry)
439 (modify-syntax-entry ?a ". 12345678" table)
440 (cond
441 ;; XEmacs 19, and beyond Emacs 19.34
442 ((arrayp table)
443 (setq entry (aref table ?a))
444 ;; In Emacs, table entries are cons cells
445 (if (consp entry) (setq entry (car entry))))
446 ;; XEmacs 20
447 ((fboundp 'get-char-table) (setq entry (get-char-table ?a table)))
448 ;; before and including Emacs 19.34
449 ((and (fboundp 'char-table-p)
450 (char-table-p table))
451 (setq entry (car (char-table-range table [?a]))))
452 ;; incompatible
453 (t (error "CC Mode is incompatible with this version of Emacs")))
454 (if (= (logand (lsh entry -16) 255) 255)
455 '8-bit
456 '1-bit))))
457 (if infodock-p
458 (list comments 'infodock)
459 (list comments)))
460 "A list of features extant in the Emacs you are using.
461 There are many flavors of Emacs out there, each with different
462 features supporting those needed by CC Mode. Here's the current
463 supported list, along with the values for this variable:
464
465 XEmacs 19: (8-bit)
466 XEmacs 20: (8-bit)
467 Emacs 19: (1-bit)
468
469 Infodock (based on XEmacs) has an additional symbol on this list:
470 `infodock'.")
471
472
473 \f
474 (provide 'cc-vars)
475 ;;; cc-vars.el ends here