summaryrefslogtreecommitdiff
path: root/lisp/progmodes/cc-vars.el
diff options
context:
space:
mode:
authorAlan Mackenzie <acm@muc.de>2005-12-02 12:30:36 +0000
committerAlan Mackenzie <acm@muc.de>2005-12-02 12:30:36 +0000
commit0386b551af726187e2eb674fa2ffdb1cfedaabe8 (patch)
treec9fbaebac1a286f8da48c085a8476e94f18122d2 /lisp/progmodes/cc-vars.el
parentd60d4cd6ef15e4162e4e0abdddb522b541d30010 (diff)
downloademacs-0386b551af726187e2eb674fa2ffdb1cfedaabe8.tar.gz
Update CC Mode to release 5.31.
Diffstat (limited to 'lisp/progmodes/cc-vars.el')
-rw-r--r--lisp/progmodes/cc-vars.el555
1 files changed, 321 insertions, 234 deletions
diff --git a/lisp/progmodes/cc-vars.el b/lisp/progmodes/cc-vars.el
index b6a3c404957..4c5d03c6f4c 100644
--- a/lisp/progmodes/cc-vars.el
+++ b/lisp/progmodes/cc-vars.el
@@ -1,6 +1,7 @@
;;; cc-vars.el --- user customization variables for CC Mode
-;; Copyright (C) 1985,1987,1992-2003, 2004, 2005 Free Software Foundation, Inc.
+;; Copyright (C) 1985,1987,1992-2003, 2004, 2005 Free Software
+;; Foundation, Inc.
;; Authors: 1998- Martin Stjernholm
;; 1992-1999 Barry A. Warsaw
@@ -24,7 +25,7 @@
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to
+;; along with this program; see the file COPYING. If not, write to
;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
;; Boston, MA 02110-1301, USA.
@@ -43,33 +44,11 @@
(cc-require 'cc-defs)
;; Silence the compiler.
-(cc-bytecomp-defun get-char-table) ; XEmacs 20+
-(cc-bytecomp-defun char-table-range) ; Emacs 19+
-(cc-bytecomp-defun char-table-p) ; Emacs 19+, XEmacs 20+
-
-;; Pull in custom if it exists and is recent enough (the one in Emacs
-;; 19.34 isn't).
-(eval
- (cc-eval-when-compile
- (condition-case nil
- (progn
- (require 'custom)
- (or (fboundp 'defcustom) (error ""))
- (require 'widget)
- '(progn ; Compile in the require's.
- (require 'custom)
- (require 'widget)))
- (error
- (message "Warning: Compiling without Customize support \
-since a (good enough) custom library wasn't found")
- (cc-bytecomp-defmacro define-widget (name class doc &rest args))
- (cc-bytecomp-defmacro defgroup (symbol members doc &rest args))
- (cc-bytecomp-defmacro defcustom (symbol value doc &rest args)
- `(defvar ,symbol ,value ,doc))
- (cc-bytecomp-defmacro custom-declare-variable (symbol value doc
- &rest args)
- `(defvar ,(eval symbol) ,(eval value) ,doc))
- nil))))
+(cc-bytecomp-defun get-char-table) ; XEmacs
+
+(cc-eval-when-compile
+ (require 'custom)
+ (require 'widget))
(cc-eval-when-compile
;; Need the function form of `backquote', which isn't standardized
@@ -207,7 +186,6 @@ the value set here overrides the style system (there is a variable
(defun c-valid-offset (offset)
"Return non-nil iff OFFSET is a valid offset for a syntactic symbol.
See `c-offsets-alist'."
- ;; This function does not do any hidden buffer changes.
(or (eq offset '+)
(eq offset '-)
(eq offset '++)
@@ -216,17 +194,19 @@ See `c-offsets-alist'."
(eq offset '/)
(integerp offset)
(functionp offset)
- (and (symbolp offset)
- (or (boundp offset)
- (fboundp offset)))
+ (and (symbolp offset) (boundp offset))
(and (vectorp offset)
(= (length offset) 1)
(integerp (elt offset 0)))
- (progn
- (while (and (consp offset)
- (c-valid-offset (car offset)))
- (setq offset (cdr offset)))
- (null offset))))
+ (and (consp offset)
+ (not (eq (car offset) 'quote)) ; Detect misquoted lists.
+ (progn
+ (when (memq (car offset) '(first min max add))
+ (setq offset (cdr offset)))
+ (while (and (consp offset)
+ (c-valid-offset (car offset)))
+ (setq offset (cdr offset)))
+ (null offset)))))
@@ -311,6 +291,7 @@ effect in this mode, nor any of the indentation associated variables,
e.g. `c-special-indent-hook'."
:type 'boolean
:group 'c)
+(make-variable-buffer-local 'c-syntactic-indentation)
(defcustom c-syntactic-indentation-in-macros t
"*Enable syntactic analysis inside macros.
@@ -470,6 +451,7 @@ style comments."
(defcustom-c-stylevar c-comment-prefix-regexp
'((pike-mode . "//+!?\\|\\**")
+ (awk-mode . "#+")
(other . "//+\\|\\**"))
"*Regexp to match the line prefix inside comments.
This regexp is used to recognize the fill prefix inside comments for
@@ -517,14 +499,17 @@ variable in a mode hook."
(cons :format "%v"
(const :format "IDL " idl-mode) (regexp :format "%v"))
(cons :format "%v"
- (const :format "Pike " pike-mode) (regexp :format "%v")))
+ (const :format "Pike " pike-mode) (regexp :format "%v"))
+ (cons :format "%v"
+ (const :format "AWK " awk-mode) (regexp :format "%v")))
(cons :format " %v"
(const :format "Other " other) (regexp :format "%v"))))
:group 'c)
(defcustom-c-stylevar c-doc-comment-style
'((java-mode . javadoc)
- (pike-mode . autodoc))
+ (pike-mode . autodoc)
+ (c-mode . gtkdoc))
"*Specifies documentation comment style(s) to recognize.
This is primarily used to fontify doc comments and the markup within
them, e.g. Javadoc comments.
@@ -534,6 +519,7 @@ comment styles:
javadoc -- Javadoc style for \"/** ... */\" comments (default in Java mode).
autodoc -- Pike autodoc style for \"//! ...\" comments (default in Pike mode).
+ gtkdoc -- GtkDoc style for \"/** ... **/\" comments (default in C mode).
The value may also be a list of doc comment styles, in which case all
of them are recognized simultaneously (presumably with markup cues
@@ -586,6 +572,9 @@ afterwards to redo that work."
(const :format "Pike " pike-mode)
(c-symbol-list :format "%v"))
(cons :format "%v"
+ (const :format "AWK " awk-mode)
+ (c-symbol-list :format "%v"))
+ (cons :format "%v"
(const :format "Other " other)
(c-symbol-list :format "%v")))))
:group 'c)
@@ -613,8 +602,8 @@ contexts are:
(defcustom-c-stylevar c-cleanup-list '(scope-operator)
"*List of various C/C++/ObjC constructs to \"clean up\".
The following clean ups only take place when the auto-newline feature
-is turned on, as evidenced by the `/a' or `/ah' appearing next to the
-mode name:
+is turned on, as evidenced by the `/la' appearing next to the mode
+name:
brace-else-brace -- Clean up \"} else {\" constructs by placing
entire construct on a single line. This clean
@@ -630,21 +619,28 @@ mode name:
\"} catch (...) {\" constructs.
empty-defun-braces -- Clean up empty defun braces by placing the
braces on the same line. Clean up occurs when
- the defun closing brace is typed.
+ the defun closing brace is typed.
+ one-liner-defun -- If the code inside a function body is a single
+ line then remove any newlines between that
+ line and the defun braces so that the whole
+ body becomes a single line.
+ `c-max-one-liner-length' gives the maximum
+ length allowed for the resulting line. Clean
+ up occurs when the closing brace is typed.
defun-close-semi -- Clean up the terminating semi-colon on defuns
- by placing the semi-colon on the same line as
- the closing brace. Clean up occurs when the
- semi-colon is typed.
+ by placing the semi-colon on the same line as
+ the closing brace. Clean up occurs when the
+ semi-colon is typed.
list-close-comma -- Clean up commas following braces in array
and aggregate initializers. Clean up occurs
- when the comma is typed.
+ when the comma is typed.
scope-operator -- Clean up double colons which may designate
- a C++ scope operator split across multiple
- lines. Note that certain C++ constructs can
- generate ambiguous situations. This clean up
- only takes place when there is nothing but
- whitespace between colons. Clean up occurs
- when the second colon is typed.
+ a C++ scope operator split across multiple
+ lines. Note that certain C++ constructs can
+ generate ambiguous situations. This clean up
+ only takes place when there is nothing but
+ whitespace between colons. Clean up occurs
+ when the second colon is typed.
The following clean ups always take place when they are on this list,
regardless of the auto-newline feature, since they typically don't
@@ -654,31 +650,39 @@ involve auto-newline inserted newlines:
parenthesis of a function call. Clean up
occurs when the opening parenthesis is typed.
compact-empty-funcall -- Clean up any space before the function call
- opening parenthesis if and only if the
+ opening parenthesis if and only if the
argument list is empty. This is typically
useful together with `space-before-funcall' to
get the style \"foo (bar)\" and \"foo()\".
Clean up occurs when the closing parenthesis
- is typed."
+ is typed.
+ comment-close-slash -- When a slash is typed after the comment prefix
+ on a bare line in a c-style comment, the comment
+ is closed by cleaning up preceding space and
+ inserting a star if needed."
:type '(set
- (const :tag "Put \"} else {\" on one line"
+ (const :tag "Put \"} else {\" on one line (brace-else-brace)"
brace-else-brace)
- (const :tag "Put \"} else if (...) {\" on one line"
+ (const :tag "Put \"} else if (...) {\" on one line (brace-elseif-brace)"
brace-elseif-brace)
- (const :tag "Put \"} catch (...) {\" on one line"
+ (const :tag "Put \"} catch (...) {\" on one line (brace-catch-brace)"
brace-catch-brace)
- (const :tag "Put empty defun braces on one line"
+ (const :tag "Put empty defun braces on one line (empty-defun-braces)"
empty-defun-braces)
- (const :tag "Put \"};\" ending defuns on one line"
+ (const :tag "Put short function bodies on one line (one-liner-defun)"
+ one-liner-defun)
+ (const :tag "Put \"};\" ending defuns on one line (defun-close-semi)"
defun-close-semi)
- (const :tag "Put \"},\" in aggregates on one line"
+ (const :tag "Put \"},\" in aggregates on one line (list-close-comma)"
list-close-comma)
- (const :tag "Put C++ style \"::\" on one line"
+ (const :tag "Put C++ style \"::\" on one line (scope-operator)"
scope-operator)
- (const :tag "Put a space before funcall parens, e.g. \"foo (bar)\""
+ (const :tag "Put a space before funcall parens, e.g. \"foo (bar)\" (space-before-funcall)"
space-before-funcall)
- (const :tag "Remove space before empty funcalls, e.g. \"foo()\""
- compact-empty-funcall))
+ (const :tag "Remove space before empty funcalls, e.g. \"foo()\" (compact-empty-funcall)"
+ compact-empty-funcall)
+ (const :tag "Make / on a bare line of a C-style comment close it (comment-close-slash)"
+ comment-close-slash))
:group 'c)
(defcustom-c-stylevar c-hanging-braces-alist '((brace-list-open)
@@ -751,6 +755,12 @@ syntactic context for the brace line."
inexpr-class-open inexpr-class-close)))
:group 'c)
+(defcustom c-max-one-liner-length 80
+ "Maximum length of line that clean-up \"one-liner-defun\" will compact to.
+Zero or nil means no limit."
+ :type 'integer
+ :group 'c)
+
(defcustom-c-stylevar c-hanging-colons-alist nil
"*Controls the insertion of newlines before and after certain colons.
This variable contains an association list with elements of the
@@ -832,35 +842,40 @@ space."
:group 'c)
(defcustom c-require-final-newline
- ;; C and C++ mandates that all nonempty files should end with a
+ ;; C and C++ mandate that all nonempty files should end with a
;; newline. Objective-C refers to C for all things it doesn't
- ;; specify, so the same holds there. The other languages does not
+ ;; specify, so the same holds there. The other languages do not
;; require it (at least not explicitly in a normative text).
'((c-mode . t)
(c++-mode . t)
(objc-mode . t))
- "*Controls `require-final-newline' in C-related major modes.
-The value is an association list specifying, for each specific mode,
-whether to override `require-final-newline'. If the cdr of the element
-is non-nil, that means to use `mode-require-final-newline' instead."
+ "*Controls whether a final newline is ensured when the file is saved.
+The value is an association list that for each language mode specifies
+the value to give to `require-final-newline' at mode initialization;
+see that variable for details about the value. If a language isn't
+present on the association list, CC Mode won't touch
+`require-final-newline' in buffers for that language."
:type `(set (cons :format "%v"
(const :format "C " c-mode)
- (const t))
+ (symbol :format "%v" :value ,require-final-newline))
(cons :format "%v"
(const :format "C++ " c++-mode)
- (const t))
+ (symbol :format "%v" :value ,require-final-newline))
(cons :format "%v"
(const :format "ObjC " objc-mode)
- (const t))
+ (symbol :format "%v" :value ,require-final-newline))
(cons :format "%v"
(const :format "Java " java-mode)
- (const t))
+ (symbol :format "%v" :value ,require-final-newline))
(cons :format "%v"
(const :format "IDL " idl-mode)
- (const t))
+ (symbol :format "%v" :value ,require-final-newline))
(cons :format "%v"
(const :format "Pike " pike-mode)
- (const t)))
+ (symbol :format "%v" :value ,require-final-newline))
+ (cons :format "%v"
+ (const :format "AWK " awk-mode)
+ (symbol :format "%v" :value ,require-final-newline)))
:group 'c)
(defcustom c-electric-pound-behavior nil
@@ -892,7 +907,8 @@ this variable to nil."
:type 'integer
:group 'c)
-(defcustom c-default-style '((java-mode . "java") (other . "gnu"))
+(defcustom c-default-style '((java-mode . "java") (awk-mode . "awk")
+ (other . "gnu"))
"*Style which gets installed by default when a file is visited.
The value of this variable can be any style defined in
@@ -927,6 +943,8 @@ can always override the use of `c-default-style' by making calls to
(cons :format "%v"
(const :format "Pike " pike-mode) (string :format "%v"))
(cons :format "%v"
+ (const :format "AWK " awk-mode) (string :format "%v"))
+ (cons :format "%v"
(const :format "Other " other) (string :format "%v"))))
:group 'c)
@@ -939,170 +957,170 @@ can always override the use of `c-default-style' by making calls to
;; symbol and continue searching.
(c-set-stylevar-fallback 'c-offsets-alist
'((string . c-lineup-dont-change)
- ;; Relpos: Beg of previous line.
+ ;; Anchor pos: Beg of previous line.
(c . c-lineup-C-comments)
- ;; Relpos: Beg of the comment.
+ ;; Anchor pos: Beg of the comment.
(defun-open . 0)
- ;; Relpos: When inside a class: Boi at the func decl start.
+ ;; Anchor pos: When inside a class: Boi at the func decl start.
;; When at top level: Bol at the func decl start. When inside
;; a code block (only possible in Pike): At the func decl
;; start(*).
(defun-close . 0)
- ;; Relpos: At the defun block open if it's at boi, otherwise
- ;; boi at the func decl start.
+ ;; Anchor pos: At the defun block open if it's at boi,
+ ;; otherwise boi at the func decl start.
(defun-block-intro . +)
- ;; Relpos: At the block open(*).
+ ;; Anchor pos: At the block open(*).
(class-open . 0)
- ;; Relpos: Boi at the class decl start.
+ ;; Anchor pos: Boi at the class decl start.
(class-close . 0)
- ;; Relpos: Boi at the class decl start.
+ ;; Anchor pos: Boi at the class decl start.
(inline-open . +)
- ;; Relpos: None for functions (inclass got the relpos then),
- ;; boi at the lambda start for lambdas.
+ ;; Anchor pos: None for functions (inclass got the relpos
+ ;; then), boi at the lambda start for lambdas.
(inline-close . 0)
- ;; Relpos: Inexpr functions: At the lambda block open if it's
- ;; at boi, else at the statement(*) at boi of the start of the
- ;; lambda construct. Otherwise: At the inline block open if
- ;; it's at boi, otherwise boi at the func decl start.
+ ;; Anchor pos: Inexpr functions: At the lambda block open if
+ ;; it's at boi, else at the statement(*) at boi of the start of
+ ;; the lambda construct. Otherwise: At the inline block open
+ ;; if it's at boi, otherwise boi at the func decl start.
(func-decl-cont . +)
- ;; Relpos: Boi at the func decl start.
+ ;; Anchor pos: Boi at the func decl start.
(knr-argdecl-intro . +)
- ;; Relpos: Boi at the topmost intro line.
+ ;; Anchor pos: Boi at the topmost intro line.
(knr-argdecl . 0)
- ;; Relpos: At the beginning of the first K&R argdecl.
+ ;; Anchor pos: At the beginning of the first K&R argdecl.
(topmost-intro . 0)
- ;; Relpos: Bol at the last line of previous construct.
+ ;; Anchor pos: Bol at the last line of previous construct.
(topmost-intro-cont . c-lineup-topmost-intro-cont)
- ;; Relpos: Boi at the topmost intro line.
+ ;; Anchor pos: Boi at the topmost intro line.
(member-init-intro . +)
- ;; Relpos: Boi at the func decl arglist open.
+ ;; Anchor pos: Boi at the func decl arglist open.
(member-init-cont . c-lineup-multi-inher)
- ;; Relpos: Beg of the first member init.
+ ;; Anchor pos: Beg of the first member init.
(inher-intro . +)
- ;; Relpos: Boi at the class decl start.
+ ;; Anchor pos: Boi at the class decl start.
(inher-cont . c-lineup-multi-inher)
- ;; Relpos: Java: At the implements/extends keyword start.
+ ;; Anchor pos: Java: At the implements/extends keyword start.
;; Otherwise: At the inher start colon, or boi at the class
;; decl start if the first inherit clause hangs and it's not a
;; func-local inherit clause (when does that occur?).
(block-open . 0)
- ;; Relpos: Inexpr statement: At the statement(*) at boi of the
- ;; start of the inexpr construct. Otherwise: None.
+ ;; Anchor pos: Inexpr statement: At the statement(*) at boi of
+ ;; the start of the inexpr construct. Otherwise: None.
(block-close . 0)
- ;; Relpos: Inexpr statement: At the inexpr block open if it's
- ;; at boi, else at the statement(*) at boi of the start of the
- ;; inexpr construct. Block hanging on a case/default label: At
- ;; the closest preceding label that starts at boi. Otherwise:
- ;; At the block open(*).
+ ;; Anchor pos: Inexpr statement: At the inexpr block open if
+ ;; it's at boi, else at the statement(*) at boi of the start of
+ ;; the inexpr construct. Block hanging on a case/default
+ ;; label: At the closest preceding label that starts at boi.
+ ;; Otherwise: At the block open(*).
(brace-list-open . 0)
- ;; Relpos: Boi at the brace list decl start, but a starting
+ ;; Anchor pos: Boi at the brace list decl start, but a starting
;; "typedef" token is ignored.
(brace-list-close . 0)
- ;; Relpos: At the brace list decl start(*).
+ ;; Anchor pos: At the brace list decl start(*).
(brace-list-intro . +)
- ;; Relpos: At the brace list decl start(*).
+ ;; Anchor pos: At the brace list decl start(*).
(brace-list-entry . 0)
- ;; Relpos: At the first non-ws char after the open paren if the
- ;; first token is on the same line, otherwise boi at that
+ ;; Anchor pos: At the first non-ws char after the open paren if
+ ;; the first token is on the same line, otherwise boi at that
;; token.
(brace-entry-open . 0)
- ;; Relpos: Same as brace-list-entry.
+ ;; Anchor pos: Same as brace-list-entry.
(statement . 0)
- ;; Relpos: After a `;' in the condition clause of a for
+ ;; Anchor pos: After a `;' in the condition clause of a for
;; statement: At the first token after the starting paren.
;; Otherwise: At the preceding statement(*).
(statement-cont . +)
- ;; Relpos: After the first token in the condition clause of a
- ;; for statement: At the first token after the starting paren.
- ;; Otherwise: At the containing statement(*).
+ ;; Anchor pos: After the first token in the condition clause of
+ ;; a for statement: At the first token after the starting
+ ;; paren. Otherwise: At the containing statement(*).
(statement-block-intro . +)
- ;; Relpos: In inexpr statement block: At the inexpr block open
- ;; if it's at boi, else at the statement(*) at boi of the start
- ;; of the inexpr construct. In a block hanging on a
+ ;; Anchor pos: In inexpr statement block: At the inexpr block
+ ;; open if it's at boi, else at the statement(*) at boi of the
+ ;; start of the inexpr construct. In a block hanging on a
;; case/default label: At the closest preceding label that
;; starts at boi. Otherwise: At the start of the containing
;; block(*).
(statement-case-intro . +)
- ;; Relpos: At the case/default label(*).
+ ;; Anchor pos: At the case/default label(*).
(statement-case-open . 0)
- ;; Relpos: At the case/default label(*).
+ ;; Anchor pos: At the case/default label(*).
(substatement . +)
- ;; Relpos: At the containing statement(*).
+ ;; Anchor pos: At the containing statement(*).
(substatement-open . +)
- ;; Relpos: At the containing statement(*).
+ ;; Anchor pos: At the containing statement(*).
(substatement-label . 2)
- ;; Relpos: At the containing statement(*).
+ ;; Anchor pos: At the containing statement(*).
(case-label . 0)
- ;; Relpos: At the start of the switch block(*).
+ ;; Anchor pos: At the start of the switch block(*).
(access-label . -)
- ;; Relpos: Same as inclass.
+ ;; Anchor pos: Same as inclass.
(label . 2)
- ;; Relpos: At the start of the containing block(*).
+ ;; Anchor pos: At the start of the containing block(*).
(do-while-closure . 0)
- ;; Relpos: At the corresponding while statement(*).
+ ;; Anchor pos: At the corresponding while statement(*).
(else-clause . 0)
- ;; Relpos: At the corresponding if statement(*).
+ ;; Anchor pos: At the corresponding if statement(*).
(catch-clause . 0)
- ;; Relpos: At the previous try or catch statement clause(*).
+ ;; Anchor pos: At the previous try or catch statement clause(*).
(comment-intro . (c-lineup-knr-region-comment c-lineup-comment))
- ;; Relpos: None.
+ ;; Anchor pos: None.
(arglist-intro . +)
- ;; Relpos: Boi at the open paren, or at the first non-ws after
- ;; the open paren of the surrounding sexp, whichever is later.
+ ;; Anchor pos: At the containing statement(*).
+ ;; 2nd pos: At the open paren.
(arglist-cont . (c-lineup-gcc-asm-reg 0))
- ;; Relpos: At the first token after the open paren.
+ ;; Anchor pos: At the first token after the open paren.
(arglist-cont-nonempty . (c-lineup-gcc-asm-reg c-lineup-arglist))
- ;; Relpos: At the containing statement(*).
+ ;; Anchor pos: At the containing statement(*).
;; 2nd pos: At the open paren.
(arglist-close . +)
- ;; Relpos: At the containing statement(*).
+ ;; Anchor pos: At the containing statement(*).
;; 2nd pos: At the open paren.
(stream-op . c-lineup-streamop)
- ;; Relpos: Boi at the first stream op in the statement.
+ ;; Anchor pos: Boi at the first stream op in the statement.
(inclass . +)
- ;; Relpos: At the class open brace if it's at boi, otherwise
- ;; boi at the class decl start.
+ ;; Anchor pos: At the class open brace if it's at boi,
+ ;; otherwise boi at the class decl start.
(cpp-macro . [0])
- ;; Relpos: None.
+ ;; Anchor pos: None.
(cpp-macro-cont . +)
- ;; Relpos: At the macro start (always at boi).
+ ;; Anchor pos: At the macro start (always at boi).
(cpp-define-intro . (c-lineup-cpp-define +))
- ;; Relpos: None.
+ ;; Anchor pos: None.
(friend . 0)
- ;; Relpos: None.
+ ;; Anchor pos: None.
(objc-method-intro . [0])
- ;; Relpos: Boi.
+ ;; Anchor pos: Boi.
(objc-method-args-cont . c-lineup-ObjC-method-args)
- ;; Relpos: At the method start (always at boi).
+ ;; Anchor pos: At the method start (always at boi).
(objc-method-call-cont . c-lineup-ObjC-method-call)
- ;; Relpos: At the open bracket.
+ ;; Anchor pos: At the open bracket.
(extern-lang-open . 0)
(namespace-open . 0)
(module-open . 0)
(composition-open . 0)
- ;; Relpos: Boi at the extern/namespace/etc keyword.
+ ;; Anchor pos: Boi at the extern/namespace/etc keyword.
(extern-lang-close . 0)
(namespace-close . 0)
(module-close . 0)
(composition-close . 0)
- ;; Relpos: Boi at the corresponding extern/namespace/etc keyword.
+ ;; Anchor pos: Boi at the corresponding extern/namespace/etc keyword.
(inextern-lang . +)
(innamespace . +)
(inmodule . +)
(incomposition . +)
- ;; Relpos: At the extern/namespace/etc block open brace if it's
- ;; at boi, otherwise boi at the keyword.
+ ;; Anchor pos: At the extern/namespace/etc block open brace if
+ ;; it's at boi, otherwise boi at the keyword.
(template-args-cont . (c-lineup-template-args +))
- ;; Relpos: Boi at the decl start. This might be changed; the
- ;; logical position is clearly the opening '<'.
+ ;; Anchor pos: Boi at the decl start. This might be changed;
+ ;; the logical position is clearly the opening '<'.
(inlambda . c-lineup-inexpr-block)
- ;; Relpos: None.
+ ;; Anchor pos: None.
(lambda-intro-cont . +)
- ;; Relpos: Boi at the lambda start.
+ ;; Anchor pos: Boi at the lambda start.
(inexpr-statement . +)
- ;; Relpos: None.
+ ;; Anchor pos: None.
(inexpr-class . +)
- ;; Relpos: None.
+ ;; Anchor pos: None.
))
(defcustom c-offsets-alist nil
"Association list of syntactic element symbols and indentation offsets.
@@ -1112,50 +1130,66 @@ As described below, each cons cell in this list has the form:
When a line is indented, CC Mode first determines the syntactic
context of it by generating a list of symbols called syntactic
-elements. This list can contain more than one syntactic element and
-the global variable `c-syntactic-context' contains the context list
-for the line being indented. Each element in this list is actually a
-cons cell of the syntactic symbol and a buffer position. This buffer
-position is called the relative indent point for the line. Some
-syntactic symbols may not have a relative indent point associated with
-them.
-
-After the syntactic context list for a line is generated, CC Mode
-calculates the absolute indentation for the line by looking at each
-syntactic element in the list. It compares the syntactic element
-against the SYNTACTIC-SYMBOL's in `c-offsets-alist'. When it finds a
-match, it adds the OFFSET to the column of the relative indent point.
-The sum of this calculation for each element in the syntactic list is
+elements. The global variable `c-syntactic-context' is bound to the
+that list. Each element in the list is in turn a list where the first
+element is a syntactic symbol which tells what kind of construct the
+indentation point is located within. More elements in the syntactic
+element lists are optional. If there is one more and it isn't nil,
+then it's the anchor position for that construct.
+
+After generating the syntactic context for the line, CC Mode
+calculates the absolute indentation: First the base indentation is
+found by using the anchor position for the first syntactic element
+that provides one. If none does, zero is used as base indentation.
+Then CC Mode looks at each syntactic element in the context in turn.
+It compares the car of the syntactic element against the
+SYNTACTIC-SYMBOL's in `c-offsets-alist'. When it finds a match, it
+adds OFFSET to the base indentation. The sum of this calculation is
the absolute offset for line being indented.
If the syntactic element does not match any in the `c-offsets-alist',
the element is ignored.
-If OFFSET is nil, the syntactic element is ignored in the offset
-calculation.
+OFFSET can specify an offset in several different ways:
+
+ If OFFSET is nil then it's ignored.
+
+ If OFFSET is an integer then it's used as relative offset, i.e. it's
+ added to the base indentation.
-If OFFSET is an integer, it's added to the relative indent.
+ If OFFSET is one of the symbols `+', `-', `++', `--', `*', or `/'
+ then a positive or negative multiple of `c-basic-offset' is added to
+ the base indentation; 1, -1, 2, -2, 0.5, and -0.5, respectively.
-If OFFSET is one of the symbols `+', `-', `++', `--', `*', or `/', a
-positive or negative multiple of `c-basic-offset' is added; 1, -1, 2,
--2, 0.5, and -0.5, respectively.
+ If OFFSET is a symbol with a value binding then that value, which
+ must be an integer, is used as relative offset.
-If OFFSET is a vector, it's first element, which must be an integer,
-is used as an absolute indentation column. This overrides all
-relative offsets. If there are several syntactic elements which
-evaluates to absolute indentation columns, the first one takes
-precedence. You can see in which order CC Mode combines the syntactic
-elements in a certain context by using \\[c-show-syntactic-information] on the line.
+ If OFFSET is a vector then it's first element, which must be an
+ integer, is used as an absolute indentation column. This overrides
+ the previous base indentation and the relative offsets applied to
+ it, and it becomes the new base indentation.
-If OFFSET is a function, it's called with a single argument
-containing the cons of the syntactic element symbol and the relative
-indent point. The return value from the function is then
-reinterpreted as an OFFSET value.
+ If OFFSET is a function or a lambda expression then it's called with
+ a single argument containing the cons of the syntactic symbol and
+ the anchor position (or nil if there is none). The return value
+ from the function is then reinterpreted as an offset specification.
-If OFFSET is a list, it's recursively evaluated using the semantics
-described above. The first element of the list to return a non-nil
-value succeeds. If none of the elements returns a non-nil value, the
-syntactic element is ignored.
+ If OFFSET is a list then its elements are evaluated recursively as
+ offset specifications. If the first element is any of the symbols
+ below then it isn't evaluated but instead specifies how the
+ remaining offsets in the list should be combined. If it's something
+ else then the list is combined according the method `first'. The
+ valid combination methods are:
+
+ `first' -- Use the first offset (that doesn't evaluate to nil).
+ `min' -- Use the minimum of all the offsets. All must be either
+ relative or absolute - they can't be mixed.
+ `max' -- Use the maximum of all the offsets. All must be either
+ relative or absolute - they can't be mixed.
+ `add' -- Add all the evaluated offsets together. Exactly one of
+ them may be absolute, in which case the result is
+ absolute. Any relative offsets that preceded the
+ absolute one in the list will be ignored in that case.
`c-offsets-alist' is a style variable. This means that the offsets on
this variable are normally taken from the style system in CC Mode
@@ -1336,6 +1370,11 @@ The list of variables to buffer localize are:
:type 'hook
:group 'c)
+(defcustom awk-mode-hook nil
+ "*Hook called by `awk-mode'."
+ :type 'hook
+ :group 'c)
+
(defcustom c-mode-common-hook nil
"*Hook called by all CC Mode modes for common initializations."
:type 'hook
@@ -1380,16 +1419,17 @@ working due to this change.")
:args '((const :tag "none" nil)
(repeat :tag "types" regexp)))
-(eval-and-compile
- ;; XEmacs 19 evaluates this at compile time below, while most other
- ;; versions delays the evaluation until the package is loaded.
- (defun c-make-font-lock-extra-types-blurb (mode1 mode2 example)
- (concat "\
+(defun c-make-font-lock-extra-types-blurb (mode1 mode2 example)
+ (concat "\
*List of extra types (aside from the type keywords) to recognize in "
mode1 " mode.
Each list item should be a regexp matching a single identifier.
" example "
+Note that items on this list that don't include any regexp special
+characters are automatically optimized using `regexp-opt', so you
+should not use `regexp-opt' explicitly to build regexps here.
+
On decoration level 3 (and higher, where applicable), a method is used
that finds most types and declarations by syntax alone. This variable
is still used as a first step, but other types are recognized
@@ -1401,43 +1441,58 @@ initialized. If you change it later you have to reinitialize CC Mode
by doing \\[" mode2 "].
Despite the name, this variable is not only used for font locking but
-also elsewhere in CC Mode to tell types from other identifiers.")))
+also elsewhere in CC Mode to tell types from other identifiers."))
;; Note: Most of the variables below are also defined in font-lock.el
-;; in older versions in Emacs, so depending on the load order we might
+;; in older versions of Emacs, so depending on the load order we might
;; not install the values below. There's no kludge to cope with this
;; (as opposed to the *-font-lock-keywords-* variables) since the old
;; values work fairly well anyway.
(defcustom c-font-lock-extra-types
- '("FILE" "\\sw+_t"
- "bool" "complex" "imaginary" ; Defined in C99.
+ '("\\sw+_t"
+ ;; Defined in C99:
+ "bool" "complex" "imaginary"
+ ;; Standard library types (except those matched by the _t pattern):
+ "FILE" "lconv" "tm" "va_list" "jmp_buf"
;; I do not appreciate the following very Emacs-specific luggage
;; in the default value, but otoh it can hardly get in the way for
;; other users, and removing it would cause unnecessary grief for
;; the old timers that are used to it. /mast
"Lisp_Object")
(c-make-font-lock-extra-types-blurb "C" "c-mode"
-"For example, a value of (\"FILE\" \"\\\\sw+_t\") means the word FILE
-and words ending in _t are treated as type names.")
+"For example, a value of (\"FILE\" \"\\\\sw+_t\") means the word \"FILE\"
+and words ending in \"_t\" are treated as type names.")
:type 'c-extra-types-widget
:group 'c)
(defcustom c++-font-lock-extra-types
'("\\sw+_t"
- "\\([iof]\\|str\\)+stream\\(buf\\)?" "ios"
+ ;; C library types (except those matched by the _t pattern):
+ "FILE" "lconv" "tm" "va_list" "jmp_buf"
+ ;; Some standard C++ types that came from font-lock.el.
+ ;; Experienced C++ users says there's no clear benefit in
+ ;; extending this to all the types in the standard library, at
+ ;; least not when they'll be recognized without "std::" too.
+ "istream" "istreambuf"
+ "ostream" "ostreambuf"
+ "ifstream" "ofstream" "fstream"
+ "strstream" "strstreambuf" "istrstream" "ostrstream"
+ "ios"
"string" "rope"
"list" "slist"
"deque" "vector" "bit_vector"
"set" "multiset"
"map" "multimap"
- "hash\\(_\\(m\\(ap\\|ulti\\(map\\|set\\)\\)\\|set\\)\\)?"
+ "hash"
+ "hash_set" "hash_multiset"
+ "hash_map" "hash_multimap"
"stack" "queue" "priority_queue"
"type_info"
"iterator" "const_iterator" "reverse_iterator" "const_reverse_iterator"
"reference" "const_reference")
(c-make-font-lock-extra-types-blurb "C++" "c++-mode"
-"For example, a value of (\"string\") means the word string is treated
+"For example, a value of (\"string\") means the word \"string\" is treated
as a type name.")
:type 'c-extra-types-widget
:group 'c)
@@ -1499,40 +1554,49 @@ Note that file offset settings are applied after file style settings
as designated in the variable `c-file-style'.")
(make-variable-buffer-local 'c-file-offsets)
-;; It isn't possible to specify a docstring without specifying an
-;; initial value with `defvar', so the following two variables have
-;; only doc comments even though they are part of the API. It's
-;; really good not to have an initial value for variables like these
-;; that always should be dynamically bound, so it's worth the
-;; inconvenience.
+;; It isn't possible to specify a doc-string without specifying an
+;; initial value with `defvar', so the following two variables have been
+;; given doc-strings by setting the property `variable-documentation'
+;; directly. C-h v will read this documentation only for versions of GNU
+;; Emacs from 22.1. It's really good not to have an initial value for
+;; variables like these that always should be dynamically bound, so it's
+;; worth the inconvenience.
(cc-bytecomp-defvar c-syntactic-context)
(defvar c-syntactic-context)
-;; Variable containing the syntactic analysis list during indentation.
-;; It is a list with one element for each found syntactic symbol. See
-;; `c-syntactic-element' for further info.
-;;
-;; This is always bound dynamically. It should never be set
-;; statically (e.g. with `setq').
+(put 'c-syntactic-context 'variable-documentation
+ "Variable containing the syntactic analysis list for a line of code.
+
+It is a list with one element for each syntactic symbol pertinent to the
+line, for example \"((defun-block-intro 1) (comment-intro))\".
+
+It is dynamically bound when calling \(i) a brace hanging \"action
+function\"; \(ii) a semicolon/comma hanging \"criteria function\"; \(iii) a
+\"line-up function\"; \(iv) a c-special-indent-hook function. It is also
+used internally by CC Mode.
+
+c-syntactic-context is always bound dynamically. It must NEVER be set
+statically (e.g. with `setq').")
+
(cc-bytecomp-defvar c-syntactic-element)
(defvar c-syntactic-element)
-;; Variable containing the info regarding the current syntactic
-;; element during calls to the lineup functions. The value is one of
-;; the elements in the list in `c-syntactic-context' and is a list
-;; with the symbol name in the first position, followed by zero or
-;; more elements containing any additional info associated with the
-;; syntactic symbol. There are accessor functions `c-langelem-sym',
-;; `c-langelem-pos', `c-langelem-col', and `c-langelem-2nd-pos' to
-;; access the list.
-;;
-;; Specifically, the element returned by `c-langelem-pos' is the
-;; relpos (a.k.a. anchor position), or nil if there isn't any. See
-;; the comments in the `c-offsets-alist' variable for more detailed
-;; info about the data each syntactic symbol provides.
-;;
-;; This is always bound dynamically. It should never be set
-;; statically (e.g. with `setq').
+(put 'c-syntactic-element 'variable-documentation
+ "Variable containing the current syntactic element during calls to
+the lineup functions. The value is one of the elements in the list in
+`c-syntactic-context' and is a list with the symbol name in the first
+position, followed by zero or more elements containing any additional
+info associated with the syntactic symbol. There are accessor functions
+`c-langelem-sym', `c-langelem-pos', `c-langelem-col', and
+`c-langelem-2nd-pos' to access the list.
+
+Specifically, the element returned by `c-langelem-pos' is the anchor
+position, or nil if there isn't any. See the comments in the
+`c-offsets-alist' variable and the CC Mode manual for more detailed info
+about the data each syntactic symbol provides.
+
+This is always bound dynamically. It should never be set
+statically (e.g. with `setq').")
(defvar c-indentation-style nil
"Name of the currently installed style.
@@ -1543,6 +1607,29 @@ Don't change this directly; call `c-set-style' instead.")
Set from `c-comment-prefix-regexp' at mode initialization.")
(make-variable-buffer-local 'c-current-comment-prefix)
+;; N.B. The next three variables are initialized in
+;; c-setup-paragraph-variables. Their initializations here are "just in
+;; case". ACM, 2004/2/15. They are NOT buffer local (yet?).
+(defvar c-string-par-start
+;; (concat "\\(" (default-value 'paragraph-start) "\\)\\|[ \t]*\\\\$")
+ "\f\\|[ \t]*\\\\?$"
+ "Value of paragraph-start used when scanning strings.
+It treats escaped EOLs as whitespace.")
+
+(defvar c-string-par-separate
+ ;; (concat "\\(" (default-value 'paragraph-separate) "\\)\\|[ \t]*\\\\$")
+ "[ \t\f]*\\\\?$"
+ "Value of paragraph-separate used when scanning strings.
+It treats escaped EOLs as whitespace.")
+
+(defvar c-sentence-end-with-esc-eol
+ (concat "\\(\\(" (c-default-value-sentence-end) "\\)"
+ ;; N.B.: "$" would be illegal when not enclosed like "\\($\\)".
+ "\\|" "[.?!][]\"')}]* ?\\\\\\($\\)[ \t\n]*"
+ "\\)")
+ "Value used like sentence-end used when scanning strings.
+It treats escaped EOLs as whitespace.")
+
(cc-provide 'cc-vars)