Initial revision
[bpt/emacs.git] / lisp / progmodes / cc-vars.el
CommitLineData
785eecbb
RS
1;;; cc-vars.el --- user customization variables for CC Mode
2
87f235fb 3;; Copyright (C) 1985,87,92,93,94,95,96,97,98 Free Software Foundation, Inc.
785eecbb
RS
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)
541aeedf 10;; Version: See cc-mode.el
785eecbb
RS
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'.
35If the syntactic symbol for a particular line does not match a symbol
36in the offsets alist, an error is generated, otherwise no error is
37reported 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.
53If t, hitting TAB always just indents the current line. If nil,
54hitting TAB indents the current line if point is at the left margin or
55in 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
57within literals -- defined as comments and strings -- and inside
58preprocessor directives, but line is always reindented.
59
60Note: The value of `indent-tabs-mode' will determine whether a real
61tab character will be inserted, or the equivalent number of space.
62When inserting a tab, actually the function stored in the variable
63`c-insert-tab-function' is called.
64
65Note: indentation of lines containing only comments is also controlled
66by 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].
77Only used when `c-tab-always-indent' indicates a `real' tab character
78should 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.
84Can contain an integer or a cons cell of the form:
85
86 (NON-ANCHORED-OFFSET . ANCHORED-OFFSET)
87
88Where NON-ANCHORED-OFFSET is the amount of offset given to
89non-column-zero anchored comment-only lines, and ANCHORED-OFFSET is
90the amount of offset to give column-zero anchored comment-only lines.
91Just 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.
102When this variable is non-nil, comment-only lines are indented
103according to syntactic analysis via `c-offsets-alist', even when
104\\[indent-for-comment] is used."
105 :type 'boolean
106 :group 'c)
107
d278ad4f
RS
108(defcustom c-comment-continuation-stars "* "
109 "*Specifies the leader of continued block comments.
110You should set this variable to the literal string that gets inserted
111at the front of continued block style comment lines. This should
112either be the empty string, or some number of stars followed by a
113single space. Note that for line style comments, this variable is not
114used."
115 :type '(choice (const :tag "Use old semantics" nil)
116 string)
117 :group 'c)
118
785eecbb
RS
119(defcustom c-cleanup-list '(scope-operator)
120 "*List of various C/C++/ObjC constructs to \"clean up\".
121These clean ups only take place when the auto-newline feature is
122turned on, as evidenced by the `/a' or `/ah' appearing next to the
123mode 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.
165This variable contains an association list with elements of the
166following form: (SYNTACTIC-SYMBOL . ACTION).
167
168When a brace (either opening or closing) is inserted, the syntactic
169context it defines is looked up in this list, and if found, the
170associated ACTION is used to determine where newlines are inserted.
171If the context is not found, the default is to insert a newline both
172before and after the brace.
173
174SYNTACTIC-SYMBOL can be any of: defun-open, defun-close, class-open,
175class-close, inline-open, inline-close, block-open, block-close,
176substatement-open, statement-case-open, extern-lang-open,
177extern-lang-close, brace-list-open, brace-list-close,
178brace-list-intro, or brace-list-entry. See `c-offsets-alist' for
179details.
180
181ACTION can be either a function symbol or a list containing any
182combination of the symbols `before' or `after'. If the list is empty,
183no newlines are inserted either before or after the brace.
184
185When ACTION is a function symbol, the function is called with a two
186arguments: the syntactic symbol for the brace and the buffer position
187at which the brace was inserted. The function must return a list as
188described in the preceding paragraph. Note that during the call to
189the function, the variable `c-syntactic-context' is set to the entire
190syntactic 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.
213This variable contains an association list with elements of the
214following form: (SYNTACTIC-SYMBOL . ACTION).
215
216SYNTACTIC-SYMBOL can be any of: case-label, label, access-label,
217member-init-intro, or inher-intro.
218
219See the variable `c-hanging-braces-alist' for the semantics of this
220variable. Note however that making ACTION a function symbol is
221currently 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.
235The functions in this list are called, in order, whenever the
236auto-newline minor mode is activated (as evidenced by a `/a' or `/ah'
237string 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
239no 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
245If every function in the list is called with no determination made,
246then 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.
252When set to nil, C block comment enders are left on their own line.
253When set to t, block comment enders will be placed at the end of the
254previous 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.
260When set to nil, C block comment starters are left on their own line.
261When set to t, text that follows a block comment starter will be
262placed 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.
274This 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.
290Only 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.
296This variable typically only affects code using the `gnu' style, which
297mandates a minimum of one space in front of every line inside
298top-level constructs. Specifically, the function
299`c-gnu-impose-minimum' on your `c-special-indent-hook' is what
300enforces 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.
306If a number, percentage complete gets updated after each interval of
541aeedf
KH
307that many seconds. To inhibit all messages during indentation, set
308this variable to nil."
785eecbb
RS
309 :type 'integer
310 :group 'c)
311
87f235fb
RS
312(defcustom c-default-style "gnu"
313 "*Style which gets installed by default.
314
315The value of this variable can be any style defined in
316`c-style-alist', including styles you add, if you add them before CC
317Mode gets initialized. Note that if you set any CC Mode variables in
318the top-level of your .emacs file (i.e. *not* in a hook), these get
319incorporated into the `user' style so you would need to add:
320
321 (setq c-default-style \"user\")
322
323to see your customizations. This is also true if you use the Custom
324interface -- be sure to set the default style to `user'."
785eecbb
RS
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.
330If non-nil, then all indentation style related variables will be made
331buffer local by default. If nil, they will remain global. Variables
332are made buffer local when this file is loaded, and once buffer
333localized, they cannot be made global again.
334
335The 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
253011b3
RS
373(defcustom idl-mode-hook nil
374 "*Hook called by `idl-mode'."
375 :type 'hook
376 :group 'c)
377
785eecbb
RS
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
253011b3
RS
383(defcustom c-initialization-hook nil
384 "*Hook called when the CC Mode package gets initialized.
385This 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
87f235fb
RS
390(defcustom c-enable-xemacs-performance-kludge-p t
391 "*Enables a XEmacs only hack that may improve speed for some coding styles.
392For styles that hang top-level opening braces (as is common with JDK
393Java coding styles) this can improve performance between 3 and 60
394times for core indentation functions (e.g. `c-parse-state'). For
395styles that conform to the Emacs recommendation of putting these
396braces in column zero, this may slightly degrade performance in some
397situations, but only by a few percentage points. This variable only
398has effect in XEmacs.")
785eecbb
RS
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.
404In a file's Local Variable section, you can set this variable to a
405string suitable for `c-set-style'. When the file is visited, CC Mode
406will set the style of the file to this value automatically.
407
408Note that file style settings are applied before file offset settings
409as designated in the variable `c-file-offsets'.")
410
411(defvar c-file-offsets nil
412 "Variable interface for setting offsets via File Local Variables.
413In a file's Local Variable section, you can set this variable to an
414association list similar to the values allowed in `c-offsets-alist'.
415When the file is visited, CC Mode will institute these offset settings
416automatically.
417
418Note that file offset settings are applied after file style settings
419as designated in the variable `c-file-style'.")
420
421(defvar c-syntactic-context nil
422 "Variable containing syntactic analysis list during indentation.")
423
87f235fb 424(defvar c-indentation-style c-default-style
785eecbb
RS
425 "Name of style installed in the current buffer.")
426
d278ad4f 427
785eecbb 428\f
419277c5
RS
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.
461There are many flavors of Emacs out there, each with different
462features supporting those needed by CC Mode. Here's the current
463supported 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
469Infodock (based on XEmacs) has an additional symbol on this list:
abfbd563 470`infodock'.")
419277c5
RS
471
472
473\f
785eecbb
RS
474(provide 'cc-vars)
475;;; cc-vars.el ends here