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)
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 GNU Emacs; 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.29"
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!
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
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
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
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
82 ;; http://lists.sourceforge.net/mailman/listinfo/cc-mode-announce
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
)
92 (require 'cc-bytecomp
)))
95 (cc-require 'cc-menus
)
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!
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
117 ;; (require 'cc-mode)
119 ;; And in the major mode function:
121 ;; (c-initialize-cc-mode)
123 (defun c-leave-cc-mode-mode ()
124 (setq c-buffer-is-cc-mode nil
))
127 (defun c-initialize-cc-mode ()
128 (setq c-buffer-is-cc-mode t
)
129 (let ((initprop 'cc-mode-is-initialized
)
131 (unless (get 'c-initialize-cc-mode initprop
)
134 (put 'c-initialize-cc-mode initprop t
)
135 (c-initialize-builtin-style)
136 (run-hooks 'c-initialization-hook
)
137 ;; Fix obsolete variables.
138 (if (boundp 'c-comment-continuation-stars
)
139 (setq c-block-comment-prefix c-comment-continuation-stars
))
140 (add-hook 'change-major-mode-hook
'c-leave-cc-mode-mode
)
141 (setq c-initialization-ok t
))
142 ;; Will try initialization hooks again if they failed.
143 (put 'c-initialize-cc-mode initprop c-initialization-ok
)))
148 (defvar c-mode-base-map
()
149 "Keymap shared by all CC Mode related modes.")
151 (defun c-make-inherited-keymap ()
152 (let ((map (make-sparse-keymap)))
155 ((fboundp 'set-keymap-parents
)
156 (set-keymap-parents map c-mode-base-map
))
158 ((fboundp 'set-keymap-parent
)
159 (set-keymap-parent map c-mode-base-map
))
161 (t (error "CC Mode is incompatible with this version of Emacs")))
164 (defun c-define-abbrev-table (name defs
)
165 ;; Compatibility wrapper for `define-abbrev' which passes a non-nil
166 ;; sixth argument for SYSTEM-FLAG in emacsen that support it
167 ;; (currently only Emacs 21.2).
168 (define-abbrev-table name nil
)
169 (let ((table (symbol-value name
)))
172 (apply 'define-abbrev table
(append (car defs
) '(t)))
173 (wrong-number-of-arguments
174 (apply 'define-abbrev table
(car defs
))))
175 (setq defs
(cdr defs
)))))
179 ;; TBD: should we even worry about naming this keymap. My vote: no,
180 ;; because Emacs and XEmacs do it differently.
181 (setq c-mode-base-map
(make-sparse-keymap))
182 ;; put standard keybindings into MAP
183 ;; the following mappings correspond more or less directly to BOCM
184 (define-key c-mode-base-map
"{" 'c-electric-brace
)
185 (define-key c-mode-base-map
"}" 'c-electric-brace
)
186 (define-key c-mode-base-map
";" 'c-electric-semi
&comma
)
187 (define-key c-mode-base-map
"#" 'c-electric-pound
)
188 (define-key c-mode-base-map
":" 'c-electric-colon
)
189 (define-key c-mode-base-map
"(" 'c-electric-paren
)
190 (define-key c-mode-base-map
")" 'c-electric-paren
)
191 ;; Separate M-BS from C-M-h. The former should remain
192 ;; backward-kill-word.
193 (define-key c-mode-base-map
[(control meta h
)] 'c-mark-function
)
194 (define-key c-mode-base-map
"\e\C-q" 'c-indent-exp
)
195 (substitute-key-definition 'backward-sentence
196 'c-beginning-of-statement
197 c-mode-base-map global-map
)
198 (substitute-key-definition 'forward-sentence
200 c-mode-base-map global-map
)
201 (substitute-key-definition 'indent-new-comment-line
202 'c-indent-new-comment-line
203 c-mode-base-map global-map
)
204 (when (fboundp 'comment-indent-new-line
)
205 ;; indent-new-comment-line has changed name to
206 ;; comment-indent-new-line in Emacs 21.
207 (substitute-key-definition 'comment-indent-new-line
208 'c-indent-new-comment-line
209 c-mode-base-map global-map
))
210 ;; RMS says don't make these the default.
211 ;; (define-key c-mode-base-map "\e\C-a" 'c-beginning-of-defun)
212 ;; (define-key c-mode-base-map "\e\C-e" 'c-end-of-defun)
213 (define-key c-mode-base-map
"\C-c\C-n" 'c-forward-conditional
)
214 (define-key c-mode-base-map
"\C-c\C-p" 'c-backward-conditional
)
215 (define-key c-mode-base-map
"\C-c\C-u" 'c-up-conditional
)
216 (substitute-key-definition 'indent-for-tab-command
218 c-mode-base-map global-map
)
219 ;; It doesn't suffice to put c-fill-paragraph on
220 ;; fill-paragraph-function due to the way it works.
221 (substitute-key-definition 'fill-paragraph
'c-fill-paragraph
222 c-mode-base-map global-map
)
223 ;; In XEmacs the default fill function is called
224 ;; fill-paragraph-or-region.
225 (substitute-key-definition 'fill-paragraph-or-region
'c-fill-paragraph
226 c-mode-base-map global-map
)
227 ;; Bind the electric deletion functions to C-d and DEL. Emacs 21
228 ;; automatically maps the [delete] and [backspace] keys to these two
229 ;; depending on window system and user preferences. (In earlier
230 ;; versions it's possible to do the same by using `function-key-map'.)
231 (define-key c-mode-base-map
"\C-d" 'c-electric-delete-forward
)
232 (define-key c-mode-base-map
"\177" 'c-electric-backspace
)
233 (when (boundp 'delete-key-deletes-forward
)
234 ;; In XEmacs 20 and later we fix the forward and backward deletion
235 ;; behavior by binding the keysyms for the [delete] and
236 ;; [backspace] keys directly, and use `delete-forward-p' or
237 ;; `delete-key-deletes-forward' to decide what [delete] should do.
238 (define-key c-mode-base-map
[delete] 'c-electric-delete)
239 (define-key c-mode-base-map [backspace] 'c-electric-backspace))
240 ;; these are new keybindings, with no counterpart to BOCM
241 (define-key c-mode-base-map "," 'c-electric-semi&comma)
242 (define-key c-mode-base-map "*" 'c-electric-star)
243 (define-key c-mode-base-map "/" 'c-electric-slash)
244 (define-key c-mode-base-map "\C-c\C-q" 'c-indent-defun)
245 (define-key c-mode-base-map "\C-c\C-\\" 'c-backslash-region)
246 ;; TBD: where if anywhere, to put c-backward|forward-into-nomenclature
247 (define-key c-mode-base-map "\C-c\C-a" 'c-toggle-auto-state)
248 (define-key c-mode-base-map "\C-c\C-b" 'c-submit-bug-report)
249 (define-key c-mode-base-map "\C-c\C-c" 'comment-region)
250 (define-key c-mode-base-map "\C-c\C-d" 'c-toggle-hungry-state)
251 (define-key c-mode-base-map "\C-c\C-o" 'c-set-offset)
252 (define-key c-mode-base-map "\C-c\C-s" 'c-show-syntactic-information)
253 (define-key c-mode-base-map "\C-c\C-t" 'c-toggle-auto-hungry-state)
254 (define-key c-mode-base-map "\C-c." 'c-set-style)
255 ;; conflicts with OOBR
256 ;;(define-key c-mode-base-map "\C-c\C-v" 'c-version)
259 (defvar c-c-menu nil)
260 (defvar c-c++-menu nil)
261 (defvar c-objc-menu nil)
262 (defvar c-java-menu nil)
263 (defvar c-pike-menu nil)
265 (defun c-mode-menu (modestr)
267 '(["Comment Out Region" comment-region (c-fn-region-is-active-p)]
269 (comment-region (region-beginning) (region-end) '(4))
270 (c-fn-region-is-active-p)]
271 ["Fill Comment Paragraph" c-fill-paragraph t]
273 ["Indent Expression" c-indent-exp
274 (memq (char-after) '(?\( ?\[ ?\{))]
275 ["Indent Line or Region" c-indent-line-or-region t]
276 ["Up Conditional" c-up-conditional t]
277 ["Backward Conditional" c-backward-conditional t]
278 ["Forward Conditional" c-forward-conditional t]
279 ["Backward Statement" c-beginning-of-statement t]
280 ["Forward Statement" c-end-of-statement t]
282 ["Macro Expand Region" c-macro-expand (c-fn-region-is-active-p)]
283 ["Backslashify" c-backslash-region
284 (c-fn-region-is-active-p)]
287 ["Syntactic indentation" c-toggle-syntactic-indentation t]
288 ["Auto newline" c-toggle-auto-state t]
289 ["Hungry delete" c-toggle-hungry-state t])
293 ;; We don't require the outline package, but we configure it a bit anyway.
294 (cc-bytecomp-defvar outline-level)
296 (defun c-common-init (mode)
297 ;; Common initializations for all modes.
298 (setq c-buffer-is-cc-mode mode)
300 ;; these variables should always be buffer local; they do not affect
301 ;; indentation style.
302 (make-local-variable 'parse-sexp-ignore-comments)
303 (make-local-variable 'indent-line-function)
304 (make-local-variable 'indent-region-function)
305 (make-local-variable 'outline-regexp)
306 (make-local-variable 'outline-level)
307 (make-local-variable 'normal-auto-fill-function)
308 (make-local-variable 'comment-start)
309 (make-local-variable 'comment-end)
310 (make-local-variable 'comment-column)
311 (make-local-variable 'comment-start-skip)
312 (make-local-variable 'comment-multi-line)
313 (make-local-variable 'paragraph-start)
314 (make-local-variable 'paragraph-separate)
315 (make-local-variable 'paragraph-ignore-fill-prefix)
316 (make-local-variable 'adaptive-fill-mode)
317 (make-local-variable 'adaptive-fill-regexp)
318 (make-local-variable 'imenu-generic-expression) ;set in the mode functions
321 (and (boundp 'comment-line-break-function)
323 (make-local-variable 'comment-line-break-function)
324 (setq comment-line-break-function
325 'c-indent-new-comment-line)))
327 ;; now set their values
328 (setq parse-sexp-ignore-comments t
329 indent-line-function 'c-indent-line
330 indent-region-function 'c-indent-region
331 outline-regexp "[^#\n\^M]"
332 outline-level 'c-outline-level
333 normal-auto-fill-function 'c-do-auto-fill
335 comment-start-skip "/\\*+ *\\|//+ *"
336 comment-multi-line t)
338 ;; Install `c-fill-paragraph' on `fill-paragraph-function' so that a
339 ;; direct call to `fill-paragraph' behaves better. This still
340 ;; doesn't work with filladapt but it's better than nothing.
341 (make-local-variable 'fill-paragraph-function)
342 (setq fill-paragraph-function 'c-fill-paragraph)
344 ;; Set `require-final-newline' only if we should.
345 (let ((rfn (assq mode c-require-final-newline)))
347 (make-local-variable 'require-final-newline)
348 (setq require-final-newline (cdr rfn))))
350 ;; Fix keyword regexps.
351 (c-init-language-vars)
353 ;; now set the mode style based on c-default-style
354 (let ((style (if (stringp c-default-style)
356 (or (cdr (assq mode c-default-style))
357 (cdr (assq 'other c-default-style))
359 ;; Override style variables if `c-old-style-variable-behavior' is
360 ;; set. Also override if we are using global style variables,
361 ;; have already initialized a style once, and are switching to a
362 ;; different style. (It's doubtful whether this is desirable, but
363 ;; the whole situation with nonlocal style variables is a bit
364 ;; awkward. It's at least the most compatible way with the old
365 ;; style init procedure.)
366 (c-set-style style (not (or c-old-style-variable-behavior
367 (and (not c-style-variables-are-local-p)
369 (not (string-equal c-indentation-style
371 (c-setup-paragraph-variables)
373 ;; we have to do something special for c-offsets-alist so that the
374 ;; buffer local value has its own alist structure.
375 (setq c-offsets-alist (copy-alist c-offsets-alist))
377 ;; setup the comment indent variable in a Emacs version portable way
378 (make-local-variable 'comment-indent-function)
379 (setq comment-indent-function 'c-comment-indent)
381 ;; add menus to menubar
382 (easy-menu-add (c-mode-menu mode-name))
384 ;; put auto-hungry designators onto minor-mode-alist, but only once
385 (or (assq 'c-auto-hungry-string minor-mode-alist)
386 (setq minor-mode-alist
387 (cons '(c-auto-hungry-string c-auto-hungry-string)
390 ;; Install the function that ensures `c-state-cache' doesn't become
392 (make-local-variable 'after-change-functions)
393 (add-hook 'after-change-functions 'c-check-state-cache))
395 (defun c-postprocess-file-styles ()
396 "Function that post processes relevant file local variables.
397 Currently, this function simply applies any style and offset settings
398 found in the file's Local Variable list. It first applies any style
399 setting found in `c-file-style', then it applies any offset settings
400 it finds in `c-file-offsets'.
402 Note that the style variables are always made local to the buffer."
403 ;; apply file styles and offsets
404 (when c-buffer-is-cc-mode
405 (if (or c-file-style c-file-offsets)
406 (c-make-styles-buffer-local t))
408 (c-set-style c-file-style))
412 (let ((langelem (car langentry))
413 (offset (cdr langentry)))
414 (c-set-offset langelem offset)))
417 (add-hook 'hack-local-variables-hook 'c-postprocess-file-styles)
422 (defvar c-mode-abbrev-table nil
423 "Abbreviation table used in c-mode buffers.")
424 (c-define-abbrev-table 'c-mode-abbrev-table
425 '(("else" "else" c-electric-continued-statement 0)
426 ("while" "while" c-electric-continued-statement 0)))
428 (defvar c-mode-map ()
429 "Keymap used in c-mode buffers.")
432 (setq c-mode-map (c-make-inherited-keymap))
433 ;; add bindings which are only useful for C
434 (define-key c-mode-map "\C-c\C-e" 'c-macro-expand)
437 (easy-menu-define c-c-menu c-mode-map "C Mode Commands"
442 "Major mode for editing K&R and ANSI C code.
443 To submit a problem report, enter `\\[c-submit-bug-report]' from a
444 c-mode buffer. This automatically sets up a mail buffer with version
445 information already added. You just need to add a description of the
446 problem, including a reproducible test case and send the message.
448 To see what version of CC Mode you are running, enter `\\[c-version]'.
450 The hook variable `c-mode-hook' is run with no args, if that value is
451 bound and has a non-nil value. Also the hook `c-mode-common-hook' is
457 (kill-all-local-variables)
458 (c-initialize-cc-mode)
459 (set-syntax-table c-mode-syntax-table)
460 (setq major-mode 'c-mode
462 local-abbrev-table c-mode-abbrev-table
464 (use-local-map c-mode-map)
465 (c-common-init 'c-mode)
466 (cc-imenu-init cc-imenu-c-generic-expression)
467 (run-hooks 'c-mode-common-hook)
468 (run-hooks 'c-mode-hook)
474 (defvar c++-mode-abbrev-table nil
475 "Abbreviation table used in c++-mode buffers.")
476 (c-define-abbrev-table 'c++-mode-abbrev-table
477 '(("else" "else" c-electric-continued-statement 0)
478 ("while" "while" c-electric-continued-statement 0)
479 ("catch" "catch" c-electric-continued-statement 0)))
481 (defvar c++-mode-map ()
482 "Keymap used in c++-mode buffers.")
485 (setq c++-mode-map (c-make-inherited-keymap))
486 ;; add bindings which are only useful for C++
487 (define-key c++-mode-map "\C-c\C-e" 'c-macro-expand)
488 (define-key c++-mode-map "\C-c:" 'c-scope-operator)
489 (define-key c++-mode-map "<" 'c-electric-lt-gt)
490 (define-key c++-mode-map ">" 'c-electric-lt-gt))
492 (easy-menu-define c-c++-menu c++-mode-map "C++ Mode Commands"
497 "Major mode for editing C++ code.
498 To submit a problem report, enter `\\[c-submit-bug-report]' from a
499 c++-mode buffer. This automatically sets up a mail buffer with
500 version information already added. You just need to add a description
501 of the problem, including a reproducible test case, and send the
504 To see what version of CC Mode you are running, enter `\\[c-version]'.
506 The hook variable `c++-mode-hook' is run with no args, if that
507 variable is bound and has a non-nil value. Also the hook
508 `c-mode-common-hook' is run first.
513 (kill-all-local-variables)
514 (c-initialize-cc-mode)
515 (set-syntax-table c++-mode-syntax-table)
516 (setq major-mode 'c++-mode
518 local-abbrev-table c++-mode-abbrev-table
520 (use-local-map c++-mode-map)
521 (c-common-init 'c++-mode)
522 (cc-imenu-init cc-imenu-c++-generic-expression)
523 (run-hooks 'c-mode-common-hook)
524 (run-hooks 'c++-mode-hook)
528 ;; Support for Objective-C
530 (defvar objc-mode-abbrev-table nil
531 "Abbreviation table used in objc-mode buffers.")
532 (c-define-abbrev-table 'objc-mode-abbrev-table
533 '(("else" "else" c-electric-continued-statement 0)
534 ("while" "while" c-electric-continued-statement 0)))
536 (defvar objc-mode-map ()
537 "Keymap used in objc-mode buffers.")
540 (setq objc-mode-map (c-make-inherited-keymap))
541 ;; add bindings which are only useful for Objective-C
542 (define-key objc-mode-map "\C-c\C-e" 'c-macro-expand))
544 (easy-menu-define c-objc-menu objc-mode-map "ObjC Mode Commands"
545 (c-mode-menu "ObjC"))
549 "Major mode for editing Objective C code.
550 To submit a problem report, enter `\\[c-submit-bug-report]' from an
551 objc-mode buffer. This automatically sets up a mail buffer with
552 version information already added. You just need to add a description
553 of the problem, including a reproducible test case, and send the
556 To see what version of CC Mode you are running, enter `\\[c-version]'.
558 The hook variable `objc-mode-hook' is run with no args, if that value
559 is bound and has a non-nil value. Also the hook `c-mode-common-hook'
565 (kill-all-local-variables)
566 (c-initialize-cc-mode)
567 (set-syntax-table objc-mode-syntax-table)
568 (setq major-mode 'objc-mode
570 local-abbrev-table objc-mode-abbrev-table
572 (use-local-map objc-mode-map)
573 (c-common-init 'objc-mode)
574 (cc-imenu-init cc-imenu-objc-generic-expression)
575 (run-hooks 'c-mode-common-hook)
576 (run-hooks 'objc-mode-hook)
582 (defvar java-mode-abbrev-table nil
583 "Abbreviation table used in java-mode buffers.")
584 (c-define-abbrev-table 'java-mode-abbrev-table
585 '(("else" "else" c-electric-continued-statement 0)
586 ("while" "while" c-electric-continued-statement 0)
587 ("catch" "catch" c-electric-continued-statement 0)
588 ("finally" "finally" c-electric-continued-statement 0)))
590 (defvar java-mode-map ()
591 "Keymap used in java-mode buffers.")
594 (setq java-mode-map (c-make-inherited-keymap))
595 ;; add bindings which are only useful for Java
598 (easy-menu-define c-java-menu java-mode-map "Java Mode Commands"
599 (c-mode-menu "Java"))
603 "Major mode for editing Java code.
604 To submit a problem report, enter `\\[c-submit-bug-report]' from a
605 java-mode buffer. This automatically sets up a mail buffer with
606 version information already added. You just need to add a description
607 of the problem, including a reproducible test case and send the
610 To see what version of CC Mode you are running, enter `\\[c-version]'.
612 The hook variable `java-mode-hook' is run with no args, if that value
613 is bound and has a non-nil value. Also the common hook
614 `c-mode-common-hook' is run first. Note that this mode automatically
615 sets the \"java\" style before calling any hooks so be careful if you
616 set styles in `c-mode-common-hook'.
621 (kill-all-local-variables)
622 (c-initialize-cc-mode)
623 (set-syntax-table java-mode-syntax-table)
624 (setq major-mode 'java-mode
626 local-abbrev-table java-mode-abbrev-table
628 (use-local-map java-mode-map)
629 (c-common-init 'java-mode)
630 (cc-imenu-init cc-imenu-java-generic-expression)
631 (run-hooks 'c-mode-common-hook)
632 (run-hooks 'java-mode-hook)
636 ;; Support for CORBA's IDL language
638 (defvar idl-mode-abbrev-table nil
639 "Abbreviation table used in idl-mode buffers.")
640 (c-define-abbrev-table 'idl-mode-abbrev-table nil)
642 (defvar idl-mode-map ()
643 "Keymap used in idl-mode buffers.")
646 (setq idl-mode-map (c-make-inherited-keymap))
647 ;; add bindings which are only useful for IDL
650 (easy-menu-define c-idl-menu idl-mode-map "IDL Mode Commands"
655 "Major mode for editing CORBA's IDL code.
656 To submit a problem report, enter `\\[c-submit-bug-report]' from an
657 idl-mode buffer. This automatically sets up a mail buffer with
658 version information already added. You just need to add a description
659 of the problem, including a reproducible test case, and send the
662 To see what version of CC Mode you are running, enter `\\[c-version]'.
664 The hook variable `idl-mode-hook' is run with no args, if that
665 variable is bound and has a non-nil value. Also the hook
666 `c-mode-common-hook' is run first.
671 (kill-all-local-variables)
672 (c-initialize-cc-mode)
673 (set-syntax-table idl-mode-syntax-table)
674 (setq major-mode 'idl-mode
676 local-abbrev-table idl-mode-abbrev-table)
677 (use-local-map idl-mode-map)
678 (c-common-init 'idl-mode)
679 ;;(cc-imenu-init cc-imenu-idl-generic-expression) ;FIXME
680 (run-hooks 'c-mode-common-hook)
681 (run-hooks 'idl-mode-hook)
687 (defvar pike-mode-abbrev-table nil
688 "Abbreviation table used in pike-mode buffers.")
689 (c-define-abbrev-table 'pike-mode-abbrev-table
690 '(("else" "else" c-electric-continued-statement 0)
691 ("while" "while" c-electric-continued-statement 0)))
693 (defvar pike-mode-map ()
694 "Keymap used in pike-mode buffers.")
697 (setq pike-mode-map (c-make-inherited-keymap))
698 ;; additional bindings
699 (define-key pike-mode-map "\C-c\C-e" 'c-macro-expand))
701 (easy-menu-define c-pike-menu pike-mode-map "Pike Mode Commands"
702 (c-mode-menu "Pike"))
706 "Major mode for editing Pike code.
707 To submit a problem report, enter `\\[c-submit-bug-report]' from a
708 pike-mode buffer. This automatically sets up a mail buffer with
709 version information already added. You just need to add a description
710 of the problem, including a reproducible test case, and send the
713 To see what version of CC Mode you are running, enter `\\[c-version]'.
715 The hook variable `pike-mode-hook' is run with no args, if that value
716 is bound and has a non-nil value. Also the common hook
717 `c-mode-common-hook' is run first.
722 (kill-all-local-variables)
723 (c-initialize-cc-mode)
724 (set-syntax-table pike-mode-syntax-table)
725 (setq major-mode 'pike-mode
727 local-abbrev-table pike-mode-abbrev-table
729 (use-local-map pike-mode-map)
730 (c-common-init 'pike-mode)
731 ;;(cc-imenu-init cc-imenu-pike-generic-expression) ;FIXME
732 (run-hooks 'c-mode-common-hook)
733 (run-hooks 'pike-mode-hook)
739 (defconst c-mode-help-address
740 "bug-cc-mode@gnu.org"
741 "Address(es) for CC Mode bug reports.")
744 "Echo the current version of CC Mode in the minibuffer."
746 (message "Using CC Mode version %s" c-version)
747 (c-keep-region-active))
749 (defvar c-prepare-bug-report-hooks nil)
751 ;; Dynamic variables used by reporter.
752 (defvar reporter-prompt-for-summary-p)
753 (defvar reporter-dont-compact-list)
755 (defun c-submit-bug-report ()
756 "Submit via mail a bug report on CC Mode."
760 (let ((reporter-prompt-for-summary-p t)
761 (reporter-dont-compact-list '(c-offsets-alist))
762 (style c-indentation-style)
763 (c-features c-emacs-features))
765 (if (y-or-n-p "Do you want to submit a report on CC Mode? ")
768 (reporter-submit-bug-report
770 (concat "CC Mode " c-version " ("
771 (cond ((eq major-mode 'c++-mode) "C++")
772 ((eq major-mode 'c-mode) "C")
773 ((eq major-mode 'objc-mode) "ObjC")
774 ((eq major-mode 'java-mode) "Java")
775 ((eq major-mode 'idl-mode) "IDL")
776 ((eq major-mode 'pike-mode) "Pike")
780 ;; report only the vars that affect indentation
783 c-electric-pound-behavior
784 c-indent-comments-syntactically-p
789 parse-sexp-ignore-comments
790 ;; A brain-damaged XEmacs only variable that, if
791 ;; set to nil can cause all kinds of chaos.
792 signal-error-on-buffer-boundary
793 ;; Variables that affect line breaking and comments.
801 adaptive-fill-regexp)
803 (delq 'c-special-indent-hook vars)
804 (mapcar (lambda (var) (unless (boundp var) (delq var vars)))
805 '(signal-error-on-buffer-boundary
807 defun-prompt-regexp))
810 (run-hooks 'c-prepare-bug-report-hooks)
811 (insert (format "Buffer Style: %s\n\nc-emacs-features: %s\n"
812 style c-features)))))))
815 (cc-provide 'cc-mode)
816 ;;; cc-mode.el ends here