* org.texi: Large scale rewrite and changes, moving from version 4.67
[bpt/emacs.git] / lisp / progmodes / cc-mode.el
CommitLineData
d9e94c22 1;;; cc-mode.el --- major mode for editing C and similar languages
785eecbb 2
92ab3834 3;; Copyright (C) 1985, 1987, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
4e643dd2 4;; 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
d7a0267c 5;; Free Software Foundation, Inc.
785eecbb 6
d9e94c22
MS
7;; Authors: 2003- Alan Mackenzie
8;; 1998- Martin Stjernholm
9;; 1992-1999 Barry A. Warsaw
785eecbb
RS
10;; 1987 Dave Detlefs and Stewart Clamen
11;; 1985 Richard M. Stallman
0ec8351b 12;; Maintainer: bug-cc-mode@gnu.org
785eecbb 13;; Created: a long, long, time ago. adapted from the original c-mode.el
785eecbb
RS
14;; Keywords: c languages oop
15
785eecbb
RS
16;; This file is part of GNU Emacs.
17
18;; GNU Emacs is free software; you can redistribute it and/or modify
19;; it under the terms of the GNU General Public License as published by
1a484753 20;; the Free Software Foundation; either version 3, or (at your option)
785eecbb
RS
21;; any later version.
22
23;; GNU Emacs is distributed in the hope that it will be useful,
24;; but WITHOUT ANY WARRANTY; without even the implied warranty of
25;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
26;; GNU General Public License for more details.
27
28;; You should have received a copy of the GNU General Public License
3efc2cd7
MS
29;; along with this program; see the file COPYING. If not, write to
30;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
31;; Boston, MA 02110-1301, USA.
785eecbb 32
d9e94c22 33;;; Commentary:
130c507e
GM
34
35;; NOTE: Read the commentary below for the right way to submit bug reports!
36;; NOTE: See the accompanying texinfo manual for details on using this mode!
d9e94c22 37;; Note: The version string is in cc-defs.
785eecbb
RS
38
39;; This package provides GNU Emacs major modes for editing C, C++,
d9e94c22
MS
40;; Objective-C, Java, CORBA's IDL, Pike and AWK code. As of the
41;; latest Emacs and XEmacs releases, it is the default package for
42;; editing these languages. This package is called "CC Mode", and
43;; should be spelled exactly this way.
0ec8351b
BW
44
45;; CC Mode supports K&R and ANSI C, ANSI C++, Objective-C, Java,
d9e94c22
MS
46;; CORBA's IDL, Pike and AWK with a consistent indentation model
47;; across all modes. This indentation model is intuitive and very
48;; flexible, so that almost any desired style of indentation can be
49;; supported. Installation, usage, and programming details are
50;; contained in an accompanying texinfo manual.
785eecbb
RS
51
52;; CC Mode's immediate ancestors were, c++-mode.el, cplus-md.el, and
53;; cplus-md1.el..
54
785eecbb 55;; To submit bug reports, type "C-c C-b". These will be sent to
0ec8351b
BW
56;; bug-gnu-emacs@gnu.org (mirrored as the Usenet newsgroup
57;; gnu.emacs.bug) as well as bug-cc-mode@gnu.org, which directly
58;; contacts the CC Mode maintainers. Questions can sent to
59;; help-gnu-emacs@gnu.org (mirrored as gnu.emacs.help) and/or
130c507e
GM
60;; bug-cc-mode@gnu.org. Please do not send bugs or questions to our
61;; personal accounts; we reserve the right to ignore such email!
785eecbb 62
785eecbb
RS
63;; Many, many thanks go out to all the folks on the beta test list.
64;; Without their patience, testing, insight, code contributions, and
65;; encouragement CC Mode would be a far inferior package.
66
67;; You can get the latest version of CC Mode, including PostScript
68;; documentation and separate individual files from:
69;;
91b807c9 70;; http://cc-mode.sourceforge.net/
0ec8351b
BW
71;;
72;; You can join a moderated CC Mode announcement-only mailing list by
73;; visiting
785eecbb 74;;
91b807c9 75;; http://lists.sourceforge.net/mailman/listinfo/cc-mode-announce
785eecbb
RS
76
77;;; Code:
78
51f606de
GM
79(eval-when-compile
80 (let ((load-path
130c507e
GM
81 (if (and (boundp 'byte-compile-dest-file)
82 (stringp byte-compile-dest-file))
83 (cons (file-name-directory byte-compile-dest-file) load-path)
51f606de 84 load-path)))
d9e94c22 85 (load "cc-bytecomp" nil t)))
130c507e
GM
86
87(cc-require 'cc-defs)
d9e94c22 88(cc-require-when-compile 'cc-langs)
130c507e 89(cc-require 'cc-vars)
130c507e 90(cc-require 'cc-engine)
d9e94c22 91(cc-require 'cc-styles)
130c507e
GM
92(cc-require 'cc-cmds)
93(cc-require 'cc-align)
d9e94c22 94(cc-require 'cc-menus)
130c507e 95
3efc2cd7 96;; Silence the compiler.
0386b551 97(cc-bytecomp-defvar adaptive-fill-first-line-regexp) ; Emacs
130c507e 98(cc-bytecomp-defun set-keymap-parents) ; XEmacs
0386b551 99(cc-bytecomp-defun run-mode-hooks) ; Emacs 21.1
3efc2cd7 100(cc-bytecomp-obsolete-fun make-local-hook) ; Marked obsolete in Emacs 21.1.
130c507e 101
d9e94c22
MS
102;; We set these variables during mode init, yet we don't require
103;; font-lock.
104(cc-bytecomp-defvar font-lock-defaults)
105(cc-bytecomp-defvar font-lock-syntactic-keywords)
106
130c507e
GM
107;; Menu support for both XEmacs and Emacs. If you don't have easymenu
108;; with your version of Emacs, you are incompatible!
d9e94c22
MS
109(cc-external-require 'easymenu)
110
0386b551
AM
111;; Autoload directive for emacsen that doesn't have an older CC Mode
112;; version in the dist.
113(autoload 'c-subword-mode "cc-subword"
114 "Mode enabling subword movement and editing keys." t)
115
d9e94c22
MS
116;; Load cc-fonts first after font-lock is loaded, since it isn't
117;; necessary until font locking is requested.
3c0ab532
AM
118; (eval-after-load "font-lock" ; 2006-07-09: font-lock is now preloaded.
119; '
120(require 'cc-fonts) ;)
d9e94c22
MS
121
122;; cc-langs isn't loaded when we're byte compiled, so add autoload
123;; directives for the interface functions.
124(autoload 'c-make-init-lang-vars-fun "cc-langs")
125(autoload 'c-init-language-vars "cc-langs" nil nil 'macro)
785eecbb
RS
126
127\f
1dad6919
RS
128;; Other modes and packages which depend on CC Mode should do the
129;; following to make sure everything is loaded and available for their
130;; use:
131;;
132;; (require 'cc-mode)
a66cd3ee
MS
133;;
134;; And in the major mode function:
135;;
d9e94c22
MS
136;; (c-initialize-cc-mode t)
137;; (c-init-language-vars some-mode)
138;; (c-common-init 'some-mode) ; Or perhaps (c-basic-common-init 'some-mode)
139;;
28d88c16
MS
140;; If you're not writing a derived mode using the language variable
141;; system, then some-mode is one of the language modes directly
142;; supported by CC Mode. You can then use (c-init-language-vars-for
143;; 'some-mode) instead of `c-init-language-vars'.
144;; `c-init-language-vars-for' is a function that avoids the rather
145;; large expansion of `c-init-language-vars'.
146;;
147;; If you use `c-basic-common-init' then you might want to call
148;; `c-font-lock-init' too to set up CC Mode's font lock support.
149;;
d9e94c22
MS
150;; See cc-langs.el for further info. A small example of a derived mode
151;; is also available at <http://cc-mode.sourceforge.net/
152;; derived-mode-ex.el>.
1dad6919 153
a66cd3ee
MS
154(defun c-leave-cc-mode-mode ()
155 (setq c-buffer-is-cc-mode nil))
156
28d88c16
MS
157(defun c-init-language-vars-for (mode)
158 "Initialize the language variables for one of the language modes
159directly supported by CC Mode. This can be used instead of the
160`c-init-language-vars' macro if the language you want to use is one of
161those, rather than a derived language defined through the language
162variable system (see \"cc-langs.el\")."
28d88c16
MS
163 (cond ((eq mode 'c-mode) (c-init-language-vars c-mode))
164 ((eq mode 'c++-mode) (c-init-language-vars c++-mode))
165 ((eq mode 'objc-mode) (c-init-language-vars objc-mode))
166 ((eq mode 'java-mode) (c-init-language-vars java-mode))
167 ((eq mode 'idl-mode) (c-init-language-vars idl-mode))
168 ((eq mode 'pike-mode) (c-init-language-vars pike-mode))
169 ((eq mode 'awk-mode) (c-init-language-vars awk-mode))
170 (t (error "Unsupported mode %s" mode))))
171
aac90c52 172;;;###autoload
d9e94c22
MS
173(defun c-initialize-cc-mode (&optional new-style-init)
174 "Initialize CC Mode for use in the current buffer.
175If the optional NEW-STYLE-INIT is nil or left out then all necessary
176initialization to run CC Mode for the C language is done. Otherwise
28d88c16
MS
177only some basic setup is done, and a call to `c-init-language-vars' or
178`c-init-language-vars-for' is necessary too (which gives more
179control). See \"cc-mode.el\" for more info."
d9e94c22 180
611c76a7 181 (setq c-buffer-is-cc-mode t)
d9e94c22 182
0ec8351b
BW
183 (let ((initprop 'cc-mode-is-initialized)
184 c-initialization-ok)
185 (unless (get 'c-initialize-cc-mode initprop)
0ec8351b
BW
186 (unwind-protect
187 (progn
51f606de
GM
188 (put 'c-initialize-cc-mode initprop t)
189 (c-initialize-builtin-style)
0ec8351b 190 (run-hooks 'c-initialization-hook)
51f606de
GM
191 ;; Fix obsolete variables.
192 (if (boundp 'c-comment-continuation-stars)
193 (setq c-block-comment-prefix c-comment-continuation-stars))
a66cd3ee 194 (add-hook 'change-major-mode-hook 'c-leave-cc-mode-mode)
0ec8351b
BW
195 (setq c-initialization-ok t))
196 ;; Will try initialization hooks again if they failed.
d9e94c22
MS
197 (put 'c-initialize-cc-mode initprop c-initialization-ok))))
198
199 (unless new-style-init
28d88c16 200 (c-init-language-vars-for 'c-mode)))
1dad6919
RS
201
202\f
d9e94c22
MS
203;;; Common routines.
204
130c507e
GM
205(defvar c-mode-base-map ()
206 "Keymap shared by all CC Mode related modes.")
207
208(defun c-make-inherited-keymap ()
209 (let ((map (make-sparse-keymap)))
3efc2cd7
MS
210 ;; Necessary to use `cc-bytecomp-fboundp' below since this
211 ;; function is called from top-level forms that are evaluated
212 ;; while cc-bytecomp is active when one does M-x eval-buffer.
130c507e 213 (cond
d9e94c22 214 ;; XEmacs
3efc2cd7 215 ((cc-bytecomp-fboundp 'set-keymap-parents)
130c507e 216 (set-keymap-parents map c-mode-base-map))
d9e94c22 217 ;; Emacs
3efc2cd7 218 ((cc-bytecomp-fboundp 'set-keymap-parent)
130c507e
GM
219 (set-keymap-parent map c-mode-base-map))
220 ;; incompatible
221 (t (error "CC Mode is incompatible with this version of Emacs")))
222 map))
223
a66cd3ee
MS
224(defun c-define-abbrev-table (name defs)
225 ;; Compatibility wrapper for `define-abbrev' which passes a non-nil
226 ;; sixth argument for SYSTEM-FLAG in emacsen that support it
0386b551 227 ;; (currently only Emacs >= 21.2).
d9e94c22
MS
228 (let ((table (or (symbol-value name)
229 (progn (define-abbrev-table name nil)
230 (symbol-value name)))))
a66cd3ee
MS
231 (while defs
232 (condition-case nil
233 (apply 'define-abbrev table (append (car defs) '(t)))
234 (wrong-number-of-arguments
235 (apply 'define-abbrev table (car defs))))
236 (setq defs (cdr defs)))))
d9e94c22 237(put 'c-define-abbrev-table 'lisp-indent-function 1)
a66cd3ee 238
0386b551
AM
239(defun c-bind-special-erase-keys ()
240 ;; Only used in Emacs to bind C-c C-<delete> and C-c C-<backspace>
241 ;; to the proper keys depending on `normal-erase-is-backspace'.
242 (if normal-erase-is-backspace
243 (progn
244 (define-key c-mode-base-map (kbd "C-c C-<delete>")
245 'c-hungry-delete-forward)
246 (define-key c-mode-base-map (kbd "C-c C-<backspace>")
cb694ab7 247 'c-hungry-delete-backwards))
0386b551 248 (define-key c-mode-base-map (kbd "C-c C-<delete>")
cb694ab7 249 'c-hungry-delete-backwards)
0386b551
AM
250 (define-key c-mode-base-map (kbd "C-c C-<backspace>")
251 'c-hungry-delete-forward)))
252
130c507e
GM
253(if c-mode-base-map
254 nil
0386b551 255
130c507e 256 (setq c-mode-base-map (make-sparse-keymap))
0386b551 257
130c507e
GM
258 ;; Separate M-BS from C-M-h. The former should remain
259 ;; backward-kill-word.
260 (define-key c-mode-base-map [(control meta h)] 'c-mark-function)
261 (define-key c-mode-base-map "\e\C-q" 'c-indent-exp)
262 (substitute-key-definition 'backward-sentence
263 'c-beginning-of-statement
264 c-mode-base-map global-map)
265 (substitute-key-definition 'forward-sentence
266 'c-end-of-statement
267 c-mode-base-map global-map)
268 (substitute-key-definition 'indent-new-comment-line
269 'c-indent-new-comment-line
270 c-mode-base-map global-map)
0386b551
AM
271 (substitute-key-definition 'indent-for-tab-command
272 'c-indent-command
273 c-mode-base-map global-map)
a66cd3ee
MS
274 (when (fboundp 'comment-indent-new-line)
275 ;; indent-new-comment-line has changed name to
276 ;; comment-indent-new-line in Emacs 21.
277 (substitute-key-definition 'comment-indent-new-line
278 'c-indent-new-comment-line
279 c-mode-base-map global-map))
0386b551 280
130c507e 281 ;; RMS says don't make these the default.
51c9af45
AM
282 ;; (April 2006): RMS has now approved these commands as defaults.
283 (define-key c-mode-base-map "\e\C-a" 'c-beginning-of-defun)
284 (define-key c-mode-base-map "\e\C-e" 'c-end-of-defun)
0386b551 285
130c507e
GM
286 (define-key c-mode-base-map "\C-c\C-n" 'c-forward-conditional)
287 (define-key c-mode-base-map "\C-c\C-p" 'c-backward-conditional)
288 (define-key c-mode-base-map "\C-c\C-u" 'c-up-conditional)
d9e94c22
MS
289
290 ;; It doesn't suffice to put `c-fill-paragraph' on
291 ;; `fill-paragraph-function' since `c-fill-paragraph' must be called
292 ;; before any fill prefix adaption is done. E.g. `filladapt-mode'
293 ;; replaces `fill-paragraph' and does the adaption before calling
294 ;; `fill-paragraph-function', and we have to mask comments etc
295 ;; before that. Also, `c-fill-paragraph' chains on to
296 ;; `fill-paragraph' and the value on `fill-parapgraph-function' to
297 ;; do the actual filling work.
130c507e
GM
298 (substitute-key-definition 'fill-paragraph 'c-fill-paragraph
299 c-mode-base-map global-map)
300 ;; In XEmacs the default fill function is called
301 ;; fill-paragraph-or-region.
302 (substitute-key-definition 'fill-paragraph-or-region 'c-fill-paragraph
303 c-mode-base-map global-map)
d9e94c22 304
0386b551
AM
305 ;; We bind the forward deletion key and (implicitly) C-d to
306 ;; `c-electric-delete-forward', and the backward deletion key to
307 ;; `c-electric-backspace'. The hungry variants are bound to the
308 ;; same keys but prefixed with C-c. This implies that C-c C-d is
309 ;; `c-hungry-delete-forward'. For consistency, we bind not only C-c
cb694ab7
AM
310 ;; <backspace> to `c-hungry-delete-backwards' but also
311 ;; C-c C-<backspace>, so that the Ctrl key can be held down during
312 ;; the whole sequence regardless of the direction. This in turn
313 ;; implies that we bind C-c C-<delete> to `c-hungry-delete-forward',
314 ;; for the same reason.
0386b551 315
6d28be1d
EZ
316 ;; Bind the electric deletion functions to C-d and DEL. Emacs 21
317 ;; automatically maps the [delete] and [backspace] keys to these two
318 ;; depending on window system and user preferences. (In earlier
319 ;; versions it's possible to do the same by using `function-key-map'.)
320 (define-key c-mode-base-map "\C-d" 'c-electric-delete-forward)
321 (define-key c-mode-base-map "\177" 'c-electric-backspace)
0386b551 322 (define-key c-mode-base-map "\C-c\C-d" 'c-hungry-delete-forward)
cb694ab7
AM
323 (define-key c-mode-base-map [?\C-c ?\d] 'c-hungry-delete-backwards)
324 (define-key c-mode-base-map [?\C-c ?\C-\d] 'c-hungry-delete-backwards)
0386b551
AM
325 (define-key c-mode-base-map [?\C-c deletechar] 'c-hungry-delete-forward) ; C-c <delete> on a tty.
326 (define-key c-mode-base-map [?\C-c (control deletechar)] ; C-c C-<delete> on a tty.
327 'c-hungry-delete-forward)
328 (when (boundp 'normal-erase-is-backspace)
329 ;; The automatic C-d and DEL mapping functionality doesn't extend
330 ;; to special combinations like C-c C-<delete>, so we have to hook
331 ;; into the `normal-erase-is-backspace' system to bind it directly
332 ;; as appropriate.
333 (add-hook 'normal-erase-is-backspace-hook 'c-bind-special-erase-keys)
334 (c-bind-special-erase-keys))
335
336 (when (fboundp 'delete-forward-p)
337 ;; In XEmacs we fix the forward and backward deletion behavior by
338 ;; binding the keysyms for the [delete] and [backspace] keys
339 ;; directly, and use `delete-forward-p' to decide what [delete]
340 ;; should do. That's done in the XEmacs specific
341 ;; `c-electric-delete' and `c-hungry-delete' functions.
6d28be1d 342 (define-key c-mode-base-map [delete] 'c-electric-delete)
0386b551
AM
343 (define-key c-mode-base-map [backspace] 'c-electric-backspace)
344 (define-key c-mode-base-map (kbd "C-c <delete>") 'c-hungry-delete)
345 (define-key c-mode-base-map (kbd "C-c C-<delete>") 'c-hungry-delete)
cb694ab7
AM
346 (define-key c-mode-base-map (kbd "C-c <backspace>")
347 'c-hungry-delete-backwards)
348 (define-key c-mode-base-map (kbd "C-c C-<backspace>")
349 'c-hungry-delete-backwards))
0386b551
AM
350
351 (define-key c-mode-base-map "#" 'c-electric-pound)
352 (define-key c-mode-base-map "{" 'c-electric-brace)
353 (define-key c-mode-base-map "}" 'c-electric-brace)
130c507e 354 (define-key c-mode-base-map "/" 'c-electric-slash)
0386b551
AM
355 (define-key c-mode-base-map "*" 'c-electric-star)
356 (define-key c-mode-base-map ";" 'c-electric-semi&comma)
357 (define-key c-mode-base-map "," 'c-electric-semi&comma)
358 (define-key c-mode-base-map ":" 'c-electric-colon)
359 (define-key c-mode-base-map "(" 'c-electric-paren)
360 (define-key c-mode-base-map ")" 'c-electric-paren)
361
130c507e 362 (define-key c-mode-base-map "\C-c\C-\\" 'c-backslash-region)
0386b551 363 (define-key c-mode-base-map "\C-c\C-a" 'c-toggle-auto-newline)
130c507e
GM
364 (define-key c-mode-base-map "\C-c\C-b" 'c-submit-bug-report)
365 (define-key c-mode-base-map "\C-c\C-c" 'comment-region)
0386b551 366 (define-key c-mode-base-map "\C-c\C-l" 'c-toggle-electric-state)
130c507e 367 (define-key c-mode-base-map "\C-c\C-o" 'c-set-offset)
0386b551 368 (define-key c-mode-base-map "\C-c\C-q" 'c-indent-defun)
130c507e 369 (define-key c-mode-base-map "\C-c\C-s" 'c-show-syntactic-information)
0386b551 370 ;; (define-key c-mode-base-map "\C-c\C-t" 'c-toggle-auto-hungry-state) Commented out by ACM, 2005-03-05.
130c507e
GM
371 (define-key c-mode-base-map "\C-c." 'c-set-style)
372 ;; conflicts with OOBR
373 ;;(define-key c-mode-base-map "\C-c\C-v" 'c-version)
0386b551
AM
374 ;; (define-key c-mode-base-map "\C-c\C-y" 'c-toggle-hungry-state) Commented out by ACM, 2005-11-22.
375 (define-key c-mode-base-map "\C-c\C-w" 'c-subword-mode)
130c507e
GM
376 )
377
130c507e
GM
378;; We don't require the outline package, but we configure it a bit anyway.
379(cc-bytecomp-defvar outline-level)
380
d9e94c22
MS
381(defun c-mode-menu (modestr)
382 "Return a menu spec suitable for `easy-menu-define' that is exactly
383like the C mode menu except that the menu bar item name is MODESTR
384instead of \"C\".
385
386This function is provided for compatibility only; derived modes should
387preferably use the `c-mode-menu' language constant directly."
388 (cons modestr (c-lang-const c-mode-menu c)))
389
390;; Ugly hack to pull in the definition of `c-populate-syntax-table'
391;; from cc-langs to make it available at runtime. It's either this or
392;; moving the definition for it to cc-defs, but that would mean to
393;; break up the syntax table setup over two files.
394(defalias 'c-populate-syntax-table
395 (cc-eval-when-compile
396 (let ((f (symbol-function 'c-populate-syntax-table)))
397 (if (byte-code-function-p f) f (byte-compile f)))))
398
0386b551
AM
399;; CAUTION: Try to avoid installing things on
400;; `before-change-functions'. The macro `combine-after-change-calls'
401;; is used and it doesn't work if there are things on that hook. That
402;; can cause font lock functions to run in inconvenient places during
403;; temporary changes in some font lock support modes, causing extra
404;; unnecessary work and font lock glitches due to interactions between
405;; various text properties.
9c184ed2
AM
406;;
407;; (2007-02-12): The macro `combine-after-change-calls' ISN'T used any
408;; more.
409
410(defun c-unfind-enclosing-token (pos)
411 ;; If POS is wholly inside a token, remove that id from
412 ;; `c-found-types', should it be present. Return t if we were in an
413 ;; id, else nil.
414 (save-excursion
415 (let ((tok-beg (progn (goto-char pos)
416 (and (c-beginning-of-current-token) (point))))
417 (tok-end (progn (goto-char pos)
418 (and (c-end-of-current-token) (point)))))
419 (when (and tok-beg tok-end)
420 (c-unfind-type (buffer-substring-no-properties tok-beg tok-end))
421 t))))
422
423(defun c-unfind-coalesced-tokens (beg end)
424 ;; unless the non-empty region (beg end) is entirely WS and there's at
425 ;; least one character of WS just before or after this region, remove
426 ;; the tokens which touch the region from `c-found-types' should they
427 ;; be present.
428 (or (c-partial-ws-p beg end)
429 (save-excursion
430 (progn
431 (goto-char beg)
432 (or (eq beg (point-min))
433 (c-skip-ws-backward (1- beg))
434 (/= (point) beg)
435 (= (c-backward-token-2) 1)
436 (c-unfind-type (buffer-substring-no-properties
437 (point) beg)))
438 (goto-char end)
439 (or (eq end (point-max))
440 (c-skip-ws-forward (1+ end))
441 (/= (point) end)
442 (progn (forward-char) (c-end-of-current-token) nil)
443 (c-unfind-type (buffer-substring-no-properties
444 end (point))))))))
445
446;; c-maybe-stale-found-type records a place near the region being
447;; changed where an element of `found-types' might become stale. It
448;; is set in c-before-change and is either nil, or has the form:
449;;
450;; (c-decl-id-start "foo" 97 107 " (* ooka) " "o"), where
451;;
452;; o - `c-decl-id-start' is the c-type text property value at buffer
453;; pos 96.
454;;
455;; o - 97 107 is the region potentially containing the stale type -
456;; this is delimited by a non-nil c-type text property at 96 and
457;; either another one or a ";", "{", or "}" at 107.
458;;
459;; o - " (* ooka) " is the (before change) buffer portion containing
460;; the suspect type (here "ooka").
461;;
462;; o - "o" is the buffer contents which is about to be deleted. This
463;; would be the empty string for an insertion.
464(defvar c-maybe-stale-found-type nil)
465(make-variable-buffer-local 'c-maybe-stale-found-type)
466
d9e94c22
MS
467(defun c-basic-common-init (mode default-style)
468 "Do the necessary initialization for the syntax handling routines
469and the line breaking/filling code. Intended to be used by other
470packages that embed CC Mode.
471
472MODE is the CC Mode flavor to set up, e.g. 'c-mode or 'java-mode.
473DEFAULT-STYLE tells which indentation style to install. It has the
474same format as `c-default-style'.
475
476Note that `c-init-language-vars' must be called before this function.
477This function cannot do that since `c-init-language-vars' is a macro
478that requires a literal mode spec at compile time."
d9e94c22 479
a66cd3ee
MS
480 (setq c-buffer-is-cc-mode mode)
481
130c507e
GM
482 ;; these variables should always be buffer local; they do not affect
483 ;; indentation style.
130c507e
GM
484 (make-local-variable 'parse-sexp-ignore-comments)
485 (make-local-variable 'indent-line-function)
486 (make-local-variable 'indent-region-function)
130c507e
GM
487 (make-local-variable 'normal-auto-fill-function)
488 (make-local-variable 'comment-start)
489 (make-local-variable 'comment-end)
130c507e
GM
490 (make-local-variable 'comment-start-skip)
491 (make-local-variable 'comment-multi-line)
0386b551
AM
492 (make-local-variable 'comment-line-break-function)
493 (make-local-variable 'paragraph-start)
494 (make-local-variable 'paragraph-separate)
495 (make-local-variable 'paragraph-ignore-fill-prefix)
496 (make-local-variable 'adaptive-fill-mode)
497 (make-local-variable 'adaptive-fill-regexp)
a66cd3ee 498
130c507e 499 ;; now set their values
e2c21e66 500 (setq parse-sexp-ignore-comments t
130c507e
GM
501 indent-line-function 'c-indent-line
502 indent-region-function 'c-indent-region
130c507e 503 normal-auto-fill-function 'c-do-auto-fill
0386b551
AM
504 comment-multi-line t
505 comment-line-break-function 'c-indent-new-comment-line)
a66cd3ee 506
fd8771f5
MS
507 ;; Install `c-fill-paragraph' on `fill-paragraph-function' so that a
508 ;; direct call to `fill-paragraph' behaves better. This still
509 ;; doesn't work with filladapt but it's better than nothing.
510 (make-local-variable 'fill-paragraph-function)
511 (setq fill-paragraph-function 'c-fill-paragraph)
512
0386b551 513 (when (or c-recognize-<>-arglists
1d1e4868
AM
514 (c-major-mode-is 'awk-mode)
515 (c-major-mode-is '(c-mode c++-mode objc-mode)))
0386b551
AM
516 ;; We'll use the syntax-table text property to change the syntax
517 ;; of some chars for this language, so do the necessary setup for
518 ;; that.
519 ;;
520 ;; Note to other package developers: It's ok to turn this on in CC
521 ;; Mode buffers when CC Mode doesn't, but it's not ok to turn it
522 ;; off if CC Mode has turned it on.
523
524 ;; Emacs.
525 (when (boundp 'parse-sexp-lookup-properties)
526 (make-local-variable 'parse-sexp-lookup-properties)
527 (setq parse-sexp-lookup-properties t))
528
529 ;; Same as above for XEmacs.
530 (when (boundp 'lookup-syntax-properties)
531 (make-local-variable 'lookup-syntax-properties)
532 (setq lookup-syntax-properties t)))
d9e94c22
MS
533
534 ;; Use this in Emacs 21 to avoid meddling with the rear-nonsticky
535 ;; property on each character.
536 (when (boundp 'text-property-default-nonsticky)
537 (make-local-variable 'text-property-default-nonsticky)
538 (let ((elem (assq 'syntax-table text-property-default-nonsticky)))
539 (if elem
540 (setcdr elem t)
541 (setq text-property-default-nonsticky
542 (cons '(syntax-table . t)
543 text-property-default-nonsticky))))
544 (setq text-property-default-nonsticky
545 (cons '(c-type . t)
546 text-property-default-nonsticky)))
547
548 ;; In Emacs 21 and later it's possible to turn off the ad-hoc
549 ;; heuristic that open parens in column 0 are defun starters. Since
0386b551
AM
550 ;; we have c-state-cache, that heuristic isn't useful and only causes
551 ;; trouble, so turn it off.
99c8496e
AM
552;; 2006/12/17: This facility is somewhat confused, and doesn't really seem
553;; helpful. Comment it out for now.
554;; (when (memq 'col-0-paren c-emacs-features)
555;; (make-local-variable 'open-paren-in-column-0-is-defun-start)
556;; (setq open-paren-in-column-0-is-defun-start nil))
d9e94c22 557
d9e94c22
MS
558 (c-clear-found-types)
559
560 ;; now set the mode style based on default-style
561 (let ((style (if (stringp default-style)
562 default-style
563 (or (cdr (assq mode default-style))
564 (cdr (assq 'other default-style))
130c507e
GM
565 "gnu"))))
566 ;; Override style variables if `c-old-style-variable-behavior' is
567 ;; set. Also override if we are using global style variables,
568 ;; have already initialized a style once, and are switching to a
569 ;; different style. (It's doubtful whether this is desirable, but
570 ;; the whole situation with nonlocal style variables is a bit
571 ;; awkward. It's at least the most compatible way with the old
572 ;; style init procedure.)
573 (c-set-style style (not (or c-old-style-variable-behavior
574 (and (not c-style-variables-are-local-p)
575 c-indentation-style
576 (not (string-equal c-indentation-style
577 style)))))))
a66cd3ee
MS
578 (c-setup-paragraph-variables)
579
130c507e
GM
580 ;; we have to do something special for c-offsets-alist so that the
581 ;; buffer local value has its own alist structure.
582 (setq c-offsets-alist (copy-alist c-offsets-alist))
a66cd3ee 583
130c507e 584 ;; setup the comment indent variable in a Emacs version portable way
130c507e
GM
585 (make-local-variable 'comment-indent-function)
586 (setq comment-indent-function 'c-comment-indent)
a66cd3ee 587
cb694ab7
AM
588;; ;; Put submode indicators onto minor-mode-alist, but only once.
589;; (or (assq 'c-submode-indicators minor-mode-alist)
590;; (setq minor-mode-alist
591;; (cons '(c-submode-indicators c-submode-indicators)
592;; minor-mode-alist)))
593 (c-update-modeline)
a66cd3ee 594
d9e94c22
MS
595 ;; Install the functions that ensure that various internal caches
596 ;; don't become invalid due to buffer changes.
9c184ed2
AM
597 (make-local-hook 'before-change-functions)
598 (add-hook 'before-change-functions 'c-before-change nil t)
0386b551 599 (make-local-hook 'after-change-functions)
afd2c2fc
AM
600 (add-hook 'after-change-functions 'c-after-change nil t)
601 (setq font-lock-extend-after-change-region-function
602 'c-extend-after-change-region)) ; Currently (2008-04), only used by AWK.
d9e94c22 603
d9e94c22
MS
604(defun c-setup-doc-comment-style ()
605 "Initialize the variables that depend on the value of `c-doc-comment-style'."
606 (when (and (featurep 'font-lock)
607 (symbol-value 'font-lock-mode))
608 ;; Force font lock mode to reinitialize itself.
609 (font-lock-mode 0)
610 (font-lock-mode 1)))
611
612(defun c-common-init (&optional mode)
613 "Common initialization for all CC Mode modes.
614In addition to the work done by `c-basic-common-init' and
615`c-font-lock-init', this function sets up various other things as
616customary in CC Mode modes but which aren't strictly necessary for CC
617Mode to operate correctly.
618
619MODE is the symbol for the mode to initialize, like 'c-mode. See
620`c-basic-common-init' for details. It's only optional to be
0386b551 621compatible with old code; callers should always specify it."
d9e94c22
MS
622
623 (unless mode
624 ;; Called from an old third party package. The fallback is to
625 ;; initialize for C.
28d88c16 626 (c-init-language-vars-for 'c-mode))
d9e94c22
MS
627
628 (c-basic-common-init mode c-default-style)
629 (when mode
630 ;; Only initialize font locking if we aren't called from an old package.
631 (c-font-lock-init))
632
1d1e4868
AM
633 ;; Starting a mode is a sort of "change". So call the change functions...
634 (save-restriction
635 (widen)
636 (save-excursion
637 (if c-get-state-before-change-function
638 (funcall c-get-state-before-change-function (point-min) (point-max)))
639 (if c-before-font-lock-function
640 (funcall c-before-font-lock-function (point-min) (point-max)
641 (- (point-max) (point-min))))))
642
d9e94c22
MS
643 (make-local-variable 'outline-regexp)
644 (make-local-variable 'outline-level)
645 (setq outline-regexp "[^#\n\^M]"
646 outline-level 'c-outline-level)
647
648 (let ((rfn (assq mode c-require-final-newline)))
649 (when rfn
650 (make-local-variable 'require-final-newline)
1750e02f
RS
651 (and (cdr rfn)
652 (setq require-final-newline mode-require-final-newline)))))
130c507e 653
cb694ab7
AM
654(defun c-remove-any-local-eval-or-mode-variables ()
655 ;; If the buffer specifies `mode' or `eval' in its File Local Variable list
656 ;; or on the first line, remove all occurrences. See
657 ;; `c-postprocess-file-styles' for justification. There is no need to save
5c4c911a
AM
658 ;; point here, or even bother too much about the buffer contents. However,
659 ;; DON'T mess up the kill-ring.
cb694ab7
AM
660 ;;
661 ;; Most of the code here is derived from Emacs 21.3's `hack-local-variables'
662 ;; in files.el.
663 (goto-char (point-max))
664 (search-backward "\n\^L" (max (- (point-max) 3000) (point-min)) 'move)
665 (let (lv-point (prefix "") (suffix ""))
666 (when (let ((case-fold-search t))
667 (search-forward "Local Variables:" nil t))
668 (setq lv-point (point))
669 ;; The prefix is what comes before "local variables:" in its line.
670 ;; The suffix is what comes after "local variables:" in its line.
671 (skip-chars-forward " \t")
672 (or (eolp)
673 (setq suffix (buffer-substring (point)
674 (progn (end-of-line) (point)))))
675 (goto-char (match-beginning 0))
676 (or (bolp)
677 (setq prefix
678 (buffer-substring (point)
679 (progn (beginning-of-line) (point)))))
680
681 (while (search-forward-regexp
682 (concat "^[ \t]*"
683 (regexp-quote prefix)
684 "\\(mode\\|eval\\):.*"
685 (regexp-quote suffix)
686 "$")
687 nil t)
5c4c911a
AM
688 (forward-line 0)
689 (delete-region (point) (progn (forward-line) (point)))))
cb694ab7
AM
690
691 ;; Delete the first line, if we've got one, in case it contains a mode spec.
692 (unless (and lv-point
693 (progn (goto-char lv-point)
694 (forward-line 0)
695 (bobp)))
696 (goto-char (point-min))
5c4c911a
AM
697 (unless (eobp)
698 (delete-region (point) (progn (forward-line) (point)))))))
cb694ab7 699
130c507e 700(defun c-postprocess-file-styles ()
d9e94c22 701 "Function that post processes relevant file local variables in CC Mode.
130c507e
GM
702Currently, this function simply applies any style and offset settings
703found in the file's Local Variable list. It first applies any style
704setting found in `c-file-style', then it applies any offset settings
705it finds in `c-file-offsets'.
706
707Note that the style variables are always made local to the buffer."
d9e94c22 708
130c507e 709 ;; apply file styles and offsets
09f90d2c
RS
710 (when c-buffer-is-cc-mode
711 (if (or c-file-style c-file-offsets)
712 (c-make-styles-buffer-local t))
713 (and c-file-style
714 (c-set-style c-file-style))
715 (and c-file-offsets
716 (mapcar
717 (lambda (langentry)
718 (let ((langelem (car langentry))
719 (offset (cdr langentry)))
720 (c-set-offset langelem offset)))
0386b551
AM
721 c-file-offsets))
722 ;; Problem: The file local variable block might have explicitly set a
723 ;; style variable. The `c-set-style' or `mapcar' call might have
724 ;; overwritten this. So we run `hack-local-variables' again to remedy
725 ;; this. There are no guarantees this will work properly, particularly as
726 ;; we have no control over what the other hook functions on
cb694ab7
AM
727 ;; `hack-local-variables-hook' would have done. We now (2006/2/1) remove
728 ;; any `eval' or `mode' expressions before we evaluate again (see below).
729 ;; ACM, 2005/11/2.
730 ;;
731 ;; Problem (bug reported by Gustav Broberg): if one of the variables is
732 ;; `mode', this will invoke c-mode (etc.) again, setting up the style etc.
733 ;; We prevent this by temporarily removing `mode' from the Local Variables
734 ;; section.
0386b551 735 (if (or c-file-style c-file-offsets)
51c9af45
AM
736 (let ((hack-local-variables-hook nil) (inhibit-read-only t))
737 (c-tentative-buffer-changes
cb694ab7
AM
738 (c-remove-any-local-eval-or-mode-variables)
739 (hack-local-variables))
740 nil))))
130c507e
GM
741
742(add-hook 'hack-local-variables-hook 'c-postprocess-file-styles)
743
3efc2cd7
MS
744(defmacro c-run-mode-hooks (&rest hooks)
745 ;; Emacs 21.1 has introduced a system with delayed mode hooks that
746 ;; require the use of the new function `run-mode-hooks'.
747 (if (cc-bytecomp-fboundp 'run-mode-hooks)
748 `(run-mode-hooks ,@hooks)
749 `(progn ,@(mapcar (lambda (hook) `(run-hooks ,hook)) hooks))))
750
130c507e 751\f
1d1e4868
AM
752;;; Change hooks, linking with Font Lock.
753
754;; Buffer local variables defining the region to be fontified by a font lock
755;; after-change function. They are set in c-after-change to
756;; after-change-function's BEG and END, and may be modified by a
757;; `c-before-font-lock-function'.
758(defvar c-new-BEG 0)
759(make-variable-buffer-local 'c-new-BEG)
760(defvar c-new-END 0)
761(make-variable-buffer-local 'c-new-END)
762
763;; Buffer local variables recording Beginning/End-of-Macro position before a
764;; change, when a macro straddles, respectively, the BEG or END (or both) of
765;; the change region. Otherwise these have the values BEG/END.
766(defvar c-old-BOM 0)
767(make-variable-buffer-local 'c-old-BOM)
768(defvar c-old-EOM 0)
769(make-variable-buffer-local 'c-old-EOM)
770
771(defun c-extend-region-for-CPP (beg end)
f8016ed6
AM
772 ;; Set c-old-BOM or c-old-EOM respectively to BEG, END, each extended to the
773 ;; beginning/end of any preprocessor construct they may be in.
1d1e4868
AM
774 ;;
775 ;; Point is undefined both before and after this function call; the buffer
776 ;; has already been widened, and match-data saved. The return value is
777 ;; meaningless.
778 ;;
779 ;; This function is the C/C++/ObjC value of
780 ;; `c-get-state-before-change-function' and is called exclusively as a
781 ;; before change function.
782 (goto-char beg)
783 (c-beginning-of-macro)
784 (setq c-old-BOM (point))
785
786 (goto-char end)
f8016ed6
AM
787 (if (c-beginning-of-macro)
788 (c-end-of-macro))
789 (setq c-old-EOM (point)))
1d1e4868
AM
790
791(defun c-neutralize-CPP-line (beg end)
792 ;; BEG and END bound a preprocessor line. Put a "punctuation" syntax-table
793 ;; property on syntactically obtrusive characters, ones which would interact
794 ;; syntactically with stuff outside the CPP line.
795 ;;
796 ;; These are unmatched string delimiters, or unmatched
797 ;; parens/brackets/braces. An unclosed comment is regarded as valid, NOT
798 ;; obtrusive.
799 (let (s)
800 (while
801 (progn
802 (setq s (parse-partial-sexp beg end -1))
803 (cond
804 ((< (nth 0 s) 0) ; found an unmated ),},]
805 (c-put-char-property (1- (point)) 'syntax-table '(1))
806 t)
807 ((nth 3 s) ; In a string
808 (c-put-char-property (nth 8 s) 'syntax-table '(1))
809 t)
810 ((> (nth 0 s) 0) ; In a (,{,[
811 (c-put-char-property (nth 1 s) 'syntax-table '(1))
812 t)
813 (t nil))))))
814
815(defun c-neutralize-syntax-in-CPP (begg endd old-len)
816 ;; "Neutralize" every preprocessor line wholly or partially in the changed
817 ;; region. "Restore" lines which were CPP lines before the change and are
818 ;; no longer so; these can be located from the Buffer local variables
819 ;; c-old-[EB]OM.
820 ;;
821 ;; That is, set syntax-table properties on characters that would otherwise
822 ;; interact syntactically with those outside the CPP line(s).
823 ;;
824 ;; This function is called from an after-change function, BEGG ENDD and
825 ;; OLD-LEN being the standard parameters. It prepares the buffer for font
826 ;; locking, hence must get called before `font-lock-after-change-function'.
827 ;;
828 ;; Point is undefined both before and after this function call, the buffer
829 ;; has been widened, and match-data saved. The return value is ignored.
830 ;;
831 ;; This function is the C/C++/ObjC value of `c-before-font-lock-function'.
832 ;;
833 ;; This function might do invisible changes.
0ce2ec82 834 (c-save-buffer-state (limits mbeg+1 beg end)
1d1e4868
AM
835 ;; First calculate the region, possibly to be extended.
836 (setq beg (min begg c-old-BOM))
837 (goto-char endd)
838 (when (c-beginning-of-macro)
839 (c-end-of-macro))
840 (setq end (max (+ (- c-old-EOM old-len) (- endd begg))
841 (point)))
842 ;; Clear all old punctuation properties
843 (c-clear-char-property-with-value beg end 'syntax-table '(1))
844
845 (goto-char beg)
0ce2ec82
AM
846 (while (and (< (point) end)
847 (search-forward-regexp c-anchored-cpp-prefix end t))
848 ;; If we've found a "#" inside a string/comment, ignore it.
849 (if (setq limits (c-literal-limits))
850 (goto-char (cdr limits))
851 (setq mbeg+1 (point))
1d1e4868 852 (c-end-of-macro) ; Do we need to go forward 1 char here? No!
0ce2ec82 853 (c-neutralize-CPP-line mbeg+1 (point))))))
1d1e4868
AM
854
855(defun c-before-change (beg end)
856 ;; Function to be put on `before-change-function'. Primarily, this calls
857 ;; the language dependent `c-get-state-before-change-function'. It is
858 ;; otherwise used only to remove stale entries from the `c-found-types'
859 ;; cache, and to record entries which a `c-after-change' function might
860 ;; confirm as stale.
861 ;;
862 ;; Note that this function must be FAST rather than accurate. Note
863 ;; also that it only has any effect when font locking is enabled.
864 ;; We exploit this by checking for font-lock-*-face instead of doing
865 ;; rigourous syntactic analysis.
866
867 ;; If either change boundary is wholly inside an identifier, delete
868 ;; it/them from the cache. Don't worry about being inside a string
869 ;; or a comment - "wrongly" removing a symbol from `c-found-types'
870 ;; isn't critical.
871 (setq c-maybe-stale-found-type nil)
872 (save-restriction
873 (save-match-data
874 (widen)
875 (save-excursion
876 ;; Are we inserting/deleting stuff in the middle of an identifier?
877 (c-unfind-enclosing-token beg)
878 (c-unfind-enclosing-token end)
879 ;; Are we coalescing two tokens together, e.g. "fo o" -> "foo"?
880 (when (< beg end)
881 (c-unfind-coalesced-tokens beg end))
882 ;; Are we (potentially) disrupting the syntactic context which
883 ;; makes a type a type? E.g. by inserting stuff after "foo" in
884 ;; "foo bar;", or before "foo" in "typedef foo *bar;"?
885 ;;
886 ;; We search for appropriate c-type properties "near" the change.
887 ;; First, find an appropriate boundary for this property search.
888 (let (lim
889 type type-pos
890 marked-id term-pos
891 (end1
892 (or (and (eq (get-text-property end 'face) 'font-lock-comment-face)
893 (previous-single-property-change end 'face))
894 end)))
895 (when (>= end1 beg) ; Don't hassle about changes entirely in comments.
896 ;; Find a limit for the search for a `c-type' property
897 (while
898 (and (/= (skip-chars-backward "^;{}") 0)
899 (> (point) (point-min))
900 (memq (c-get-char-property (1- (point)) 'face)
901 '(font-lock-comment-face font-lock-string-face))))
902 (setq lim (max (point-min) (1- (point))))
903
904 ;; Look for the latest `c-type' property before end1
905 (when (and (> end1 (point-min))
906 (setq type-pos
907 (if (get-text-property (1- end1) 'c-type)
908 end1
909 (previous-single-property-change end1 'c-type nil lim))))
910 (setq type (get-text-property (max (1- type-pos) lim) 'c-type))
911
912 (when (memq type '(c-decl-id-start c-decl-type-start))
913 ;; Get the identifier, if any, that the property is on.
914 (goto-char (1- type-pos))
915 (setq marked-id
916 (when (looking-at "\\(\\sw\\|\\s_\\)")
917 (c-beginning-of-current-token)
918 (buffer-substring-no-properties (point) type-pos)))
919
920 (goto-char end1)
921 (skip-chars-forward "^;{}") ; FIXME!!! loop for comment, maybe
922 (setq lim (point))
923 (setq term-pos
924 (or (next-single-property-change end 'c-type nil lim) lim))
925 (setq c-maybe-stale-found-type
926 (list type marked-id
927 type-pos term-pos
928 (buffer-substring-no-properties type-pos term-pos)
929 (buffer-substring-no-properties beg end)))))))
930
931 (setq c-new-BEG beg
932 c-new-END end)
933 (if c-get-state-before-change-function
934 (funcall c-get-state-before-change-function beg end))
935 ))))
936
937(defun c-after-change (beg end old-len)
938 ;; Function put on `after-change-functions' to adjust various caches
939 ;; etc. Prefer speed to finesse here, since there will be an order
940 ;; of magnitude more calls to this function than any of the
941 ;; functions that use the caches.
942 ;;
943 ;; Note that care must be taken so that this is called before any
944 ;; font-lock callbacks since we might get calls to functions using
945 ;; these caches from inside them, and we must thus be sure that this
946 ;; has already been executed.
947 ;;
948 ;; This calls the language variable c-before-font-lock-function, if non nil.
949 ;; This typically sets `syntax-table' properties.
950
951 (c-save-buffer-state ()
952 ;; When `combine-after-change-calls' is used we might get calls
953 ;; with regions outside the current narrowing. This has been
954 ;; observed in Emacs 20.7.
955 (save-restriction
956 (save-match-data ; c-recognize-<>-arglists changes match-data
957 (widen)
958
959 (when (> end (point-max))
960 ;; Some emacsen might return positions past the end. This has been
961 ;; observed in Emacs 20.7 when rereading a buffer changed on disk
962 ;; (haven't been able to minimize it, but Emacs 21.3 appears to
963 ;; work).
964 (setq end (point-max))
965 (when (> beg end)
966 (setq beg end)))
967
968 (c-trim-found-types beg end old-len) ; maybe we don't need all of these.
969 (c-invalidate-sws-region-after beg end)
970 (c-invalidate-state-cache beg)
971 (c-invalidate-find-decl-cache beg)
972
973 (when c-recognize-<>-arglists
974 (c-after-change-check-<>-operators beg end))
975
976 (if c-before-font-lock-function
977 (save-excursion
978 (funcall c-before-font-lock-function beg end old-len)))))))
979
980(defun c-after-font-lock-init ()
981 ;; Put on `font-lock-mode-hook'.
982 (remove-hook 'after-change-functions 'c-after-change t)
983 (add-hook 'after-change-functions 'c-after-change nil t))
984
985(defun c-font-lock-init ()
986 "Set up the font-lock variables for using the font-lock support in CC Mode.
987This does not load the font-lock package. Use after
988`c-basic-common-init' and after cc-fonts has been loaded."
989
990 (make-local-variable 'font-lock-defaults)
991 (setq font-lock-defaults
992 `(,(if (c-major-mode-is 'awk-mode)
993 ;; awk-mode currently has only one font lock level.
994 'awk-font-lock-keywords
995 (mapcar 'c-mode-symbol
996 '("font-lock-keywords" "font-lock-keywords-1"
997 "font-lock-keywords-2" "font-lock-keywords-3")))
998 nil nil
999 ,c-identifier-syntax-modifications
1000 c-beginning-of-syntax
1001 (font-lock-lines-before . 1)
1002 (font-lock-mark-block-function
1003 . c-mark-function)))
1004
1005 (make-local-hook 'font-lock-mode-hook)
1006 (add-hook 'font-lock-mode-hook 'c-after-font-lock-init nil t))
1007
afd2c2fc
AM
1008(defun c-extend-after-change-region (beg end old-len)
1009 "Extend the region to be fontified, if necessary."
1010 ;; Note: the parameters are ignored here. This somewhat indirect
1011 ;; implementation exists because it is minimally different from the
1012 ;; stand-alone CC Mode which, lacking
1013 ;; font-lock-extend-after-change-region-function, is forced to use advice
1014 ;; instead.
1015 ;;
1016 ;; Of the seven CC Mode languages, currently (2008-04) only AWK Mode makes
1017 ;; non-null use of this function.
1018 (cons c-new-BEG c-new-END))
1d1e4868
AM
1019
1020\f
130c507e
GM
1021;; Support for C
1022
d9e94c22
MS
1023;;;###autoload
1024(defvar c-mode-syntax-table nil
1025 "Syntax table used in c-mode buffers.")
1026(or c-mode-syntax-table
1027 (setq c-mode-syntax-table
1028 (funcall (c-lang-const c-make-mode-syntax-table c))))
1029
130c507e
GM
1030(defvar c-mode-abbrev-table nil
1031 "Abbreviation table used in c-mode buffers.")
a66cd3ee
MS
1032(c-define-abbrev-table 'c-mode-abbrev-table
1033 '(("else" "else" c-electric-continued-statement 0)
1034 ("while" "while" c-electric-continued-statement 0)))
130c507e
GM
1035
1036(defvar c-mode-map ()
1037 "Keymap used in c-mode buffers.")
1038(if c-mode-map
1039 nil
1040 (setq c-mode-map (c-make-inherited-keymap))
1041 ;; add bindings which are only useful for C
1042 (define-key c-mode-map "\C-c\C-e" 'c-macro-expand)
1043 )
1044
1045(easy-menu-define c-c-menu c-mode-map "C Mode Commands"
d9e94c22
MS
1046 (cons "C" (c-lang-const c-mode-menu c)))
1047
1048;; In XEmacs >= 21.5 modes should add their own entries to
1049;; `auto-mode-alist'. The comment form of autoload is used to avoid
1050;; doing this on load. That since `add-to-list' prepends the value
1051;; which could cause it to clobber user settings. Later emacsen have
1052;; an append option, but it's not safe to use.
50fdde0e
MS
1053
1054;; The the extension ".C" is associated to C++ while the lowercase
1055;; variant goes to C. On case insensitive file systems, this means
1056;; that ".c" files also might open C++ mode if the C++ entry comes
1057;; first on `auto-mode-alist'. Thus we try to ensure that ".C" comes
1058;; after ".c", and since `add-to-list' adds the entry first we have to
1059;; add the ".C" entry first.
1060;;;###autoload (add-to-list 'auto-mode-alist '("\\.\\(cc\\|hh\\)\\'" . c++-mode))
1061;;;###autoload (add-to-list 'auto-mode-alist '("\\.[ch]\\(pp\\|xx\\|\\+\\+\\)\\'" . c++-mode))
1062;;;###autoload (add-to-list 'auto-mode-alist '("\\.\\(CC?\\|HH?\\)\\'" . c++-mode))
1063
d9e94c22
MS
1064;;;###autoload (add-to-list 'auto-mode-alist '("\\.[ch]\\'" . c-mode))
1065
1066;; NB: The following two associate yacc and lex files to C Mode, which
1067;; is not really suitable for those formats. Anyway, afaik there's
1068;; currently no better mode for them, and besides this is legacy.
1069;;;###autoload (add-to-list 'auto-mode-alist '("\\.y\\(acc\\)?\\'" . c-mode))
1070;;;###autoload (add-to-list 'auto-mode-alist '("\\.lex\\'" . c-mode))
1071
785eecbb
RS
1072;;;###autoload
1073(defun c-mode ()
1074 "Major mode for editing K&R and ANSI C code.
1075To submit a problem report, enter `\\[c-submit-bug-report]' from a
1076c-mode buffer. This automatically sets up a mail buffer with version
1077information already added. You just need to add a description of the
50fdde0e 1078problem, including a reproducible test case, and send the message.
785eecbb
RS
1079
1080To see what version of CC Mode you are running, enter `\\[c-version]'.
1081
d9e94c22
MS
1082The hook `c-mode-common-hook' is run with no args at mode
1083initialization, then `c-mode-hook'.
785eecbb
RS
1084
1085Key bindings:
1086\\{c-mode-map}"
1087 (interactive)
785eecbb 1088 (kill-all-local-variables)
d9e94c22 1089 (c-initialize-cc-mode t)
785eecbb
RS
1090 (set-syntax-table c-mode-syntax-table)
1091 (setq major-mode 'c-mode
1092 mode-name "C"
130c507e
GM
1093 local-abbrev-table c-mode-abbrev-table
1094 abbrev-mode t)
785eecbb 1095 (use-local-map c-mode-map)
28d88c16 1096 (c-init-language-vars-for 'c-mode)
a66cd3ee 1097 (c-common-init 'c-mode)
d9e94c22 1098 (easy-menu-add c-c-menu)
51f606de 1099 (cc-imenu-init cc-imenu-c-generic-expression)
3efc2cd7 1100 (c-run-mode-hooks 'c-mode-common-hook 'c-mode-hook)
785eecbb
RS
1101 (c-update-modeline))
1102
1103\f
130c507e
GM
1104;; Support for C++
1105
d9e94c22
MS
1106;;;###autoload
1107(defvar c++-mode-syntax-table nil
1108 "Syntax table used in c++-mode buffers.")
1109(or c++-mode-syntax-table
1110 (setq c++-mode-syntax-table
1111 (funcall (c-lang-const c-make-mode-syntax-table c++))))
1112
130c507e
GM
1113(defvar c++-mode-abbrev-table nil
1114 "Abbreviation table used in c++-mode buffers.")
a66cd3ee
MS
1115(c-define-abbrev-table 'c++-mode-abbrev-table
1116 '(("else" "else" c-electric-continued-statement 0)
1117 ("while" "while" c-electric-continued-statement 0)
1118 ("catch" "catch" c-electric-continued-statement 0)))
130c507e
GM
1119
1120(defvar c++-mode-map ()
1121 "Keymap used in c++-mode buffers.")
1122(if c++-mode-map
1123 nil
1124 (setq c++-mode-map (c-make-inherited-keymap))
1125 ;; add bindings which are only useful for C++
1126 (define-key c++-mode-map "\C-c\C-e" 'c-macro-expand)
1127 (define-key c++-mode-map "\C-c:" 'c-scope-operator)
1128 (define-key c++-mode-map "<" 'c-electric-lt-gt)
1129 (define-key c++-mode-map ">" 'c-electric-lt-gt))
1130
1131(easy-menu-define c-c++-menu c++-mode-map "C++ Mode Commands"
d9e94c22
MS
1132 (cons "C++" (c-lang-const c-mode-menu c++)))
1133
785eecbb
RS
1134;;;###autoload
1135(defun c++-mode ()
1136 "Major mode for editing C++ code.
1137To submit a problem report, enter `\\[c-submit-bug-report]' from a
1138c++-mode buffer. This automatically sets up a mail buffer with
1139version information already added. You just need to add a description
1140of the problem, including a reproducible test case, and send the
1141message.
1142
1143To see what version of CC Mode you are running, enter `\\[c-version]'.
1144
d9e94c22
MS
1145The hook `c-mode-common-hook' is run with no args at mode
1146initialization, then `c++-mode-hook'.
785eecbb
RS
1147
1148Key bindings:
1149\\{c++-mode-map}"
1150 (interactive)
785eecbb 1151 (kill-all-local-variables)
d9e94c22 1152 (c-initialize-cc-mode t)
785eecbb
RS
1153 (set-syntax-table c++-mode-syntax-table)
1154 (setq major-mode 'c++-mode
1155 mode-name "C++"
130c507e
GM
1156 local-abbrev-table c++-mode-abbrev-table
1157 abbrev-mode t)
785eecbb 1158 (use-local-map c++-mode-map)
28d88c16 1159 (c-init-language-vars-for 'c++-mode)
a66cd3ee 1160 (c-common-init 'c++-mode)
d9e94c22 1161 (easy-menu-add c-c++-menu)
51f606de 1162 (cc-imenu-init cc-imenu-c++-generic-expression)
3efc2cd7 1163 (c-run-mode-hooks 'c-mode-common-hook 'c++-mode-hook)
785eecbb
RS
1164 (c-update-modeline))
1165
1166\f
130c507e
GM
1167;; Support for Objective-C
1168
d9e94c22
MS
1169;;;###autoload
1170(defvar objc-mode-syntax-table nil
1171 "Syntax table used in objc-mode buffers.")
1172(or objc-mode-syntax-table
1173 (setq objc-mode-syntax-table
1174 (funcall (c-lang-const c-make-mode-syntax-table objc))))
1175
130c507e
GM
1176(defvar objc-mode-abbrev-table nil
1177 "Abbreviation table used in objc-mode buffers.")
a66cd3ee
MS
1178(c-define-abbrev-table 'objc-mode-abbrev-table
1179 '(("else" "else" c-electric-continued-statement 0)
1180 ("while" "while" c-electric-continued-statement 0)))
130c507e
GM
1181
1182(defvar objc-mode-map ()
1183 "Keymap used in objc-mode buffers.")
1184(if objc-mode-map
1185 nil
1186 (setq objc-mode-map (c-make-inherited-keymap))
1187 ;; add bindings which are only useful for Objective-C
1188 (define-key objc-mode-map "\C-c\C-e" 'c-macro-expand))
1189
1190(easy-menu-define c-objc-menu objc-mode-map "ObjC Mode Commands"
d9e94c22
MS
1191 (cons "ObjC" (c-lang-const c-mode-menu objc)))
1192
1193;;;###autoload (add-to-list 'auto-mode-alist '("\\.m\\'" . objc-mode))
130c507e 1194
785eecbb
RS
1195;;;###autoload
1196(defun objc-mode ()
1197 "Major mode for editing Objective C code.
1198To submit a problem report, enter `\\[c-submit-bug-report]' from an
1199objc-mode buffer. This automatically sets up a mail buffer with
1200version information already added. You just need to add a description
1201of the problem, including a reproducible test case, and send the
1202message.
1203
1204To see what version of CC Mode you are running, enter `\\[c-version]'.
1205
d9e94c22
MS
1206The hook `c-mode-common-hook' is run with no args at mode
1207initialization, then `objc-mode-hook'.
785eecbb
RS
1208
1209Key bindings:
1210\\{objc-mode-map}"
1211 (interactive)
785eecbb 1212 (kill-all-local-variables)
d9e94c22 1213 (c-initialize-cc-mode t)
785eecbb
RS
1214 (set-syntax-table objc-mode-syntax-table)
1215 (setq major-mode 'objc-mode
1216 mode-name "ObjC"
130c507e
GM
1217 local-abbrev-table objc-mode-abbrev-table
1218 abbrev-mode t)
785eecbb 1219 (use-local-map objc-mode-map)
28d88c16 1220 (c-init-language-vars-for 'objc-mode)
a66cd3ee 1221 (c-common-init 'objc-mode)
d9e94c22
MS
1222 (easy-menu-add c-objc-menu)
1223 (cc-imenu-init nil 'cc-imenu-objc-function)
3efc2cd7 1224 (c-run-mode-hooks 'c-mode-common-hook 'objc-mode-hook)
785eecbb
RS
1225 (c-update-modeline))
1226
1227\f
130c507e
GM
1228;; Support for Java
1229
d9e94c22
MS
1230;;;###autoload
1231(defvar java-mode-syntax-table nil
1232 "Syntax table used in java-mode buffers.")
1233(or java-mode-syntax-table
1234 (setq java-mode-syntax-table
1235 (funcall (c-lang-const c-make-mode-syntax-table java))))
1236
130c507e
GM
1237(defvar java-mode-abbrev-table nil
1238 "Abbreviation table used in java-mode buffers.")
a66cd3ee
MS
1239(c-define-abbrev-table 'java-mode-abbrev-table
1240 '(("else" "else" c-electric-continued-statement 0)
1241 ("while" "while" c-electric-continued-statement 0)
1242 ("catch" "catch" c-electric-continued-statement 0)
1243 ("finally" "finally" c-electric-continued-statement 0)))
130c507e
GM
1244
1245(defvar java-mode-map ()
1246 "Keymap used in java-mode buffers.")
1247(if java-mode-map
1248 nil
1249 (setq java-mode-map (c-make-inherited-keymap))
1250 ;; add bindings which are only useful for Java
1251 )
1252
d9e94c22
MS
1253;; Regexp trying to describe the beginning of a Java top-level
1254;; definition. This is not used by CC Mode, nor is it maintained
1255;; since it's practically impossible to write a regexp that reliably
1256;; matches such a construct. Other tools are necessary.
1257(defconst c-Java-defun-prompt-regexp
1258 "^[ \t]*\\(\\(\\(public\\|protected\\|private\\|const\\|abstract\\|synchronized\\|final\\|static\\|threadsafe\\|transient\\|native\\|volatile\\)\\s-+\\)*\\(\\(\\([[a-zA-Z][][_$.a-zA-Z0-9]*[][_$.a-zA-Z0-9]+\\|[[a-zA-Z]\\)\\s-*\\)\\s-+\\)\\)?\\(\\([[a-zA-Z][][_$.a-zA-Z0-9]*\\s-+\\)\\s-*\\)?\\([_a-zA-Z][^][ \t:;.,{}()\7f=]*\\|\\([_$a-zA-Z][_$.a-zA-Z0-9]*\\)\\)\\s-*\\(([^);{}]*)\\)?\\([] \t]*\\)\\(\\s-*\\<throws\\>\\s-*\\(\\([_$a-zA-Z][_$.a-zA-Z0-9]*\\)[, \t\n\r\f\v]*\\)+\\)?\\s-*")
1259
130c507e 1260(easy-menu-define c-java-menu java-mode-map "Java Mode Commands"
d9e94c22
MS
1261 (cons "Java" (c-lang-const c-mode-menu java)))
1262
1263;;;###autoload (add-to-list 'auto-mode-alist '("\\.java\\'" . java-mode))
130c507e 1264
785eecbb
RS
1265;;;###autoload
1266(defun java-mode ()
1267 "Major mode for editing Java code.
dc2b4c5f 1268To submit a problem report, enter `\\[c-submit-bug-report]' from a
785eecbb
RS
1269java-mode buffer. This automatically sets up a mail buffer with
1270version information already added. You just need to add a description
50fdde0e 1271of the problem, including a reproducible test case, and send the
785eecbb
RS
1272message.
1273
1274To see what version of CC Mode you are running, enter `\\[c-version]'.
1275
d9e94c22
MS
1276The hook `c-mode-common-hook' is run with no args at mode
1277initialization, then `java-mode-hook'.
785eecbb
RS
1278
1279Key bindings:
1280\\{java-mode-map}"
1281 (interactive)
785eecbb 1282 (kill-all-local-variables)
d9e94c22 1283 (c-initialize-cc-mode t)
785eecbb
RS
1284 (set-syntax-table java-mode-syntax-table)
1285 (setq major-mode 'java-mode
1286 mode-name "Java"
91b807c9 1287 local-abbrev-table java-mode-abbrev-table
a66cd3ee 1288 abbrev-mode t)
785eecbb 1289 (use-local-map java-mode-map)
28d88c16 1290 (c-init-language-vars-for 'java-mode)
a66cd3ee 1291 (c-common-init 'java-mode)
d9e94c22 1292 (easy-menu-add c-java-menu)
51f606de 1293 (cc-imenu-init cc-imenu-java-generic-expression)
3efc2cd7 1294 (c-run-mode-hooks 'c-mode-common-hook 'java-mode-hook)
785eecbb
RS
1295 (c-update-modeline))
1296
1297\f
130c507e
GM
1298;; Support for CORBA's IDL language
1299
d9e94c22
MS
1300;;;###autoload
1301(defvar idl-mode-syntax-table nil
1302 "Syntax table used in idl-mode buffers.")
1303(or idl-mode-syntax-table
1304 (setq idl-mode-syntax-table
1305 (funcall (c-lang-const c-make-mode-syntax-table idl))))
1306
130c507e
GM
1307(defvar idl-mode-abbrev-table nil
1308 "Abbreviation table used in idl-mode buffers.")
a66cd3ee 1309(c-define-abbrev-table 'idl-mode-abbrev-table nil)
130c507e
GM
1310
1311(defvar idl-mode-map ()
1312 "Keymap used in idl-mode buffers.")
1313(if idl-mode-map
1314 nil
1315 (setq idl-mode-map (c-make-inherited-keymap))
1316 ;; add bindings which are only useful for IDL
1317 )
1318
1319(easy-menu-define c-idl-menu idl-mode-map "IDL Mode Commands"
d9e94c22
MS
1320 (cons "IDL" (c-lang-const c-mode-menu idl)))
1321
1322;;;###autoload (add-to-list 'auto-mode-alist '("\\.idl\\'" . idl-mode))
130c507e 1323
aac90c52
RS
1324;;;###autoload
1325(defun idl-mode ()
d9e94c22 1326 "Major mode for editing CORBA's IDL, PSDL and CIDL code.
aac90c52
RS
1327To submit a problem report, enter `\\[c-submit-bug-report]' from an
1328idl-mode buffer. This automatically sets up a mail buffer with
1329version information already added. You just need to add a description
1330of the problem, including a reproducible test case, and send the
1331message.
1332
1333To see what version of CC Mode you are running, enter `\\[c-version]'.
1334
d9e94c22
MS
1335The hook `c-mode-common-hook' is run with no args at mode
1336initialization, then `idl-mode-hook'.
aac90c52
RS
1337
1338Key bindings:
1339\\{idl-mode-map}"
1340 (interactive)
aac90c52 1341 (kill-all-local-variables)
d9e94c22 1342 (c-initialize-cc-mode t)
aac90c52
RS
1343 (set-syntax-table idl-mode-syntax-table)
1344 (setq major-mode 'idl-mode
1345 mode-name "IDL"
1346 local-abbrev-table idl-mode-abbrev-table)
1347 (use-local-map idl-mode-map)
28d88c16 1348 (c-init-language-vars-for 'idl-mode)
a66cd3ee 1349 (c-common-init 'idl-mode)
d9e94c22
MS
1350 (easy-menu-add c-idl-menu)
1351 ;;(cc-imenu-init cc-imenu-idl-generic-expression) ;TODO
3efc2cd7 1352 (c-run-mode-hooks 'c-mode-common-hook 'idl-mode-hook)
aac90c52
RS
1353 (c-update-modeline))
1354
1355\f
130c507e
GM
1356;; Support for Pike
1357
d9e94c22
MS
1358;;;###autoload
1359(defvar pike-mode-syntax-table nil
1360 "Syntax table used in pike-mode buffers.")
1361(or pike-mode-syntax-table
1362 (setq pike-mode-syntax-table
1363 (funcall (c-lang-const c-make-mode-syntax-table pike))))
1364
130c507e
GM
1365(defvar pike-mode-abbrev-table nil
1366 "Abbreviation table used in pike-mode buffers.")
a66cd3ee
MS
1367(c-define-abbrev-table 'pike-mode-abbrev-table
1368 '(("else" "else" c-electric-continued-statement 0)
1369 ("while" "while" c-electric-continued-statement 0)))
130c507e
GM
1370
1371(defvar pike-mode-map ()
1372 "Keymap used in pike-mode buffers.")
1373(if pike-mode-map
1374 nil
1375 (setq pike-mode-map (c-make-inherited-keymap))
1376 ;; additional bindings
1377 (define-key pike-mode-map "\C-c\C-e" 'c-macro-expand))
1378
1379(easy-menu-define c-pike-menu pike-mode-map "Pike Mode Commands"
d9e94c22
MS
1380 (cons "Pike" (c-lang-const c-mode-menu pike)))
1381
50fdde0e
MS
1382;;;###autoload (add-to-list 'auto-mode-alist '("\\.\\(u?lpc\\|pike\\|pmod\\(.in\\)?\\)\\'" . pike-mode))
1383;;;###autoload (add-to-list 'interpreter-mode-alist '("pike" . pike-mode))
130c507e 1384
0ec8351b
BW
1385;;;###autoload
1386(defun pike-mode ()
1387 "Major mode for editing Pike code.
a66cd3ee
MS
1388To submit a problem report, enter `\\[c-submit-bug-report]' from a
1389pike-mode buffer. This automatically sets up a mail buffer with
0ec8351b
BW
1390version information already added. You just need to add a description
1391of the problem, including a reproducible test case, and send the
1392message.
1393
1394To see what version of CC Mode you are running, enter `\\[c-version]'.
1395
d9e94c22
MS
1396The hook `c-mode-common-hook' is run with no args at mode
1397initialization, then `pike-mode-hook'.
0ec8351b
BW
1398
1399Key bindings:
1400\\{pike-mode-map}"
1401 (interactive)
0ec8351b 1402 (kill-all-local-variables)
d9e94c22 1403 (c-initialize-cc-mode t)
0ec8351b
BW
1404 (set-syntax-table pike-mode-syntax-table)
1405 (setq major-mode 'pike-mode
1406 mode-name "Pike"
130c507e 1407 local-abbrev-table pike-mode-abbrev-table
a66cd3ee 1408 abbrev-mode t)
0ec8351b 1409 (use-local-map pike-mode-map)
28d88c16 1410 (c-init-language-vars-for 'pike-mode)
a66cd3ee 1411 (c-common-init 'pike-mode)
d9e94c22
MS
1412 (easy-menu-add c-pike-menu)
1413 ;;(cc-imenu-init cc-imenu-pike-generic-expression) ;TODO
3efc2cd7 1414 (c-run-mode-hooks 'c-mode-common-hook 'pike-mode-hook)
0ec8351b
BW
1415 (c-update-modeline))
1416
1417\f
0386b551 1418;; Support for AWK
d9e94c22 1419
50fdde0e
MS
1420;;;###autoload (add-to-list 'auto-mode-alist '("\\.awk\\'" . awk-mode))
1421;;;###autoload (add-to-list 'interpreter-mode-alist '("awk" . awk-mode))
1422;;;###autoload (add-to-list 'interpreter-mode-alist '("mawk" . awk-mode))
1423;;;###autoload (add-to-list 'interpreter-mode-alist '("nawk" . awk-mode))
1424;;;###autoload (add-to-list 'interpreter-mode-alist '("gawk" . awk-mode))
d9e94c22 1425
50fdde0e
MS
1426;;; Autoload directives must be on the top level, so we construct an
1427;;; autoload form instead.
791887d9 1428;;;###autoload (autoload 'awk-mode "cc-mode" "Major mode for editing AWK code." t)
50fdde0e 1429
0386b551
AM
1430(defvar awk-mode-abbrev-table nil
1431 "Abbreviation table used in awk-mode buffers.")
1432(c-define-abbrev-table 'awk-mode-abbrev-table
1433 '(("else" "else" c-electric-continued-statement 0)
1434 ("while" "while" c-electric-continued-statement 0)))
1435
1436(defvar awk-mode-map ()
1437 "Keymap used in awk-mode buffers.")
1438(if awk-mode-map
1439 nil
1440 (setq awk-mode-map (c-make-inherited-keymap))
1441 ;; add bindings which are only useful for awk.
1442 (define-key awk-mode-map "#" 'self-insert-command)
1443 (define-key awk-mode-map "/" 'self-insert-command)
1444 (define-key awk-mode-map "*" 'self-insert-command)
1445 (define-key awk-mode-map "\C-c\C-n" 'undefined) ; #if doesn't exist in awk.
1446 (define-key awk-mode-map "\C-c\C-p" 'undefined)
1447 (define-key awk-mode-map "\C-c\C-u" 'undefined)
1448 (define-key awk-mode-map "\M-a" 'c-beginning-of-statement) ; 2003/10/7
1449 (define-key awk-mode-map "\M-e" 'c-end-of-statement) ; 2003/10/7
1450 (define-key awk-mode-map "\C-\M-a" 'c-awk-beginning-of-defun)
1451 (define-key awk-mode-map "\C-\M-e" 'c-awk-end-of-defun))
1452
1453(easy-menu-define c-awk-menu awk-mode-map "AWK Mode Commands"
1454 (cons "AWK" (c-lang-const c-mode-menu awk)))
1455
1456(defun awk-mode ()
1457 "Major mode for editing AWK code.
d9e94c22
MS
1458To submit a problem report, enter `\\[c-submit-bug-report]' from an
1459awk-mode buffer. This automatically sets up a mail buffer with version
1460information already added. You just need to add a description of the
50fdde0e 1461problem, including a reproducible test case, and send the message.
d9e94c22
MS
1462
1463To see what version of CC Mode you are running, enter `\\[c-version]'.
1464
1465The hook `c-mode-common-hook' is run with no args at mode
1466initialization, then `awk-mode-hook'.
1467
1468Key bindings:
1469\\{awk-mode-map}"
0386b551
AM
1470 (interactive)
1471 (require 'cc-awk) ; Added 2003/6/10.
1472 (kill-all-local-variables)
1473 (c-initialize-cc-mode t)
1474 (set-syntax-table awk-mode-syntax-table)
1475 (setq major-mode 'awk-mode
1476 mode-name "AWK"
1477 local-abbrev-table awk-mode-abbrev-table
1478 abbrev-mode t)
1479 (use-local-map awk-mode-map)
1480 (c-init-language-vars-for 'awk-mode)
1481 (c-common-init 'awk-mode)
0386b551 1482 (c-awk-unstick-NL-prop)
0386b551
AM
1483
1484 ;; Prevent Xemacs's buffer-syntactic-context being used. See the comment
1485 ;; in cc-engine.el, just before (defun c-fast-in-literal ...
1486 (defalias 'c-in-literal 'c-slow-in-literal)
1487
1488 (c-run-mode-hooks 'c-mode-common-hook 'awk-mode-hook)
1489 (c-update-modeline))
d9e94c22
MS
1490
1491\f
c2efc1d0 1492;; bug reporting
785eecbb
RS
1493
1494(defconst c-mode-help-address
a66cd3ee
MS
1495 "bug-cc-mode@gnu.org"
1496 "Address(es) for CC Mode bug reports.")
785eecbb
RS
1497
1498(defun c-version ()
1499 "Echo the current version of CC Mode in the minibuffer."
1500 (interactive)
1501 (message "Using CC Mode version %s" c-version)
1502 (c-keep-region-active))
1503
130c507e
GM
1504(defvar c-prepare-bug-report-hooks nil)
1505
1506;; Dynamic variables used by reporter.
1507(defvar reporter-prompt-for-summary-p)
1508(defvar reporter-dont-compact-list)
1509
785eecbb
RS
1510(defun c-submit-bug-report ()
1511 "Submit via mail a bug report on CC Mode."
1512 (interactive)
77e31a8d 1513 (require 'reporter)
785eecbb
RS
1514 ;; load in reporter
1515 (let ((reporter-prompt-for-summary-p t)
1516 (reporter-dont-compact-list '(c-offsets-alist))
1517 (style c-indentation-style)
785eecbb
RS
1518 (c-features c-emacs-features))
1519 (and
1520 (if (y-or-n-p "Do you want to submit a report on CC Mode? ")
1521 t (message "") nil)
785eecbb
RS
1522 (reporter-submit-bug-report
1523 c-mode-help-address
d9e94c22 1524 (concat "CC Mode " c-version " (" mode-name ")")
51f606de 1525 (let ((vars (append
51f606de 1526 c-style-variables
d9e94c22 1527 '(c-buffer-is-cc-mode
51f606de 1528 c-tab-always-indent
d9e94c22
MS
1529 c-syntactic-indentation
1530 c-syntactic-indentation-in-macros
1531 c-ignore-auto-fill
1532 c-auto-align-backslashes
1533 c-backspace-function
1534 c-delete-function
1535 c-electric-pound-behavior
1536 c-default-style
1537 c-enable-xemacs-performance-kludge-p
1538 c-old-style-variable-behavior
51f606de
GM
1539 defun-prompt-regexp
1540 tab-width
1541 comment-column
1542 parse-sexp-ignore-comments
d9e94c22
MS
1543 parse-sexp-lookup-properties
1544 lookup-syntax-properties
51f606de
GM
1545 ;; A brain-damaged XEmacs only variable that, if
1546 ;; set to nil can cause all kinds of chaos.
1547 signal-error-on-buffer-boundary
1548 ;; Variables that affect line breaking and comments.
d9e94c22 1549 auto-fill-mode
91b807c9 1550 auto-fill-function
51f606de
GM
1551 filladapt-mode
1552 comment-multi-line
1553 comment-start-skip
1554 fill-prefix
d9e94c22 1555 fill-column
51f606de
GM
1556 paragraph-start
1557 adaptive-fill-mode
1558 adaptive-fill-regexp)
1559 nil)))
d9e94c22
MS
1560 (mapcar (lambda (var) (unless (boundp var)
1561 (setq vars (delq var vars))))
91b807c9
GM
1562 '(signal-error-on-buffer-boundary
1563 filladapt-mode
d9e94c22
MS
1564 defun-prompt-regexp
1565 font-lock-mode
1566 font-lock-maximum-decoration
1567 parse-sexp-lookup-properties
1568 lookup-syntax-properties))
51f606de 1569 vars)
9714ec23 1570 (lambda ()
a66cd3ee 1571 (run-hooks 'c-prepare-bug-report-hooks)
d9e94c22 1572 (insert (format "Buffer Style: %s\nc-emacs-features: %s\n"
a66cd3ee 1573 style c-features)))))))
785eecbb
RS
1574
1575\f
130c507e 1576(cc-provide 'cc-mode)
ab5796a9 1577
0386b551 1578;;; arch-tag: 7825e5c4-fd09-439f-a04d-4c13208ba3d7
785eecbb 1579;;; cc-mode.el ends here