(cl-do-arglist): Revert change of
[emacs.git] / lisp / progmodes / cc-mode.el
blob0ac23c85c27509bb0b5f204208de3c4e479582ed
1 ;;; cc-mode.el --- major mode for editing C, C++, Objective-C, and Java code
3 ;; Copyright (C) 1985,1987,1992-2001 Free Software Foundation, Inc.
5 ;; Authors: 2000- Martin Stjernholm
6 ;; 1998-1999 Barry A. Warsaw and Martin Stjernholm
7 ;; 1992-1997 Barry A. Warsaw
8 ;; 1987 Dave Detlefs and Stewart Clamen
9 ;; 1985 Richard M. Stallman
10 ;; Maintainer: bug-cc-mode@gnu.org
11 ;; Created: a long, long, time ago. adapted from the original c-mode.el
12 ;; Keywords: c languages oop
14 ;; This file is part of GNU Emacs.
16 ;; GNU Emacs is free software; you can redistribute it and/or modify
17 ;; it under the terms of the GNU General Public License as published by
18 ;; the Free Software Foundation; either version 2, or (at your option)
19 ;; any later version.
21 ;; GNU Emacs is distributed in the hope that it will be useful,
22 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
23 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24 ;; GNU General Public License for more details.
26 ;; You should have received a copy of the GNU General Public License
27 ;; along with this program; see the file COPYING. If not, write to
28 ;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
29 ;; Boston, MA 02111-1307, USA.
31 (defconst c-version "5.28"
32 "CC Mode version number.")
34 ;; NOTE: Read the commentary below for the right way to submit bug reports!
35 ;; NOTE: See the accompanying texinfo manual for details on using this mode!
37 ;;; Commentary:
39 ;; This package provides GNU Emacs major modes for editing C, C++,
40 ;; Objective-C, Java, IDL and Pike code. As of the latest Emacs and
41 ;; XEmacs releases, it is the default package for editing these
42 ;; languages. This package is called "CC Mode", and should be spelled
43 ;; exactly this way.
45 ;; CC Mode supports K&R and ANSI C, ANSI C++, Objective-C, Java,
46 ;; CORBA's IDL, and Pike with a consistent indentation model across
47 ;; all modes. This indentation model is intuitive and very flexible,
48 ;; so that almost any desired style of indentation can be supported.
49 ;; Installation, usage, and programming details are contained in an
50 ;; accompanying texinfo manual.
52 ;; CC Mode's immediate ancestors were, c++-mode.el, cplus-md.el, and
53 ;; cplus-md1.el..
55 ;; NOTE: This mode does not perform font-locking (a.k.a syntactic
56 ;; coloring, keyword highlighting, etc.) for any of the supported
57 ;; modes. Typically this is done by a package called font-lock.el
58 ;; which we do *not* maintain. You should contact the Emacs or XEmacs
59 ;; maintainers for questions about coloring or highlighting in any
60 ;; language mode.
62 ;; To submit bug reports, type "C-c C-b". These will be sent to
63 ;; bug-gnu-emacs@gnu.org (mirrored as the Usenet newsgroup
64 ;; gnu.emacs.bug) as well as bug-cc-mode@gnu.org, which directly
65 ;; contacts the CC Mode maintainers. Questions can sent to
66 ;; help-gnu-emacs@gnu.org (mirrored as gnu.emacs.help) and/or
67 ;; bug-cc-mode@gnu.org. Please do not send bugs or questions to our
68 ;; personal accounts; we reserve the right to ignore such email!
70 ;; Many, many thanks go out to all the folks on the beta test list.
71 ;; Without their patience, testing, insight, code contributions, and
72 ;; encouragement CC Mode would be a far inferior package.
74 ;; You can get the latest version of CC Mode, including PostScript
75 ;; documentation and separate individual files from:
77 ;; http://cc-mode.sourceforge.net/
79 ;; You can join a moderated CC Mode announcement-only mailing list by
80 ;; visiting
82 ;; http://lists.sourceforge.net/mailman/listinfo/cc-mode-announce
84 ;;; Code:
86 (eval-when-compile
87 (let ((load-path
88 (if (and (boundp 'byte-compile-dest-file)
89 (stringp byte-compile-dest-file))
90 (cons (file-name-directory byte-compile-dest-file) load-path)
91 load-path)))
92 (require 'cc-bytecomp)))
94 (cc-require 'cc-defs)
95 (cc-require 'cc-menus)
96 (cc-require 'cc-vars)
97 (cc-require 'cc-langs)
98 (cc-require 'cc-styles)
99 (cc-require 'cc-engine)
100 (cc-require 'cc-cmds)
101 (cc-require 'cc-align)
103 ;; Silence the compiler.
104 (cc-bytecomp-defvar comment-line-break-function) ; (X)Emacs 20+
105 (cc-bytecomp-defvar adaptive-fill-first-line-regexp) ; Emacs 20+
106 (cc-bytecomp-defun set-keymap-parents) ; XEmacs
108 ;; Menu support for both XEmacs and Emacs. If you don't have easymenu
109 ;; with your version of Emacs, you are incompatible!
110 (require 'easymenu)
113 ;; Other modes and packages which depend on CC Mode should do the
114 ;; following to make sure everything is loaded and available for their
115 ;; use:
117 ;; (require 'cc-mode)
118 ;; (c-initialize-cc-mode)
120 ;;;###autoload
121 (defun c-initialize-cc-mode ()
122 (setq c-buffer-is-cc-mode t)
123 (let ((initprop 'cc-mode-is-initialized)
124 c-initialization-ok)
125 (unless (get 'c-initialize-cc-mode initprop)
126 (unwind-protect
127 (progn
128 (put 'c-initialize-cc-mode initprop t)
129 (c-initialize-builtin-style)
130 (run-hooks 'c-initialization-hook)
131 ;; Fix obsolete variables.
132 (if (boundp 'c-comment-continuation-stars)
133 (setq c-block-comment-prefix c-comment-continuation-stars))
134 (setq c-initialization-ok t))
135 ;; Will try initialization hooks again if they failed.
136 (put 'c-initialize-cc-mode initprop c-initialization-ok)))
140 ;; Common routines
141 (defvar c-mode-base-map ()
142 "Keymap shared by all CC Mode related modes.")
144 (defun c-make-inherited-keymap ()
145 (let ((map (make-sparse-keymap)))
146 (cond
147 ;; XEmacs 19 & 20
148 ((fboundp 'set-keymap-parents)
149 (set-keymap-parents map c-mode-base-map))
150 ;; Emacs 19
151 ((fboundp 'set-keymap-parent)
152 (set-keymap-parent map c-mode-base-map))
153 ;; incompatible
154 (t (error "CC Mode is incompatible with this version of Emacs")))
155 map))
157 (if c-mode-base-map
159 ;; TBD: should we even worry about naming this keymap. My vote: no,
160 ;; because Emacs and XEmacs do it differently.
161 (setq c-mode-base-map (make-sparse-keymap))
162 ;; put standard keybindings into MAP
163 ;; the following mappings correspond more or less directly to BOCM
164 (define-key c-mode-base-map "{" 'c-electric-brace)
165 (define-key c-mode-base-map "}" 'c-electric-brace)
166 (define-key c-mode-base-map ";" 'c-electric-semi&comma)
167 (define-key c-mode-base-map "#" 'c-electric-pound)
168 (define-key c-mode-base-map ":" 'c-electric-colon)
169 (define-key c-mode-base-map "(" 'c-electric-paren)
170 (define-key c-mode-base-map ")" 'c-electric-paren)
171 ;; Separate M-BS from C-M-h. The former should remain
172 ;; backward-kill-word.
173 (define-key c-mode-base-map [(control meta h)] 'c-mark-function)
174 (define-key c-mode-base-map "\e\C-q" 'c-indent-exp)
175 (substitute-key-definition 'backward-sentence
176 'c-beginning-of-statement
177 c-mode-base-map global-map)
178 (substitute-key-definition 'forward-sentence
179 'c-end-of-statement
180 c-mode-base-map global-map)
181 (substitute-key-definition 'indent-new-comment-line
182 'c-indent-new-comment-line
183 c-mode-base-map global-map)
184 ;; RMS says don't make these the default.
185 ;; (define-key c-mode-base-map "\e\C-a" 'c-beginning-of-defun)
186 ;; (define-key c-mode-base-map "\e\C-e" 'c-end-of-defun)
187 (define-key c-mode-base-map "\C-c\C-n" 'c-forward-conditional)
188 (define-key c-mode-base-map "\C-c\C-p" 'c-backward-conditional)
189 (define-key c-mode-base-map "\C-c\C-u" 'c-up-conditional)
190 (substitute-key-definition 'indent-for-tab-command
191 'c-indent-command
192 c-mode-base-map global-map)
193 ;; It doesn't suffice to put c-fill-paragraph on
194 ;; fill-paragraph-function due to the way it works.
195 (substitute-key-definition 'fill-paragraph 'c-fill-paragraph
196 c-mode-base-map global-map)
197 ;; In XEmacs the default fill function is called
198 ;; fill-paragraph-or-region.
199 (substitute-key-definition 'fill-paragraph-or-region 'c-fill-paragraph
200 c-mode-base-map global-map)
201 ;; Bind the electric deletion functions to C-d and DEL. Emacs 21
202 ;; automatically maps the [delete] and [backspace] keys to these two
203 ;; depending on window system and user preferences. (In earlier
204 ;; versions it's possible to do the same by using `function-key-map'.)
205 (define-key c-mode-base-map "\C-d" 'c-electric-delete-forward)
206 (define-key c-mode-base-map "\177" 'c-electric-backspace)
207 (when (boundp 'delete-key-deletes-forward)
208 ;; In XEmacs 20 and later we fix the forward and backward deletion
209 ;; behavior by binding the keysyms for the [delete] and
210 ;; [backspace] keys directly, and use `delete-forward-p' or
211 ;; `delete-key-deletes-forward' to decide what [delete] should do.
212 (define-key c-mode-base-map [delete] 'c-electric-delete)
213 (define-key c-mode-base-map [backspace] 'c-electric-backspace))
214 ;; these are new keybindings, with no counterpart to BOCM
215 (define-key c-mode-base-map "," 'c-electric-semi&comma)
216 (define-key c-mode-base-map "*" 'c-electric-star)
217 (define-key c-mode-base-map "/" 'c-electric-slash)
218 (define-key c-mode-base-map "\C-c\C-q" 'c-indent-defun)
219 (define-key c-mode-base-map "\C-c\C-\\" 'c-backslash-region)
220 ;; TBD: where if anywhere, to put c-backward|forward-into-nomenclature
221 (define-key c-mode-base-map "\C-c\C-a" 'c-toggle-auto-state)
222 (define-key c-mode-base-map "\C-c\C-b" 'c-submit-bug-report)
223 (define-key c-mode-base-map "\C-c\C-c" 'comment-region)
224 (define-key c-mode-base-map "\C-c\C-d" 'c-toggle-hungry-state)
225 (define-key c-mode-base-map "\C-c\C-o" 'c-set-offset)
226 (define-key c-mode-base-map "\C-c\C-s" 'c-show-syntactic-information)
227 (define-key c-mode-base-map "\C-c\C-t" 'c-toggle-auto-hungry-state)
228 (define-key c-mode-base-map "\C-c." 'c-set-style)
229 ;; conflicts with OOBR
230 ;;(define-key c-mode-base-map "\C-c\C-v" 'c-version)
233 (defvar c-c-menu nil)
234 (defvar c-c++-menu nil)
235 (defvar c-objc-menu nil)
236 (defvar c-java-menu nil)
237 (defvar c-pike-menu nil)
239 (defun c-mode-menu (modestr)
240 (let ((m
241 '(["Comment Out Region" comment-region (c-fn-region-is-active-p)]
242 ["Uncomment Region"
243 (comment-region (region-beginning) (region-end) '(4))
244 (c-fn-region-is-active-p)]
245 ["Fill Comment Paragraph" c-fill-paragraph t]
246 "---"
247 ["Indent Expression" c-indent-exp
248 (memq (char-after) '(?\( ?\[ ?\{))]
249 ["Indent Line or Region" c-indent-line-or-region t]
250 ["Up Conditional" c-up-conditional t]
251 ["Backward Conditional" c-backward-conditional t]
252 ["Forward Conditional" c-forward-conditional t]
253 ["Backward Statement" c-beginning-of-statement t]
254 ["Forward Statement" c-end-of-statement t]
255 "---"
256 ["Macro Expand Region" c-macro-expand (c-fn-region-is-active-p)]
257 ["Backslashify" c-backslash-region
258 (c-fn-region-is-active-p)]
260 (cons modestr m)))
262 ;; We don't require the outline package, but we configure it a bit anyway.
263 (cc-bytecomp-defvar outline-level)
265 (defun c-common-init ()
266 ;; Common initializations for all modes.
267 ;; these variables should always be buffer local; they do not affect
268 ;; indentation style.
269 (make-local-variable 'require-final-newline)
270 (make-local-variable 'parse-sexp-ignore-comments)
271 (make-local-variable 'indent-line-function)
272 (make-local-variable 'indent-region-function)
273 (make-local-variable 'outline-regexp)
274 (make-local-variable 'outline-level)
275 (make-local-variable 'normal-auto-fill-function)
276 (make-local-variable 'comment-start)
277 (make-local-variable 'comment-end)
278 (make-local-variable 'comment-column)
279 (make-local-variable 'comment-start-skip)
280 (make-local-variable 'comment-multi-line)
281 (make-local-variable 'paragraph-start)
282 (make-local-variable 'paragraph-separate)
283 (make-local-variable 'paragraph-ignore-fill-prefix)
284 (make-local-variable 'adaptive-fill-mode)
285 (make-local-variable 'adaptive-fill-regexp)
286 (make-local-variable 'imenu-generic-expression) ;set in the mode functions
287 ;; X/Emacs 20 only
288 (and (boundp 'comment-line-break-function)
289 (progn
290 (make-local-variable 'comment-line-break-function)
291 (setq comment-line-break-function
292 'c-indent-new-comment-line)))
293 ;; now set their values
294 (setq require-final-newline t
295 parse-sexp-ignore-comments t
296 indent-line-function 'c-indent-line
297 indent-region-function 'c-indent-region
298 outline-regexp "[^#\n\^M]"
299 outline-level 'c-outline-level
300 normal-auto-fill-function 'c-do-auto-fill
301 comment-column 32
302 comment-start-skip "/\\*+ *\\|//+ *"
303 comment-multi-line t)
304 ;; now set the mode style based on c-default-style
305 (let ((style (if (stringp c-default-style)
306 c-default-style
307 (or (cdr (assq major-mode c-default-style))
308 (cdr (assq 'other c-default-style))
309 "gnu"))))
310 ;; Override style variables if `c-old-style-variable-behavior' is
311 ;; set. Also override if we are using global style variables,
312 ;; have already initialized a style once, and are switching to a
313 ;; different style. (It's doubtful whether this is desirable, but
314 ;; the whole situation with nonlocal style variables is a bit
315 ;; awkward. It's at least the most compatible way with the old
316 ;; style init procedure.)
317 (c-set-style style (not (or c-old-style-variable-behavior
318 (and (not c-style-variables-are-local-p)
319 c-indentation-style
320 (not (string-equal c-indentation-style
321 style)))))))
322 ;; Fix things up for paragraph recognition and filling inside
323 ;; comments by using c-current-comment-prefix in the relevant
324 ;; places. We use adaptive filling for this to make it possible to
325 ;; use filladapt or some other fancy package.
326 (setq c-current-comment-prefix
327 (if (listp c-comment-prefix-regexp)
328 (cdr-safe (or (assoc major-mode c-comment-prefix-regexp)
329 (assoc 'other c-comment-prefix-regexp)))
330 c-comment-prefix-regexp))
331 (let ((comment-line-prefix
332 (concat "[ \t]*\\(" c-current-comment-prefix "\\)[ \t]*")))
333 (setq paragraph-start (concat comment-line-prefix
334 c-append-paragraph-start
335 "\\|"
336 page-delimiter)
337 paragraph-separate (concat comment-line-prefix
338 c-append-paragraph-separate
339 "\\|"
340 page-delimiter)
341 paragraph-ignore-fill-prefix t
342 adaptive-fill-mode t
343 adaptive-fill-regexp
344 (concat comment-line-prefix
345 (if adaptive-fill-regexp
346 (concat "\\(" adaptive-fill-regexp "\\)")
347 "")))
348 (when (boundp 'adaptive-fill-first-line-regexp)
349 ;; XEmacs (20.x) adaptive fill mode doesn't have this.
350 (make-local-variable 'adaptive-fill-first-line-regexp)
351 (setq adaptive-fill-first-line-regexp
352 (concat "\\`" comment-line-prefix
353 ;; Maybe we should incorporate the old value here,
354 ;; but then we have to do all sorts of kludges to
355 ;; deal with the \` and \' it probably contains.
356 "\\'"))))
357 ;; we have to do something special for c-offsets-alist so that the
358 ;; buffer local value has its own alist structure.
359 (setq c-offsets-alist (copy-alist c-offsets-alist))
360 ;; setup the comment indent variable in a Emacs version portable way
361 ;; ignore any byte compiler warnings you might get here
362 (make-local-variable 'comment-indent-function)
363 (setq comment-indent-function 'c-comment-indent)
364 ;; add menus to menubar
365 (easy-menu-add (c-mode-menu mode-name))
366 ;; put auto-hungry designators onto minor-mode-alist, but only once
367 (or (assq 'c-auto-hungry-string minor-mode-alist)
368 (setq minor-mode-alist
369 (cons '(c-auto-hungry-string c-auto-hungry-string)
370 minor-mode-alist)))
373 (defun c-postprocess-file-styles ()
374 "Function that post processes relevant file local variables.
375 Currently, this function simply applies any style and offset settings
376 found in the file's Local Variable list. It first applies any style
377 setting found in `c-file-style', then it applies any offset settings
378 it finds in `c-file-offsets'.
380 Note that the style variables are always made local to the buffer."
381 ;; apply file styles and offsets
382 (if (or c-file-style c-file-offsets)
383 (c-make-styles-buffer-local t))
384 (and c-file-style
385 (c-set-style c-file-style))
386 (and c-file-offsets
387 (mapcar
388 (function
389 (lambda (langentry)
390 (let ((langelem (car langentry))
391 (offset (cdr langentry)))
392 (c-set-offset langelem offset)
394 c-file-offsets)))
396 (add-hook 'hack-local-variables-hook 'c-postprocess-file-styles)
399 ;; Support for C
401 (defvar c-mode-abbrev-table nil
402 "Abbreviation table used in c-mode buffers.")
403 (define-abbrev-table 'c-mode-abbrev-table
404 '(("else" "else" c-electric-continued-statement 0)
405 ("while" "while" c-electric-continued-statement 0)))
407 (defvar c-mode-map ()
408 "Keymap used in c-mode buffers.")
409 (if c-mode-map
411 (setq c-mode-map (c-make-inherited-keymap))
412 ;; add bindings which are only useful for C
413 (define-key c-mode-map "\C-c\C-e" 'c-macro-expand)
416 (easy-menu-define c-c-menu c-mode-map "C Mode Commands"
417 (c-mode-menu "C"))
419 ;;;###autoload
420 (defun c-mode ()
421 "Major mode for editing K&R and ANSI C code.
422 To submit a problem report, enter `\\[c-submit-bug-report]' from a
423 c-mode buffer. This automatically sets up a mail buffer with version
424 information already added. You just need to add a description of the
425 problem, including a reproducible test case and send the message.
427 To see what version of CC Mode you are running, enter `\\[c-version]'.
429 The hook variable `c-mode-hook' is run with no args, if that value is
430 bound and has a non-nil value. Also the hook `c-mode-common-hook' is
431 run first.
433 Key bindings:
434 \\{c-mode-map}"
435 (interactive)
436 (c-initialize-cc-mode)
437 (kill-all-local-variables)
438 (set-syntax-table c-mode-syntax-table)
439 (setq major-mode 'c-mode
440 mode-name "C"
441 local-abbrev-table c-mode-abbrev-table
442 abbrev-mode t)
443 (use-local-map c-mode-map)
444 (c-common-init)
445 (setq comment-start "/* "
446 comment-end " */"
447 c-keywords (c-identifier-re c-C-keywords)
448 c-conditional-key c-C-conditional-key
449 c-class-key c-C-class-key
450 c-baseclass-key nil
451 c-comment-start-regexp c-C-comment-start-regexp
452 c-bitfield-key c-C-bitfield-key
454 (cc-imenu-init cc-imenu-c-generic-expression)
455 (run-hooks 'c-mode-common-hook)
456 (run-hooks 'c-mode-hook)
457 (c-update-modeline))
460 ;; Support for C++
462 (defvar c++-mode-abbrev-table nil
463 "Abbreviation table used in c++-mode buffers.")
464 (define-abbrev-table 'c++-mode-abbrev-table
465 '(("else" "else" c-electric-continued-statement 0)
466 ("while" "while" c-electric-continued-statement 0)
467 ("catch" "catch" c-electric-continued-statement 0)))
469 (defvar c++-mode-map ()
470 "Keymap used in c++-mode buffers.")
471 (if c++-mode-map
473 (setq c++-mode-map (c-make-inherited-keymap))
474 ;; add bindings which are only useful for C++
475 (define-key c++-mode-map "\C-c\C-e" 'c-macro-expand)
476 (define-key c++-mode-map "\C-c:" 'c-scope-operator)
477 (define-key c++-mode-map "<" 'c-electric-lt-gt)
478 (define-key c++-mode-map ">" 'c-electric-lt-gt))
480 (easy-menu-define c-c++-menu c++-mode-map "C++ Mode Commands"
481 (c-mode-menu "C++"))
483 ;;;###autoload
484 (defun c++-mode ()
485 "Major mode for editing C++ code.
486 To submit a problem report, enter `\\[c-submit-bug-report]' from a
487 c++-mode buffer. This automatically sets up a mail buffer with
488 version information already added. You just need to add a description
489 of the problem, including a reproducible test case, and send the
490 message.
492 To see what version of CC Mode you are running, enter `\\[c-version]'.
494 The hook variable `c++-mode-hook' is run with no args, if that
495 variable is bound and has a non-nil value. Also the hook
496 `c-mode-common-hook' is run first.
498 Key bindings:
499 \\{c++-mode-map}"
500 (interactive)
501 (c-initialize-cc-mode)
502 (kill-all-local-variables)
503 (set-syntax-table c++-mode-syntax-table)
504 (setq major-mode 'c++-mode
505 mode-name "C++"
506 local-abbrev-table c++-mode-abbrev-table
507 abbrev-mode t)
508 (use-local-map c++-mode-map)
509 (c-common-init)
510 (setq comment-start "// "
511 comment-end ""
512 c-keywords (c-identifier-re c-C++-keywords)
513 c-conditional-key c-C++-conditional-key
514 c-comment-start-regexp c-C++-comment-start-regexp
515 c-class-key c-C++-class-key
516 c-extra-toplevel-key c-C++-extra-toplevel-key
517 c-access-key c-C++-access-key
518 c-recognize-knr-p nil
519 c-bitfield-key c-C-bitfield-key
521 (cc-imenu-init cc-imenu-c++-generic-expression)
522 (run-hooks 'c-mode-common-hook)
523 (run-hooks 'c++-mode-hook)
524 (c-update-modeline))
527 ;; Support for Objective-C
529 (defvar objc-mode-abbrev-table nil
530 "Abbreviation table used in objc-mode buffers.")
531 (define-abbrev-table 'objc-mode-abbrev-table
532 '(("else" "else" c-electric-continued-statement 0)
533 ("while" "while" c-electric-continued-statement 0)))
535 (defvar objc-mode-map ()
536 "Keymap used in objc-mode buffers.")
537 (if objc-mode-map
539 (setq objc-mode-map (c-make-inherited-keymap))
540 ;; add bindings which are only useful for Objective-C
541 (define-key objc-mode-map "\C-c\C-e" 'c-macro-expand))
543 (easy-menu-define c-objc-menu objc-mode-map "ObjC Mode Commands"
544 (c-mode-menu "ObjC"))
546 ;;;###autoload
547 (defun objc-mode ()
548 "Major mode for editing Objective C code.
549 To submit a problem report, enter `\\[c-submit-bug-report]' from an
550 objc-mode buffer. This automatically sets up a mail buffer with
551 version information already added. You just need to add a description
552 of the problem, including a reproducible test case, and send the
553 message.
555 To see what version of CC Mode you are running, enter `\\[c-version]'.
557 The hook variable `objc-mode-hook' is run with no args, if that value
558 is bound and has a non-nil value. Also the hook `c-mode-common-hook'
559 is run first.
561 Key bindings:
562 \\{objc-mode-map}"
563 (interactive)
564 (c-initialize-cc-mode)
565 (kill-all-local-variables)
566 (set-syntax-table objc-mode-syntax-table)
567 (setq major-mode 'objc-mode
568 mode-name "ObjC"
569 local-abbrev-table objc-mode-abbrev-table
570 abbrev-mode t)
571 (use-local-map objc-mode-map)
572 (c-common-init)
573 (setq comment-start "// "
574 comment-end ""
575 c-keywords (c-identifier-re c-ObjC-keywords)
576 c-conditional-key c-ObjC-conditional-key
577 c-comment-start-regexp c-ObjC-comment-start-regexp
578 c-class-key c-ObjC-class-key
579 c-baseclass-key nil
580 c-access-key c-ObjC-access-key
581 c-method-key c-ObjC-method-key
583 (cc-imenu-init cc-imenu-objc-generic-expression)
584 (run-hooks 'c-mode-common-hook)
585 (run-hooks 'objc-mode-hook)
586 (c-update-modeline))
589 ;; Support for Java
591 (defvar java-mode-abbrev-table nil
592 "Abbreviation table used in java-mode buffers.")
593 (define-abbrev-table 'java-mode-abbrev-table
594 '(("else" "else" c-electric-continued-statement 0)
595 ("while" "while" c-electric-continued-statement 0)
596 ("catch" "catch" c-electric-continued-statement 0)
597 ("finally" "finally" c-electric-continued-statement 0)))
599 (defvar java-mode-map ()
600 "Keymap used in java-mode buffers.")
601 (if java-mode-map
603 (setq java-mode-map (c-make-inherited-keymap))
604 ;; add bindings which are only useful for Java
607 (easy-menu-define c-java-menu java-mode-map "Java Mode Commands"
608 (c-mode-menu "Java"))
610 ;;;###autoload
611 (defun java-mode ()
612 "Major mode for editing Java code.
613 To submit a problem report, enter `\\[c-submit-bug-report]' from a
614 java-mode buffer. This automatically sets up a mail buffer with
615 version information already added. You just need to add a description
616 of the problem, including a reproducible test case and send the
617 message.
619 To see what version of CC Mode you are running, enter `\\[c-version]'.
621 The hook variable `java-mode-hook' is run with no args, if that value
622 is bound and has a non-nil value. Also the common hook
623 `c-mode-common-hook' is run first. Note that this mode automatically
624 sets the \"java\" style before calling any hooks so be careful if you
625 set styles in `c-mode-common-hook'.
627 Key bindings:
628 \\{java-mode-map}"
629 (interactive)
630 (c-initialize-cc-mode)
631 (kill-all-local-variables)
632 (set-syntax-table java-mode-syntax-table)
633 (setq major-mode 'java-mode
634 mode-name "Java"
635 local-abbrev-table java-mode-abbrev-table
636 abbrev-mode t
637 c-append-paragraph-start c-Java-javadoc-paragraph-start)
638 (use-local-map java-mode-map)
639 (c-common-init)
640 (setq comment-start "// "
641 comment-end ""
642 c-keywords (c-identifier-re c-Java-keywords)
643 c-conditional-key c-Java-conditional-key
644 c-comment-start-regexp c-Java-comment-start-regexp
645 c-class-key c-Java-class-key
646 c-method-key nil
647 c-baseclass-key nil
648 c-recognize-knr-p nil
649 c-inexpr-class-key c-Java-inexpr-class-key
650 ;defun-prompt-regexp c-Java-defun-prompt-regexp
652 (cc-imenu-init cc-imenu-java-generic-expression)
653 (run-hooks 'c-mode-common-hook)
654 (run-hooks 'java-mode-hook)
655 (c-update-modeline))
658 ;; Support for CORBA's IDL language
660 (defvar idl-mode-abbrev-table nil
661 "Abbreviation table used in idl-mode buffers.")
662 (define-abbrev-table 'idl-mode-abbrev-table ())
664 (defvar idl-mode-map ()
665 "Keymap used in idl-mode buffers.")
666 (if idl-mode-map
668 (setq idl-mode-map (c-make-inherited-keymap))
669 ;; add bindings which are only useful for IDL
672 (easy-menu-define c-idl-menu idl-mode-map "IDL Mode Commands"
673 (c-mode-menu "IDL"))
675 ;;;###autoload
676 (defun idl-mode ()
677 "Major mode for editing CORBA's IDL code.
678 To submit a problem report, enter `\\[c-submit-bug-report]' from an
679 idl-mode buffer. This automatically sets up a mail buffer with
680 version information already added. You just need to add a description
681 of the problem, including a reproducible test case, and send the
682 message.
684 To see what version of CC Mode you are running, enter `\\[c-version]'.
686 The hook variable `idl-mode-hook' is run with no args, if that
687 variable is bound and has a non-nil value. Also the hook
688 `c-mode-common-hook' is run first.
690 Key bindings:
691 \\{idl-mode-map}"
692 (interactive)
693 (c-initialize-cc-mode)
694 (kill-all-local-variables)
695 (set-syntax-table idl-mode-syntax-table)
696 (setq major-mode 'idl-mode
697 mode-name "IDL"
698 local-abbrev-table idl-mode-abbrev-table)
699 (use-local-map idl-mode-map)
700 (c-common-init)
701 (setq comment-start "// "
702 comment-end ""
703 c-keywords (c-identifier-re c-IDL-keywords)
704 c-conditional-key c-IDL-conditional-key
705 c-comment-start-regexp c-IDL-comment-start-regexp
706 c-class-key c-IDL-class-key
707 c-method-key nil
708 c-baseclass-key nil
709 c-extra-toplevel-key c-IDL-extra-toplevel-key
710 c-recognize-knr-p nil
712 ;;(cc-imenu-init cc-imenu-idl-generic-expression) ;FIXME
713 (run-hooks 'c-mode-common-hook)
714 (run-hooks 'idl-mode-hook)
715 (c-update-modeline))
718 ;; Support for Pike
720 (defvar pike-mode-abbrev-table nil
721 "Abbreviation table used in pike-mode buffers.")
722 (define-abbrev-table 'pike-mode-abbrev-table
723 '(("else" "else" c-electric-continued-statement 0)
724 ("while" "while" c-electric-continued-statement 0)))
726 (defvar pike-mode-map ()
727 "Keymap used in pike-mode buffers.")
728 (if pike-mode-map
730 (setq pike-mode-map (c-make-inherited-keymap))
731 ;; additional bindings
732 (define-key pike-mode-map "\C-c\C-e" 'c-macro-expand))
734 (easy-menu-define c-pike-menu pike-mode-map "Pike Mode Commands"
735 (c-mode-menu "Pike"))
737 ;;;###autoload
738 (defun pike-mode ()
739 "Major mode for editing Pike code.
740 To submit a problem report, enter `\\[c-submit-bug-report]' from an
741 idl-mode buffer. This automatically sets up a mail buffer with
742 version information already added. You just need to add a description
743 of the problem, including a reproducible test case, and send the
744 message.
746 To see what version of CC Mode you are running, enter `\\[c-version]'.
748 The hook variable `pike-mode-hook' is run with no args, if that value
749 is bound and has a non-nil value. Also the common hook
750 `c-mode-common-hook' is run first.
752 Key bindings:
753 \\{pike-mode-map}"
754 (interactive)
755 (c-initialize-cc-mode)
756 (kill-all-local-variables)
757 (set-syntax-table pike-mode-syntax-table)
758 (setq major-mode 'pike-mode
759 mode-name "Pike"
760 local-abbrev-table pike-mode-abbrev-table
761 abbrev-mode t
762 c-append-paragraph-start c-Pike-pikedoc-paragraph-start
763 c-append-paragraph-separate c-Pike-pikedoc-paragraph-separate)
764 (use-local-map pike-mode-map)
765 (c-common-init)
766 (setq comment-start "// "
767 comment-end ""
768 c-keywords (c-identifier-re c-Pike-keywords)
769 c-conditional-key c-Pike-conditional-key
770 c-comment-start-regexp c-Pike-comment-start-regexp
771 c-class-key c-Pike-class-key
772 c-method-key nil
773 c-baseclass-key nil
774 c-recognize-knr-p nil
775 c-lambda-key c-Pike-lambda-key
776 c-inexpr-block-key c-Pike-inexpr-block-key
777 c-inexpr-class-key c-Pike-inexpr-class-key
778 c-special-brace-lists c-Pike-special-brace-lists
780 ;;(cc-imenu-init cc-imenu-pike-generic-expression) ;FIXME
781 (run-hooks 'c-mode-common-hook)
782 (run-hooks 'pike-mode-hook)
783 (c-update-modeline))
786 ;; Helper for setting up Filladapt mode. It's not used by CC Mode itself.
788 (cc-bytecomp-defvar filladapt-token-table)
789 (cc-bytecomp-defvar filladapt-token-match-table)
790 (cc-bytecomp-defvar filladapt-token-conversion-table)
792 (defun c-setup-filladapt ()
793 "Convenience function to configure Kyle E. Jones' Filladapt mode for
794 CC Mode by making sure the proper entries are present on
795 `filladapt-token-table', `filladapt-token-match-table', and
796 `filladapt-token-conversion-table'. This is intended to be used on
797 `c-mode-common-hook' or similar."
798 ;; This function is intended to be used explicitly by the end user
799 ;; only.
801 ;; The default configuration already handles C++ comments, but we
802 ;; need to add handling of C block comments. A new filladapt token
803 ;; `c-comment' is added for that.
804 (let (p)
805 (setq p filladapt-token-table)
806 (while (and p (not (eq (car-safe (cdr-safe (car-safe p))) 'c-comment)))
807 (setq p (cdr-safe p)))
808 (if p
809 (setcar (car p) c-current-comment-prefix)
810 (setq filladapt-token-table
811 (append (list (car filladapt-token-table)
812 (list c-current-comment-prefix 'c-comment))
813 (cdr filladapt-token-table)))))
814 (unless (assq 'c-comment filladapt-token-match-table)
815 (setq filladapt-token-match-table
816 (append '((c-comment c-comment))
817 filladapt-token-match-table)))
818 (unless (assq 'c-comment filladapt-token-conversion-table)
819 (setq filladapt-token-conversion-table
820 (append '((c-comment . exact))
821 filladapt-token-conversion-table))))
824 ;; bug reporting
826 (defconst c-mode-help-address
827 "bug-gnu-emacs@gnu.org, bug-cc-mode@gnu.org"
828 "Addresses for CC Mode bug reports.")
830 (defun c-version ()
831 "Echo the current version of CC Mode in the minibuffer."
832 (interactive)
833 (message "Using CC Mode version %s" c-version)
834 (c-keep-region-active))
836 (defvar c-prepare-bug-report-hooks nil)
838 ;; Dynamic variables used by reporter.
839 (defvar reporter-prompt-for-summary-p)
840 (defvar reporter-dont-compact-list)
842 (defun c-submit-bug-report ()
843 "Submit via mail a bug report on CC Mode."
844 (interactive)
845 (require 'reporter)
846 ;; load in reporter
847 (let ((reporter-prompt-for-summary-p t)
848 (reporter-dont-compact-list '(c-offsets-alist))
849 (style c-indentation-style)
850 (c-features c-emacs-features))
851 (and
852 (if (y-or-n-p "Do you want to submit a report on CC Mode? ")
853 t (message "") nil)
854 (require 'reporter)
855 (reporter-submit-bug-report
856 c-mode-help-address
857 (concat "CC Mode " c-version " ("
858 (cond ((eq major-mode 'c++-mode) "C++")
859 ((eq major-mode 'c-mode) "C")
860 ((eq major-mode 'objc-mode) "ObjC")
861 ((eq major-mode 'java-mode) "Java")
862 ((eq major-mode 'idl-mode) "IDL")
863 ((eq major-mode 'pike-mode) "Pike")
865 ")")
866 (let ((vars (append
867 ;; report only the vars that affect indentation
868 c-style-variables
869 '(c-delete-function
870 c-electric-pound-behavior
871 c-indent-comments-syntactically-p
872 c-tab-always-indent
873 defun-prompt-regexp
874 tab-width
875 comment-column
876 parse-sexp-ignore-comments
877 ;; A brain-damaged XEmacs only variable that, if
878 ;; set to nil can cause all kinds of chaos.
879 signal-error-on-buffer-boundary
880 ;; Variables that affect line breaking and comments.
881 auto-fill-function
882 filladapt-mode
883 comment-multi-line
884 comment-start-skip
885 fill-prefix
886 paragraph-start
887 adaptive-fill-mode
888 adaptive-fill-regexp)
889 nil)))
890 (delq 'c-special-indent-hook vars)
891 (mapcar (lambda (var) (unless (boundp var) (delq var vars)))
892 '(signal-error-on-buffer-boundary
893 filladapt-mode
894 defun-prompt-regexp))
895 vars)
896 (function
897 (lambda ()
898 (run-hooks 'c-prepare-bug-report-hooks)
899 (insert
900 "Buffer Style: " style "\n\n"
901 (format "c-emacs-features: %s\n" c-features)
902 )))))))
905 (cc-provide 'cc-mode)
906 ;;; cc-mode.el ends here