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