1 ;;; cc-langs.el --- specific language support for CC Mode
3 ;; Copyright (C) 1985,87,92,93,94,95,96,97 Free Software Foundation, Inc.
5 ;; Authors: 1992-1997 Barry A. Warsaw
6 ;; 1987 Dave Detlefs and Stewart Clamen
7 ;; 1985 Richard M. Stallman
8 ;; Maintainer: cc-mode-help@python.org
9 ;; Created: 22-Apr-1997 (split from cc-mode.el)
11 ;; Keywords: c languages oop
13 ;; This file is part of GNU Emacs.
15 ;; GNU Emacs is free software; you can redistribute it and/or modify
16 ;; it under the terms of the GNU General Public License as published by
17 ;; the Free Software Foundation; either version 2, or (at your option)
20 ;; GNU Emacs is distributed in the hope that it will be useful,
21 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
22 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 ;; GNU General Public License for more details.
25 ;; You should have received a copy of the GNU General Public License
26 ;; along with GNU Emacs; see the file COPYING. If not, write to the
27 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
28 ;; Boston, MA 02111-1307, USA.
35 ;; Regular expressions and other values which must be parameterized on
36 ;; a per-language basis.
38 ;; Keywords defining protection levels
39 (defconst c-protection-key "\\<\\(public\\|protected\\|private\\)\\>")
41 ;; Regex describing a `symbol' in all languages. We cannot use just
42 ;; `word' syntax class since `_' cannot be in word class. Putting
43 ;; underscore in word class breaks forward word movement behavior that
44 ;; users are familiar with. Besides, this runs counter to Emacs
47 ;; I suspect this definition isn't correct in light of Java's
48 ;; definition of a symbol as being Unicode. I know so little about
49 ;; I18N (except how to sound cool and say I18N :-) that I'm willing to
50 ;; punt on this for now.
52 (defconst c-symbol-key "[_a-zA-Z]\\(\\w\\|\\s_\\)*")
55 ;; keywords introducing class definitions. language specific
56 (defconst c-C-class-key "\\(struct\\|union\\)")
57 (defconst c-C++-class-key "\\(class\\|struct\\|union\\)")
59 (defconst c-ObjC-class-key
61 "@\\(interface\\|implementation\\)\\s +"
62 c-symbol-key ;name of the class
63 "\\(\\s *:\\s *" c-symbol-key "\\)?" ;maybe followed by the superclass
64 "\\(\\s *<[^>]+>\\)?" ;and maybe the adopted protocols list
67 (defconst c-Java-class-key
69 "\\(" c-protection-key "\\s +\\)?"
70 "\\(interface\\|class\\)\\s +"
71 c-symbol-key ;name of the class
72 "\\(\\s *extends\\s *" c-symbol-key "\\)?" ;maybe followed by superclass
73 ;;"\\(\\s *implements *[^{]+{\\)?" ;maybe the adopted protocols list
76 (defvar c-class-key c-C-class-key)
77 (make-variable-buffer-local 'c-class-key)
80 ;; regexp describing access protection clauses. language specific
81 (defvar c-access-key nil)
82 (make-variable-buffer-local 'c-access-key)
83 (defconst c-C++-access-key (concat c-protection-key "[ \t]*:"))
84 (defconst c-ObjC-access-key (concat "@" c-protection-key))
85 (defconst c-Java-access-key nil)
88 ;; keywords introducing conditional blocks
89 (defconst c-C-conditional-key nil)
90 (defconst c-C++-conditional-key nil)
91 (defconst c-Java-conditional-key nil)
93 (let ((all-kws "for\\|if\\|do\\|else\\|while\\|switch")
94 (exc-kws "\\|try\\|catch")
95 (thr-kws "\\|finally\\|synchronized")
98 (setq c-C-conditional-key (concat front all-kws back)
99 c-C++-conditional-key (concat front all-kws exc-kws back)
100 c-Java-conditional-key (concat front all-kws exc-kws thr-kws back)))
102 (defvar c-conditional-key c-C-conditional-key)
103 (make-variable-buffer-local 'c-conditional-key)
106 ;; keywords describing method definition introductions
107 (defvar c-method-key nil)
108 (make-variable-buffer-local 'c-method-key)
110 (defconst c-ObjC-method-key
113 "\\(([^)]*)\\)?" ; return type
114 ;; \\s- in objc syntax table does not include \n
115 ;; since it is considered the end of //-comments.
116 "[ \t\n]*" c-symbol-key))
118 (defconst c-Java-method-key
121 "\\(([^)]*)\\)?" ; return type
122 ;; \\s- in java syntax table does not include \n
123 ;; since it is considered the end of //-comments.
124 "[ \t\n]*" c-symbol-key))
127 ;; comment starter definitions for various languages. language specific
128 (defconst c-C++-comment-start-regexp "/[/*]")
129 ;; We need to match all 3 Java style comments
130 ;; 1) Traditional C block; 2) javadoc /** ...; 3) C++ style
131 (defconst c-Java-comment-start-regexp "/\\(/\\|[*][*]?\\)")
132 (defvar c-comment-start-regexp c-C++-comment-start-regexp)
133 (make-variable-buffer-local 'c-comment-start-regexp)
137 ;; Regexp describing a switch's case or default label for all languages
138 (defconst c-switch-label-key "\\(\\(case[( \t]+\\S .*\\)\\|default[ \t]*\\):")
139 ;; Regexp describing any label.
140 (defconst c-label-key (concat c-symbol-key ":\\([^:]\\|$\\)"))
142 ;; Regexp describing class inheritance declarations. TBD: this should
143 ;; be language specific, and only makes sense for C++
144 (defconst c-inher-key
145 (concat "\\(\\<static\\>\\s +\\)?"
146 c-C++-class-key "[ \t]+" c-symbol-key
147 "\\([ \t]*:[ \t]*\\)\\s *[^;]"))
149 ;; Regexp describing C++ base classes in a derived class definition.
150 ;; TBD: this should be language specific, and only makes sense for C++
151 (defvar c-baseclass-key
153 ":?[ \t]*\\(virtual[ \t]+\\)?\\("
154 c-protection-key "[ \t]+\\)" c-symbol-key))
155 (make-variable-buffer-local 'c-baseclass-key)
157 ;; Regexp describing friend declarations in C++ classes.
158 (defconst c-C++-friend-key
159 "friend[ \t]+\\|template[ \t]*<.+>[ \t]*friend[ \t]+")
161 ;; Regexp describing Java inheritance and throws clauses.
162 (defconst c-Java-special-key "\\(implements\\|extends\\|throws\\)[^_]")
164 ;; Regexp describing the beginning of a Java top-level definition.
165 (defconst c-Java-defun-prompt-regexp
166 "^[ \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]*\\)+\\)?\\s-*")
170 ;; internal state variables
172 ;; Internal state of hungry delete key feature
173 (defvar c-hungry-delete-key nil)
174 (make-variable-buffer-local 'c-hungry-delete-key)
176 ;; Internal state of auto newline feature.
177 (defvar c-auto-newline nil)
178 (make-variable-buffer-local 'c-auto-newline)
180 ;; Internal auto-newline/hungry-delete designation string for mode line.
181 (defvar c-auto-hungry-string nil)
182 (make-variable-buffer-local 'c-auto-hungry-string)
184 ;; Non-nil means K&R style argument declarations are valid.
185 (defvar c-recognize-knr-p t)
186 (make-variable-buffer-local 'c-recognize-knr-p)
190 (defun c-use-java-style ()
191 "Institutes `java' indentation style.
192 For use with the variable `java-mode-hook'."
193 (c-set-style "java"))
195 (defun c-common-init ()
196 ;; Common initializations for all modes.
197 ;; these variables should always be buffer local; they do not affect
198 ;; indentation style.
199 (make-local-variable 'paragraph-start)
200 (make-local-variable 'paragraph-separate)
201 (make-local-variable 'paragraph-ignore-fill-prefix)
202 (make-local-variable 'require-final-newline)
203 (make-local-variable 'parse-sexp-ignore-comments)
204 (make-local-variable 'indent-line-function)
205 (make-local-variable 'indent-region-function)
206 (make-local-variable 'comment-start)
207 (make-local-variable 'comment-end)
208 (make-local-variable 'comment-column)
209 (make-local-variable 'comment-start-skip)
210 (make-local-variable 'comment-multi-line)
211 (make-local-variable 'outline-regexp)
212 (make-local-variable 'outline-level)
213 (make-local-variable 'adaptive-fill-regexp)
214 (make-local-variable 'imenu-generic-expression) ;set in the mode functions
216 (and (boundp 'comment-line-break-function)
217 (make-local-variable 'comment-line-break-function))
218 ;; Emacs 19.30 and beyond only, AFAIK
219 (if (boundp 'fill-paragraph-function)
221 (make-local-variable 'fill-paragraph-function)
222 (setq fill-paragraph-function 'c-fill-paragraph)))
223 ;; now set their values
224 (setq paragraph-start (concat page-delimiter "\\|$")
225 paragraph-separate paragraph-start
226 paragraph-ignore-fill-prefix t
227 require-final-newline t
228 parse-sexp-ignore-comments t
229 indent-line-function 'c-indent-line
230 indent-region-function 'c-indent-region
231 outline-regexp "[^#\n\^M]"
232 outline-level 'c-outline-level
234 comment-start-skip "/\\*+ *\\|// *"
235 comment-multi-line nil
236 comment-line-break-function 'c-comment-line-break-function
237 adaptive-fill-regexp nil)
238 ;; we have to do something special for c-offsets-alist so that the
239 ;; buffer local value has its own alist structure.
240 (setq c-offsets-alist (copy-alist c-offsets-alist))
241 ;; setup the comment indent variable in a Emacs version portable way
242 ;; ignore any byte compiler warnings you might get here
243 (make-local-variable 'comment-indent-function)
244 (setq comment-indent-function 'c-comment-indent)
245 ;; add menus to menubar
246 (easy-menu-add (c-mode-menu mode-name))
247 ;; put auto-hungry designators onto minor-mode-alist, but only once
248 (or (assq 'c-auto-hungry-string minor-mode-alist)
249 (setq minor-mode-alist
250 (cons '(c-auto-hungry-string c-auto-hungry-string)
253 (defun c-postprocess-file-styles ()
254 "Function that post processes relevant file local variables.
255 Currently, this function simply applies any style and offset settings
256 found in the file's Local Variable list. It first applies any style
257 setting found in `c-file-style', then it applies any offset settings
258 it finds in `c-file-offsets'."
259 ;; apply file styles and offsets
261 (c-set-style c-file-style))
266 (let ((langelem (car langentry))
267 (offset (cdr langentry)))
268 (c-set-offset langelem offset)
272 (add-hook 'hack-local-variables-hook 'c-postprocess-file-styles)
276 (defun c-make-inherited-keymap ()
277 (let ((map (make-sparse-keymap)))
280 ((fboundp 'set-keymap-parents)
281 (set-keymap-parents map c-mode-base-map))
283 ((fboundp 'set-keymap-parent)
284 (set-keymap-parent map c-mode-base-map))
286 (t (error "CC Mode is incompatible with this version of Emacs")))
289 (defun c-populate-syntax-table (table)
290 ;; Populate the syntax TABLE
291 ;; DO NOT TRY TO SET _ (UNDERSCORE) TO WORD CLASS!
292 (modify-syntax-entry ?_ "_" table)
293 (modify-syntax-entry ?\\ "\\" table)
294 (modify-syntax-entry ?+ "." table)
295 (modify-syntax-entry ?- "." table)
296 (modify-syntax-entry ?= "." table)
297 (modify-syntax-entry ?% "." table)
298 (modify-syntax-entry ?< "." table)
299 (modify-syntax-entry ?> "." table)
300 (modify-syntax-entry ?& "." table)
301 (modify-syntax-entry ?| "." table)
302 (modify-syntax-entry ?\' "\"" table)
303 ;; Set up block and line oriented comments. The new C standard
304 ;; mandates both comment styles even in C, so since all languages
305 ;; now require dual comments, we make this the default.
308 ((memq '8-bit c-emacs-features)
309 (modify-syntax-entry ?/ ". 1456" table)
310 (modify-syntax-entry ?* ". 23" table))
312 ((memq '1-bit c-emacs-features)
313 (modify-syntax-entry ?/ ". 124b" table)
314 (modify-syntax-entry ?* ". 23" table))
316 (t (error "CC Mode is incompatible with this version of Emacs"))
318 (modify-syntax-entry ?\n "> b" table)
319 ;; Give CR the same syntax as newline, for selective-display
320 (modify-syntax-entry ?\^m "> b" table))
323 (defvar c-mode-base-map ()
324 "Keymap shared by all CC Mode related modes.")
328 ;; TBD: should we even worry about naming this keymap. My vote: no,
329 ;; because Emacs and XEmacs do it differently.
330 (setq c-mode-base-map (make-sparse-keymap))
331 ;; put standard keybindings into MAP
332 ;; the following mappings correspond more or less directly to BOCM
333 (define-key c-mode-base-map "{" 'c-electric-brace)
334 (define-key c-mode-base-map "}" 'c-electric-brace)
335 (define-key c-mode-base-map ";" 'c-electric-semi&comma)
336 (define-key c-mode-base-map "#" 'c-electric-pound)
337 (define-key c-mode-base-map ":" 'c-electric-colon)
338 ;; Lucid Emacs 19.9 defined these two, the second of which was
340 ;; (define-key c-mode-base-map "\e{" 'c-insert-braces)
341 ;; Commented out electric square brackets because nobody likes them.
342 ;; (define-key c-mode-base-map "[" 'c-insert-brackets)
343 (define-key c-mode-base-map "\C-c\C-m" 'c-mark-function)
344 (define-key c-mode-base-map "\e\C-q" 'c-indent-exp)
345 (define-key c-mode-base-map "\ea" 'c-beginning-of-statement)
346 (define-key c-mode-base-map "\ee" 'c-end-of-statement)
347 (define-key c-mode-base-map "\C-c\C-n" 'c-forward-conditional)
348 (define-key c-mode-base-map "\C-c\C-p" 'c-backward-conditional)
349 (define-key c-mode-base-map "\C-c\C-u" 'c-up-conditional)
350 (define-key c-mode-base-map "\t" 'c-indent-command)
351 ;; Caution! Enter here at your own risk. We are trying to support
352 ;; several behaviors and it gets disgusting. :-(
354 ;; In XEmacs 19, Emacs 19, and Emacs 20, we use this to bind
355 ;; backwards deletion behavior to DEL, which both Delete and
356 ;; Backspace get translated to. There's no way to separate this
357 ;; behavior in a clean way, so deal with it! Besides, it's been
358 ;; this way since the dawn of BOCM.
359 (if (not (boundp 'delete-key-deletes-forward))
360 (define-key c-mode-base-map "\177" 'c-electric-backspace)
361 ;; However, XEmacs 20 actually achieved enlightenment. It is
362 ;; possible to sanely define both backward and forward deletion
363 ;; behavior under X separately (TTYs are forever beyond hope, but
364 ;; who cares? XEmacs 20 does the right thing with these too).
365 (define-key c-mode-base-map [delete] 'c-electric-delete)
366 (define-key c-mode-base-map [backspace] 'c-electric-backspace))
367 ;; these are new keybindings, with no counterpart to BOCM
368 (define-key c-mode-base-map "," 'c-electric-semi&comma)
369 (define-key c-mode-base-map "*" 'c-electric-star)
370 (define-key c-mode-base-map "/" 'c-electric-slash)
371 (define-key c-mode-base-map "\C-c\C-q" 'c-indent-defun)
372 (define-key c-mode-base-map "\C-c\C-\\" 'c-backslash-region)
373 ;; TBD: where if anywhere, to put c-backward|forward-into-nomenclature
374 (define-key c-mode-base-map "\C-c\C-a" 'c-toggle-auto-state)
375 (define-key c-mode-base-map "\C-c\C-b" 'c-submit-bug-report)
376 (define-key c-mode-base-map "\C-c\C-c" 'comment-region)
377 (define-key c-mode-base-map "\C-c\C-d" 'c-toggle-hungry-state)
378 (define-key c-mode-base-map "\C-c\C-o" 'c-set-offset)
379 (define-key c-mode-base-map "\C-c\C-s" 'c-show-syntactic-information)
380 (define-key c-mode-base-map "\C-c\C-t" 'c-toggle-auto-hungry-state)
381 (define-key c-mode-base-map "\C-c." 'c-set-style)
382 ;; conflicts with OOBR
383 ;;(define-key c-mode-base-map "\C-c\C-v" 'c-version)
386 ;; menu support for both XEmacs and Emacs. If you don't have easymenu
387 ;; with your version of Emacs, you are incompatible!
390 (defvar c-c-menu nil)
391 (defvar c-c++-menu nil)
392 (defvar c-objc-menu nil)
393 (defvar c-java-menu nil)
395 (defun c-mode-menu (modestr)
397 '(["Comment Out Region" comment-region (mark)]
399 (comment-region (region-beginning) (region-end) '(4))
401 ["Fill Comment Paragraph" c-fill-paragraph t]
403 ["Indent Expression" c-indent-exp
404 (memq (char-after) '(?\( ?\[ ?\{))]
405 ["Indent Line" c-indent-command t]
406 ["Up Conditional" c-up-conditional t]
407 ["Backward Conditional" c-backward-conditional t]
408 ["Forward Conditional" c-forward-conditional t]
409 ["Backward Statement" c-beginning-of-statement t]
410 ["Forward Statement" c-end-of-statement t]
412 ["Macro Expand Region" c-macro-expand (mark)]
413 ["Backslashify" c-backslash-region (mark)]
421 (defvar c-mode-abbrev-table nil
422 "Abbreviation table used in c-mode buffers.")
423 (define-abbrev-table 'c-mode-abbrev-table ())
425 (defvar c-mode-map ()
426 "Keymap used in c-mode buffers.")
429 (setq c-mode-map (c-make-inherited-keymap))
430 ;; add bindings which are only useful for C
431 (define-key c-mode-map "\C-c\C-e" 'c-macro-expand)
435 (defvar c-mode-syntax-table nil
436 "Syntax table used in c-mode buffers.")
437 (if c-mode-syntax-table
439 (setq c-mode-syntax-table (make-syntax-table))
440 (c-populate-syntax-table c-mode-syntax-table))
442 (easy-menu-define c-c-menu c-mode-map "C Mode Commands"
448 (defvar c++-mode-abbrev-table nil
449 "Abbreviation table used in c++-mode buffers.")
450 (define-abbrev-table 'c++-mode-abbrev-table ())
452 (defvar c++-mode-map ()
453 "Keymap used in c++-mode buffers.")
456 (setq c++-mode-map (c-make-inherited-keymap))
457 ;; add bindings which are only useful for C++
458 (define-key c++-mode-map "\C-c\C-e" 'c-macro-expand)
459 (define-key c++-mode-map "\C-c:" 'c-scope-operator)
460 (define-key c++-mode-map "<" 'c-electric-lt-gt)
461 (define-key c++-mode-map ">" 'c-electric-lt-gt))
464 (defvar c++-mode-syntax-table nil
465 "Syntax table used in c++-mode buffers.")
466 (if c++-mode-syntax-table
468 (setq c++-mode-syntax-table (make-syntax-table))
469 (c-populate-syntax-table c++-mode-syntax-table)
470 ;; TBD: does it make sense for colon to be symbol class in C++?
471 ;; I'm not so sure, since c-label-key is busted on lines like:
473 ;; maybe c-label-key should be fixed instead of commenting this out,
474 ;; but it also bothers me that this only seems appropriate for C++
476 ;;(modify-syntax-entry ?: "_" c++-mode-syntax-table)
479 (easy-menu-define c-c++-menu c++-mode-map "C++ Mode Commands"
483 ;; Support for Objective-C
485 (defvar objc-mode-abbrev-table nil
486 "Abbreviation table used in objc-mode buffers.")
487 (define-abbrev-table 'objc-mode-abbrev-table ())
489 (defvar objc-mode-map ()
490 "Keymap used in objc-mode buffers.")
493 (setq objc-mode-map (c-make-inherited-keymap))
494 ;; add bindings which are only useful for Objective-C
495 (define-key objc-mode-map "\C-c\C-e" 'c-macro-expand))
498 (defvar objc-mode-syntax-table nil
499 "Syntax table used in objc-mode buffers.")
500 (if objc-mode-syntax-table
502 (setq objc-mode-syntax-table (make-syntax-table))
503 (c-populate-syntax-table objc-mode-syntax-table)
504 ;; add extra Objective-C only syntax
505 (modify-syntax-entry ?@ "_" objc-mode-syntax-table))
507 (easy-menu-define c-objc-menu objc-mode-map "ObjC Mode Commands"
508 (c-mode-menu "ObjC"))
513 (defvar java-mode-abbrev-table nil
514 "Abbreviation table used in java-mode buffers.")
515 (define-abbrev-table 'java-mode-abbrev-table ())
517 (defvar java-mode-map ()
518 "Keymap used in java-mode buffers.")
521 (setq java-mode-map (c-make-inherited-keymap))
522 ;; add bindings which are only useful for Java
526 (defvar java-mode-syntax-table nil
527 "Syntax table used in java-mode buffers.")
528 (if java-mode-syntax-table
530 (setq java-mode-syntax-table (make-syntax-table))
531 (c-populate-syntax-table java-mode-syntax-table))
533 (easy-menu-define c-java-menu java-mode-map "Java Mode Commands"
534 (c-mode-menu "Java"))
537 ;; Support for CORBA's IDL language
539 (defvar idl-mode-abbrev-table nil
540 "Abbreviation table used in idl-mode buffers.")
541 (define-abbrev-table 'idl-mode-abbrev-table ())
543 (defvar idl-mode-map ()
544 "Keymap used in idl-mode buffers.")
547 (setq idl-mode-map (c-make-inherited-keymap))
548 ;; add bindings which are only useful for IDL
552 (defvar idl-mode-syntax-table nil
553 "Syntax table used in idl-mode buffers.")
554 (if idl-mode-syntax-table
556 (setq idl-mode-syntax-table (make-syntax-table))
557 (c-populate-syntax-table idl-mode-syntax-table))
559 (easy-menu-define c-idl-menu idl-mode-map "IDL Mode Commands"
565 ;;; cc-langs.el ends here