(comment-indent): Be more careful when inserting
[emacs.git] / lisp / progmodes / cc-mode.el
blob94eb6fcaea4dd41e1f3502b10b9af01de1fd3776
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 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!
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)
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))
126 ;;;###autoload
127 (defun c-initialize-cc-mode ()
128 (setq c-buffer-is-cc-mode t)
129 (let ((initprop 'cc-mode-is-initialized)
130 c-initialization-ok)
131 (unless (get 'c-initialize-cc-mode initprop)
132 (unwind-protect
133 (progn
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)))
147 ;; Common routines
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)))
153 (cond
154 ;; XEmacs 19 & 20
155 ((fboundp 'set-keymap-parents)
156 (set-keymap-parents map c-mode-base-map))
157 ;; Emacs 19
158 ((fboundp 'set-keymap-parent)
159 (set-keymap-parent map c-mode-base-map))
160 ;; incompatible
161 (t (error "CC Mode is incompatible with this version of Emacs")))
162 map))
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)))
170 (while defs
171 (condition-case nil
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)))))
177 (if c-mode-base-map
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
199 'c-end-of-statement
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
217 'c-indent-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)
266 (let ((m
267 '(["Comment Out Region" comment-region (c-fn-region-is-active-p)]
268 ["Uncomment Region"
269 (comment-region (region-beginning) (region-end) '(4))
270 (c-fn-region-is-active-p)]
271 ["Fill Comment Paragraph" c-fill-paragraph t]
272 "----"
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]
281 "----"
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)]
285 "----"
286 ("Toggle..."
287 ["Syntactic indentation" c-toggle-syntactic-indentation t]
288 ["Auto newline" c-toggle-auto-state t]
289 ["Hungry delete" c-toggle-hungry-state t])
291 (cons modestr m)))
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
320 ;; X/Emacs 20 only
321 (and (boundp 'comment-line-break-function)
322 (progn
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
334 comment-column 32
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)))
346 (when rfn
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)
355 c-default-style
356 (or (cdr (assq mode c-default-style))
357 (cdr (assq 'other c-default-style))
358 "gnu"))))
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)
368 c-indentation-style
369 (not (string-equal c-indentation-style
370 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)
388 minor-mode-alist)))
390 ;; Install the function that ensures `c-state-cache' doesn't become
391 ;; invalid.
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))
407 (and c-file-style
408 (c-set-style c-file-style))
409 (and c-file-offsets
410 (mapcar
411 (lambda (langentry)
412 (let ((langelem (car langentry))
413 (offset (cdr langentry)))
414 (c-set-offset langelem offset)))
415 c-file-offsets))))
417 (add-hook 'hack-local-variables-hook 'c-postprocess-file-styles)
420 ;; Support for C
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.")
430 (if c-mode-map
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"
438 (c-mode-menu "C"))
440 ;;;###autoload
441 (defun c-mode ()
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
452 run first.
454 Key bindings:
455 \\{c-mode-map}"
456 (interactive)
457 (kill-all-local-variables)
458 (c-initialize-cc-mode)
459 (set-syntax-table c-mode-syntax-table)
460 (setq major-mode 'c-mode
461 mode-name "C"
462 local-abbrev-table c-mode-abbrev-table
463 abbrev-mode t)
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)
469 (c-update-modeline))
472 ;; Support for C++
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.")
483 (if c++-mode-map
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"
493 (c-mode-menu "C++"))
495 ;;;###autoload
496 (defun c++-mode ()
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
502 message.
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.
510 Key bindings:
511 \\{c++-mode-map}"
512 (interactive)
513 (kill-all-local-variables)
514 (c-initialize-cc-mode)
515 (set-syntax-table c++-mode-syntax-table)
516 (setq major-mode 'c++-mode
517 mode-name "C++"
518 local-abbrev-table c++-mode-abbrev-table
519 abbrev-mode t)
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)
525 (c-update-modeline))
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.")
538 (if objc-mode-map
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"))
547 ;;;###autoload
548 (defun objc-mode ()
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
554 message.
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'
560 is run first.
562 Key bindings:
563 \\{objc-mode-map}"
564 (interactive)
565 (kill-all-local-variables)
566 (c-initialize-cc-mode)
567 (set-syntax-table objc-mode-syntax-table)
568 (setq major-mode 'objc-mode
569 mode-name "ObjC"
570 local-abbrev-table objc-mode-abbrev-table
571 abbrev-mode t)
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)
577 (c-update-modeline))
580 ;; Support for Java
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.")
592 (if java-mode-map
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"))
601 ;;;###autoload
602 (defun java-mode ()
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
608 message.
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'.
618 Key bindings:
619 \\{java-mode-map}"
620 (interactive)
621 (kill-all-local-variables)
622 (c-initialize-cc-mode)
623 (set-syntax-table java-mode-syntax-table)
624 (setq major-mode 'java-mode
625 mode-name "Java"
626 local-abbrev-table java-mode-abbrev-table
627 abbrev-mode t)
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)
633 (c-update-modeline))
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.")
644 (if idl-mode-map
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"
651 (c-mode-menu "IDL"))
653 ;;;###autoload
654 (defun idl-mode ()
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
660 message.
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.
668 Key bindings:
669 \\{idl-mode-map}"
670 (interactive)
671 (kill-all-local-variables)
672 (c-initialize-cc-mode)
673 (set-syntax-table idl-mode-syntax-table)
674 (setq major-mode 'idl-mode
675 mode-name "IDL"
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)
682 (c-update-modeline))
685 ;; Support for Pike
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.")
695 (if pike-mode-map
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"))
704 ;;;###autoload
705 (defun pike-mode ()
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
711 message.
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.
719 Key bindings:
720 \\{pike-mode-map}"
721 (interactive)
722 (kill-all-local-variables)
723 (c-initialize-cc-mode)
724 (set-syntax-table pike-mode-syntax-table)
725 (setq major-mode 'pike-mode
726 mode-name "Pike"
727 local-abbrev-table pike-mode-abbrev-table
728 abbrev-mode t)
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)
734 (c-update-modeline))
737 ;; bug reporting
739 (defconst c-mode-help-address
740 "bug-cc-mode@gnu.org"
741 "Address(es) for CC Mode bug reports.")
743 (defun c-version ()
744 "Echo the current version of CC Mode in the minibuffer."
745 (interactive)
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."
757 (interactive)
758 (require 'reporter)
759 ;; load in reporter
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))
764 (and
765 (if (y-or-n-p "Do you want to submit a report on CC Mode? ")
766 t (message "") nil)
767 (require 'reporter)
768 (reporter-submit-bug-report
769 c-mode-help-address
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")
778 ")")
779 (let ((vars (append
780 ;; report only the vars that affect indentation
781 c-style-variables
782 '(c-delete-function
783 c-electric-pound-behavior
784 c-indent-comments-syntactically-p
785 c-tab-always-indent
786 defun-prompt-regexp
787 tab-width
788 comment-column
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.
794 auto-fill-function
795 filladapt-mode
796 comment-multi-line
797 comment-start-skip
798 fill-prefix
799 paragraph-start
800 adaptive-fill-mode
801 adaptive-fill-regexp)
802 nil)))
803 (delq 'c-special-indent-hook vars)
804 (mapcar (lambda (var) (unless (boundp var) (delq var vars)))
805 '(signal-error-on-buffer-boundary
806 filladapt-mode
807 defun-prompt-regexp))
808 vars)
809 (lambda ()
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