From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Stefan Monnier Newsgroups: gmane.emacs.devel Subject: Further CC-mode changes Date: Thu, 11 Sep 2014 09:55:29 -0400 Message-ID: References: <53632C6F.5070903@dancol.org> <20140511211351.GC2759@acm.acm> <536FEA43.5090402@dancol.org> <20140516175226.GB3267@acm.acm> <537653A0.2070109@dancol.org> <20140518213331.GB2577@acm.acm> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain X-Trace: ger.gmane.org 1410443779 15867 80.91.229.3 (11 Sep 2014 13:56:19 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Thu, 11 Sep 2014 13:56:19 +0000 (UTC) Cc: Emacs developers To: Alan Mackenzie Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Thu Sep 11 15:56:12 2014 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1XS4r5-0001Zj-20 for ged-emacs-devel@m.gmane.org; Thu, 11 Sep 2014 15:56:11 +0200 Original-Received: from localhost ([::1]:38694 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XS4r4-0004c4-Po for ged-emacs-devel@m.gmane.org; Thu, 11 Sep 2014 09:56:10 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:40014) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XS4qb-0004ZD-Ld for emacs-devel@gnu.org; Thu, 11 Sep 2014 09:55:49 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XS4qU-0007T2-2U for emacs-devel@gnu.org; Thu, 11 Sep 2014 09:55:41 -0400 Original-Received: from chene.dit.umontreal.ca ([132.204.246.20]:32999) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XS4qT-0007Re-Od for emacs-devel@gnu.org; Thu, 11 Sep 2014 09:55:33 -0400 Original-Received: from pastel.home (lechon.iro.umontreal.ca [132.204.27.242]) by chene.dit.umontreal.ca (8.14.1/8.14.1) with ESMTP id s8BDtTZa031660; Thu, 11 Sep 2014 09:55:30 -0400 Original-Received: by pastel.home (Postfix, from userid 20848) id A0E2760BE1; Thu, 11 Sep 2014 09:55:29 -0400 (EDT) In-Reply-To: (Stefan Monnier's message of "Mon, 08 Sep 2014 13:28:32 -0400") User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.4.50 (gnu/linux) X-NAI-Spam-Flag: NO X-NAI-Spam-Threshold: 5 X-NAI-Spam-Score: 0 X-NAI-Spam-Rules: 1 Rules triggered RV5061=0 X-NAI-Spam-Version: 2.3.0.9378 : core <5061> : inlines <1277> : streams <1287293> : uri <1812775> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 132.204.246.20 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:174174 Archived-At: While waiting for your guidance as to which parts of my patches need to be reverted and why, here's some candidate patch which (contrary to the one you reverted) actually changes the code's behavior. It's to be applied on top of the ones you removed (tho since the ones you remove are mostly cosmetic, it shouldn't make much of a difference). Questions: - should C-c C-n and friends be moved to c-derivative-mode-map (AFAIK neither Java nor IDL nor Pike have CPP conditionals)? - I notice that all cc-mode enable abbrev-mode except for idl-mode. Was that on purpose or is it just accidental? - BTW, I think it would be better not to enable abbrev-mode (let it be a user's choice). IIUC CC-mode relies on abbrev-mode internally for some of its electric-indent functionality, so we'd have to use some other approach (e.g. a post-self-insert-hook). This is not really tested, especially not on XEmacs, but AFAIK it doesn't depend on any feature specific to a particular Emacs version. Stefan - Move awk-mode's actual definition to cc-awk so as to get rid of the (require 'cc-awk) and the ":syntax-table nil" hack. - make awk-mode use syntax-propertize when available. - Use define-derived-mode's built-in keymap inheritance rather than c-make-inherited-keymap. - initialize c-mode-base-map in its defvar. - fix c-after-font-lock-init so it doesn't accidentally add a c-after-change which wasn't there to begin with. - Run c-update-modeline from after-change-major-mode-hook and hack-local-variables-hook rather than from the major mode function. This lets us fix the bug where c-mode-hook is run twice and saves us from having to define c-run-mode-hooks. - make c-mode-common into an actual parent mode. There is a naming problem since we have c-mode-base-map for the "parent map" but c-mode-common-hook for the "parent hook", and also because this "mode" doesn't end in "-mode", but I think we can live with it. - add a new parent mode c-derivative-mode which can hold those things common to c, c++, and objc (i.e. languages which include C as a subset). I was tempted to simply use c-mode as the parent for c++-mode and objc-mode, but this would be a lot more intrusive and it would force the presence of a "C" menu in both C++ and ObjC modes (we could fix that for Emacs, but I'm not sure how to do it for XEmacs, and it doesn't seem worth the trouble). === modified file 'lisp/progmodes/cc-awk.el' --- lisp/progmodes/cc-awk.el 2014-09-09 15:08:08 +0000 +++ lisp/progmodes/cc-awk.el 2014-09-11 13:48:50 +0000 @@ -42,6 +42,7 @@ (require 'cc-defs) (require 'cc-engine) +(require 'cc-mode) (defvar awk-mode-syntax-table (let ((st (make-syntax-table))) @@ -52,7 +53,7 @@ (modify-syntax-entry ?\# "< " st) ;; / can delimit regexes or be a division operator. By default we assume ;; that it is a division sign, and fix the regexp operator cases with - ;; `font-lock-syntactic-keywords'. + ;; `syntax-table' text-properties. (modify-syntax-entry ?/ "." st) ; ACM 2002/4/27. (modify-syntax-entry ?* "." st) (modify-syntax-entry ?+ "." st) @@ -848,6 +849,17 @@ (max (+ (- c-awk-old-ByLL old-len) (- end beg)) (c-awk-beyond-logical-line end))) +(defun c-awk-syntax-propertize (beg end) + (c-awk-clear-NL-props beg (point-max)) + (goto-char beg) + (c-awk-set-syntax-table-properties end)) + +(defun c-awk-syntax-propertize-extend-region (beg end) + (let ((newend (c-awk-beyond-logical-line end)) + (newbeg (c-awk-beginning-of-logical-line beg))) + (if (or (< newbeg beg) (> newend end)) + (cons newbeg newend)))) + ;; ACM 2002/5/25. When font-locking is invoked by a buffer change, the region ;; specified by the font-lock after-change function must be expanded to ;; include ALL of any string or regexp within the region. The simplest way to @@ -1129,5 +1141,80 @@ (goto-char (min start-point end-point))))))) +;; Support for AWK + +;;;###autoload (add-to-list 'auto-mode-alist '("\\.awk\\'" . awk-mode)) +;;;###autoload (add-to-list 'interpreter-mode-alist '("awk" . awk-mode)) +;;;###autoload (add-to-list 'interpreter-mode-alist '("mawk" . awk-mode)) +;;;###autoload (add-to-list 'interpreter-mode-alist '("nawk" . awk-mode)) +;;;###autoload (add-to-list 'interpreter-mode-alist '("gawk" . awk-mode)) + +(c-define-abbrev-table 'awk-mode-abbrev-table + '(("else" "else" c-electric-continued-statement 0) + ("while" "while" c-electric-continued-statement 0)) + "Abbreviation table used in awk-mode buffers.") + +(defvar awk-mode-map + (let ((map (make-sparse-keymap)) + (sic (if (featurep 'xemacs) 'self-insert-command))) + ;; Add bindings which are only useful for awk. + (define-key map "#" sic) ; Override electric parent binding. + (define-key map "/" sic) ; Override electric parent binding. + (define-key map "*" sic) ; Override electric parent binding. + (define-key map "\C-c\C-n" 'undefined) ; #if doesn't exist in awk. + (define-key map "\C-c\C-p" 'undefined) + (define-key map "\C-c\C-u" 'undefined) + (define-key map "\M-a" 'c-beginning-of-statement) ; 2003/10/7 + (define-key map "\M-e" 'c-end-of-statement) ; 2003/10/7 + (define-key map "\C-\M-a" 'c-awk-beginning-of-defun) + (define-key map "\C-\M-e" 'c-awk-end-of-defun) + map) + "Keymap used in awk-mode buffers.") + +(easy-menu-define c-awk-menu awk-mode-map "AWK Mode Commands" + (cons "AWK" (c-lang-const c-mode-menu awk))) + +;;;###autoload +(define-derived-mode awk-mode c-mode-common "AWK" + "Major mode for editing AWK code. +To submit a problem report, enter `\\[c-submit-bug-report]' from an +awk-mode buffer. This automatically sets up a mail buffer with version +information already added. You just need to add a description of the +problem, including a reproducible test case, and send the message. + +To see what version of CC Mode you are running, enter `\\[c-version]'. + +The hook `c-mode-common-hook' is run with no args at mode +initialization, then `awk-mode-hook'. + +Key bindings: +\\{awk-mode-map}" + (c-init-language-vars-for 'awk-mode) + (c-common-init 'awk-mode) + (c-awk-unstick-NL-prop) + (when (fboundp 'syntax-propertize) + ;; `c-basic-common-init' unconditionally adds `c-before-change' but this + ;; function does lots of irrelevant stuff for us (to do with maintaining + ;; `c-found-types' and `c-state-cache'). The only useful thing it does is + ;; run `c-get-state-before-change-functions' where we normally add + ;; `c-awk-record-region-clear-NL'. + (remove-hook 'before-change-functions #'c-before-change t) + ;; Same thing for `after-change-functions' with `c-after-change' vs + ;; `c-awk-extend-and-syntax-tablify-region' (via + ;; `c-before-font-lock-functions'). + (remove-hook 'after-change-functions #'c-after-change t) + ;; CC-mode setq c-new-BEG/END in `c-after-change' and then uses them in + ;; `font-lock-extend-after-change-region-function'. We don't need that and + ;; additionally we don't maintain c-new-BEG/END any more, so we really need + ;; it out of the way. + (kill-local-variable 'font-lock-extend-after-change-region-function) + ;; Now, setup syntax-propertize. + (add-hook 'syntax-propertize-extend-region-functions + #'c-awk-syntax-propertize-extend-region + nil t) + (set (make-local-variable 'syntax-propertize-function) + #'c-awk-syntax-propertize))) + + (provide 'cc-awk) ;;; cc-awk.el ends here === modified file 'lisp/progmodes/cc-mode.el' --- lisp/progmodes/cc-mode.el 2014-09-10 16:32:36 +0000 +++ lisp/progmodes/cc-mode.el 2014-09-11 13:33:16 +0000 @@ -198,24 +183,7 @@ ;;; Common routines. -(defvar c-mode-base-map () - "Keymap shared by all CC Mode related modes.") - -(defun c-make-inherited-keymap () - (let ((map (make-sparse-keymap))) - ;; Necessary to use `cc-bytecomp-fboundp' below since this - ;; function is called from top-level forms that are evaluated - ;; while cc-bytecomp is active when one does M-x eval-buffer. - (cond - ;; Emacs - ((cc-bytecomp-fboundp 'set-keymap-parent) - (set-keymap-parent map c-mode-base-map)) - ;; XEmacs - ((fboundp 'set-keymap-parents) - (set-keymap-parents map c-mode-base-map)) - ;; incompatible - (t (error "CC Mode is incompatible with this version of Emacs"))) - map)) +(defvar c-mode-base-map) (defun c-define-abbrev-table (name defs &optional doc) ;; Compatibility wrapper for `define-abbrev' which passes a non-nil @@ -236,59 +204,58 @@ (setq defs (cdr defs))))) (put 'c-define-abbrev-table 'lisp-indent-function 1) -(defun c-bind-special-erase-keys () +(defun c-bind-special-erase-keys (&optional map) ;; Only used in Emacs to bind C-c C- and C-c C- ;; to the proper keys depending on `normal-erase-is-backspace'. + (unless map (setq map c-mode-base-map)) (if normal-erase-is-backspace (progn - (define-key c-mode-base-map (kbd "C-c C-") + (define-key map (kbd "C-c C-") 'c-hungry-delete-forward) - (define-key c-mode-base-map (kbd "C-c C-") + (define-key map (kbd "C-c C-") 'c-hungry-delete-backwards)) - (define-key c-mode-base-map (kbd "C-c C-") + (define-key map (kbd "C-c C-") 'c-hungry-delete-backwards) - (define-key c-mode-base-map (kbd "C-c C-") + (define-key map (kbd "C-c C-") 'c-hungry-delete-forward))) -(if c-mode-base-map - nil - - (setq c-mode-base-map (make-sparse-keymap)) +(defvar c-mode-base-map + (let ((map (make-sparse-keymap))) ;; Separate M-BS from C-M-h. The former should remain ;; backward-kill-word. - (define-key c-mode-base-map [(control meta h)] 'c-mark-function) - (define-key c-mode-base-map "\e\C-q" 'c-indent-exp) + (define-key map [(control meta h)] 'c-mark-function) + (define-key map "\e\C-q" 'c-indent-exp) (substitute-key-definition 'backward-sentence 'c-beginning-of-statement - c-mode-base-map global-map) + map global-map) (substitute-key-definition 'forward-sentence 'c-end-of-statement - c-mode-base-map global-map) + map global-map) (substitute-key-definition 'indent-new-comment-line 'c-indent-new-comment-line - c-mode-base-map global-map) + map global-map) (substitute-key-definition 'indent-for-tab-command ;; XXX Is this the right thing to do ;; here? 'c-indent-line-or-region - c-mode-base-map global-map) + map global-map) (when (fboundp 'comment-indent-new-line) ;; indent-new-comment-line has changed name to ;; comment-indent-new-line in Emacs 21. (substitute-key-definition 'comment-indent-new-line 'c-indent-new-comment-line - c-mode-base-map global-map)) + map global-map)) ;; RMS says don't make these the default. ;; (April 2006): RMS has now approved these commands as defaults. (unless (memq 'argumentative-bod-function c-emacs-features) - (define-key c-mode-base-map "\e\C-a" 'c-beginning-of-defun) - (define-key c-mode-base-map "\e\C-e" 'c-end-of-defun)) + (define-key map "\e\C-a" 'c-beginning-of-defun) + (define-key map "\e\C-e" 'c-end-of-defun)) - (define-key c-mode-base-map "\C-c\C-n" 'c-forward-conditional) - (define-key c-mode-base-map "\C-c\C-p" 'c-backward-conditional) - (define-key c-mode-base-map "\C-c\C-u" 'c-up-conditional) + (define-key map "\C-c\C-n" 'c-forward-conditional) + (define-key map "\C-c\C-p" 'c-backward-conditional) + (define-key map "\C-c\C-u" 'c-up-conditional) ;; It doesn't suffice to put `c-fill-paragraph' on ;; `fill-paragraph-function' since `c-fill-paragraph' must be called @@ -299,11 +266,11 @@ ;; `fill-paragraph' and the value on `fill-paragraph-function' to ;; do the actual filling work. (substitute-key-definition 'fill-paragraph 'c-fill-paragraph - c-mode-base-map global-map) + map global-map) ;; In XEmacs the default fill function is called ;; fill-paragraph-or-region. (substitute-key-definition 'fill-paragraph-or-region 'c-fill-paragraph - c-mode-base-map global-map) + map global-map) ;; We bind the forward deletion key and (implicitly) C-d to ;; `c-electric-delete-forward', and the backward deletion key to @@ -320,21 +287,21 @@ ;; automatically maps the [delete] and [backspace] keys to these two ;; depending on window system and user preferences. (In earlier ;; versions it's possible to do the same by using `function-key-map'.) - (define-key c-mode-base-map "\C-d" 'c-electric-delete-forward) - (define-key c-mode-base-map "\177" 'c-electric-backspace) - (define-key c-mode-base-map "\C-c\C-d" 'c-hungry-delete-forward) - (define-key c-mode-base-map [?\C-c ?\d] 'c-hungry-delete-backwards) - (define-key c-mode-base-map [?\C-c ?\C-\d] 'c-hungry-delete-backwards) - (define-key c-mode-base-map [?\C-c deletechar] 'c-hungry-delete-forward) ; C-c on a tty. - (define-key c-mode-base-map [?\C-c (control deletechar)] ; C-c C- on a tty. + (define-key map "\C-d" 'c-electric-delete-forward) + (define-key map "\177" 'c-electric-backspace) + (define-key map "\C-c\C-d" 'c-hungry-delete-forward) + (define-key map [?\C-c ?\d] 'c-hungry-delete-backwards) + (define-key map [?\C-c ?\C-\d] 'c-hungry-delete-backwards) + (define-key map [?\C-c deletechar] 'c-hungry-delete-forward) ; C-c on a tty. + (define-key map [?\C-c (control deletechar)] ; C-c C- on a tty. 'c-hungry-delete-forward) (when (boundp 'normal-erase-is-backspace) ;; The automatic C-d and DEL mapping functionality doesn't extend ;; to special combinations like C-c C-, so we have to hook ;; into the `normal-erase-is-backspace' system to bind it directly ;; as appropriate. - (add-hook 'normal-erase-is-backspace-hook 'c-bind-special-erase-keys) - (c-bind-special-erase-keys)) + (add-hook 'normal-erase-is-backspace-hook #'c-bind-special-erase-keys) + (c-bind-special-erase-keys map)) (when (fboundp 'delete-forward-p) ;; In XEmacs we fix the forward and backward deletion behavior by @@ -342,41 +309,42 @@ ;; directly, and use `delete-forward-p' to decide what [delete] ;; should do. That's done in the XEmacs specific ;; `c-electric-delete' and `c-hungry-delete' functions. - (define-key c-mode-base-map [delete] 'c-electric-delete) - (define-key c-mode-base-map [backspace] 'c-electric-backspace) - (define-key c-mode-base-map (kbd "C-c ") 'c-hungry-delete) - (define-key c-mode-base-map (kbd "C-c C-") 'c-hungry-delete) - (define-key c-mode-base-map (kbd "C-c ") + (define-key map [delete] 'c-electric-delete) + (define-key map [backspace] 'c-electric-backspace) + (define-key map (kbd "C-c ") 'c-hungry-delete) + (define-key map (kbd "C-c C-") 'c-hungry-delete) + (define-key map (kbd "C-c ") 'c-hungry-delete-backwards) - (define-key c-mode-base-map (kbd "C-c C-") + (define-key map (kbd "C-c C-") 'c-hungry-delete-backwards)) - (define-key c-mode-base-map "#" 'c-electric-pound) - (define-key c-mode-base-map "{" 'c-electric-brace) - (define-key c-mode-base-map "}" 'c-electric-brace) - (define-key c-mode-base-map "/" 'c-electric-slash) - (define-key c-mode-base-map "*" 'c-electric-star) - (define-key c-mode-base-map ";" 'c-electric-semi&comma) - (define-key c-mode-base-map "," 'c-electric-semi&comma) - (define-key c-mode-base-map ":" 'c-electric-colon) - (define-key c-mode-base-map "(" 'c-electric-paren) - (define-key c-mode-base-map ")" 'c-electric-paren) - - (define-key c-mode-base-map "\C-c\C-\\" 'c-backslash-region) - (define-key c-mode-base-map "\C-c\C-a" 'c-toggle-auto-newline) - (define-key c-mode-base-map "\C-c\C-b" 'c-submit-bug-report) - (define-key c-mode-base-map "\C-c\C-c" 'comment-region) - (define-key c-mode-base-map "\C-c\C-l" 'c-toggle-electric-state) - (define-key c-mode-base-map "\C-c\C-o" 'c-set-offset) - (define-key c-mode-base-map "\C-c\C-q" 'c-indent-defun) - (define-key c-mode-base-map "\C-c\C-s" 'c-show-syntactic-information) - ;; (define-key c-mode-base-map "\C-c\C-t" 'c-toggle-auto-hungry-state) Commented out by ACM, 2005-03-05. - (define-key c-mode-base-map "\C-c." 'c-set-style) + (define-key map "#" 'c-electric-pound) + (define-key map "{" 'c-electric-brace) + (define-key map "}" 'c-electric-brace) + (define-key map "/" 'c-electric-slash) + (define-key map "*" 'c-electric-star) + (define-key map ";" 'c-electric-semi&comma) + (define-key map "," 'c-electric-semi&comma) + (define-key map ":" 'c-electric-colon) + (define-key map "(" 'c-electric-paren) + (define-key map ")" 'c-electric-paren) + + (define-key map "\C-c\C-\\" 'c-backslash-region) + (define-key map "\C-c\C-a" 'c-toggle-auto-newline) + (define-key map "\C-c\C-b" 'c-submit-bug-report) + (define-key map "\C-c\C-c" 'comment-region) + (define-key map "\C-c\C-l" 'c-toggle-electric-state) + (define-key map "\C-c\C-o" 'c-set-offset) + (define-key map "\C-c\C-q" 'c-indent-defun) + (define-key map "\C-c\C-s" 'c-show-syntactic-information) + ;; (define-key map "\C-c\C-t" 'c-toggle-auto-hungry-state) Commented out by ACM, 2005-03-05. + (define-key map "\C-c." 'c-set-style) ;; conflicts with OOBR - ;;(define-key c-mode-base-map "\C-c\C-v" 'c-version) - ;; (define-key c-mode-base-map "\C-c\C-y" 'c-toggle-hungry-state) Commented out by ACM, 2005-11-22. - (define-key c-mode-base-map "\C-c\C-w" 'subword-mode) - ) + ;;(define-key map "\C-c\C-v" 'c-version) + ;; (define-key map "\C-c\C-y" 'c-toggle-hungry-state) Commented out by ACM, 2005-11-22. + (define-key map "\C-c\C-w" 'subword-mode) + map) + "Keymap shared by all CC Mode related modes.") ;; We don't require the outline package, but we configure it a bit anyway. (cc-bytecomp-defvar outline-level) @@ -805,13 +773,6 @@ (add-hook 'before-hack-local-variables-hook 'c-before-hack-hook) (add-hook 'hack-local-variables-hook 'c-postprocess-file-styles)) -(defmacro c-run-mode-hooks (&rest hooks) - ;; Emacs 21.1 has introduced a system with delayed mode hooks that - ;; requires the use of the new function `run-mode-hooks'. - (if (fboundp 'run-mode-hooks) - `(run-mode-hooks ,@hooks) - `(progn ,@(mapcar (lambda (hook) `(run-hooks ,hook)) hooks)))) - ;;; Change hooks, linking with Font Lock and electric-indent-mode. @@ -1202,8 +1163,9 @@ (defun c-after-font-lock-init () ;; Put on `font-lock-mode-hook'. This function ensures our after-change ;; function will get executed before the font-lock one. + (when (memq #'c-after-change after-change-functions) (remove-hook 'after-change-functions 'c-after-change t) - (add-hook 'after-change-functions 'c-after-change nil t)) + (add-hook 'after-change-functions 'c-after-change nil t))) (defun c-font-lock-init () "Set up the font-lock variables for using the font-lock support in CC Mode. @@ -1264,6 +1226,30 @@ (c-update-modeline))) +(defvar c-mode-common-map c-mode-base-map) + +(define-derived-mode c-mode-common prog-mode "CC-generic" + "Pseudo major mode, parent of all modes using the CC engine." + (c-initialize-cc-mode t) + (setq abbrev-mode t) ;FIXME: Why? + ;; Refresh the modeline flags after running the major mode hooks. + (add-hook 'after-change-major-mode-hook #'c-update-modeline 'append t) + (add-hook 'hack-local-variables-hook #'c-update-modeline 'append t)) + +(defvar c-derivative-mode-map + ;; FIXME: We can't have the menu on this keymap, because the menus for C, + ;; C++, and ObjC can't be shared: the only difference between them is their + ;; title, but easy-menu offers no way to compute the title dynamically. + (let ((map (make-sparse-keymap))) + ;; Add bindings which are useful for any C derivative. + (define-key map "\C-c\C-e" 'c-macro-expand) + map) + "Keymap used in c-derivative-mode buffers.") + +(define-derived-mode c-derivative-mode c-mode-common "C-derivative" + "Pseudo major mode, parent of all modes for C derivatives. +A C derivative is a language which is a superset of C (or is C itself).") + ;; Support for C (defvar c-mode-syntax-table @@ -1276,9 +1262,8 @@ "Abbreviation table used in c-mode buffers.") (defvar c-mode-map - (let ((map (c-make-inherited-keymap))) + (let ((map (make-sparse-keymap))) ;; Add bindings which are only useful for C. - (define-key map "\C-c\C-e" 'c-macro-expand) map) "Keymap used in c-mode buffers.") @@ -1314,9 +1299,8 @@ ;;;###autoload (add-to-list 'auto-mode-alist '("\\.i\\'" . c-mode)) ;;;###autoload (add-to-list 'auto-mode-alist '("\\.ii\\'" . c++-mode)) - ;;;###autoload -(define-derived-mode c-mode prog-mode "C" +(define-derived-mode c-mode c-derivative-mode "C" "Major mode for editing K&R and ANSI C code. To submit a problem report, enter `\\[c-submit-bug-report]' from a c-mode buffer. This automatically sets up a mail buffer with version @@ -1330,18 +1314,11 @@ Key bindings: \\{c-mode-map}" - (c-initialize-cc-mode t) - (set-syntax-table c-mode-syntax-table) - (setq local-abbrev-table c-mode-abbrev-table - abbrev-mode t) - (use-local-map c-mode-map) (c-init-language-vars-for 'c-mode) (c-make-macro-with-semi-re) ; matches macro names whose expansion ends with ; (c-common-init 'c-mode) (easy-menu-add c-c-menu) - (cc-imenu-init cc-imenu-c-generic-expression) - (c-run-mode-hooks 'c-mode-common-hook 'c-mode-hook) - (c-update-modeline)) + (cc-imenu-init cc-imenu-c-generic-expression)) ;; Support for C++ @@ -1357,9 +1334,8 @@ "Abbreviation table used in c++-mode buffers.") (defvar c++-mode-map - (let ((map (c-make-inherited-keymap))) + (let ((map (make-sparse-keymap))) ;; Add bindings which are only useful for C++. - (define-key map "\C-c\C-e" 'c-macro-expand) (define-key map "\C-c:" 'c-scope-operator) (define-key map "<" 'c-electric-lt-gt) (define-key map ">" 'c-electric-lt-gt) @@ -1370,7 +1346,7 @@ (cons "C++" (c-lang-const c-mode-menu c++))) ;;;###autoload -(define-derived-mode c++-mode prog-mode "C++" +(define-derived-mode c++-mode c-derivative-mode "C++" "Major mode for editing C++ code. To submit a problem report, enter `\\[c-submit-bug-report]' from a c++-mode buffer. This automatically sets up a mail buffer with @@ -1385,18 +1361,11 @@ Key bindings: \\{c++-mode-map}" - (c-initialize-cc-mode t) - (set-syntax-table c++-mode-syntax-table) - (setq local-abbrev-table c++-mode-abbrev-table - abbrev-mode t) - (use-local-map c++-mode-map) (c-init-language-vars-for 'c++-mode) (c-make-macro-with-semi-re) ; matches macro names whose expansion ends with ; (c-common-init 'c++-mode) (easy-menu-add c-c++-menu) - (cc-imenu-init cc-imenu-c++-generic-expression) - (c-run-mode-hooks 'c-mode-common-hook 'c++-mode-hook) - (c-update-modeline)) + (cc-imenu-init cc-imenu-c++-generic-expression)) ;; Support for Objective-C @@ -1411,9 +1380,8 @@ "Abbreviation table used in objc-mode buffers.") (defvar objc-mode-map - (let ((map (c-make-inherited-keymap))) + (let ((map (make-sparse-keymap))) ;; Add bindings which are only useful for Objective-C. - (define-key map "\C-c\C-e" 'c-macro-expand) map) "Keymap used in objc-mode buffers.") @@ -1423,7 +1391,7 @@ ;;;###autoload (add-to-list 'auto-mode-alist '("\\.m\\'" . objc-mode)) ;;;###autoload -(define-derived-mode objc-mode prog-mode "ObjC" +(define-derived-mode objc-mode c-derivative-mode "ObjC" "Major mode for editing Objective C code. To submit a problem report, enter `\\[c-submit-bug-report]' from an objc-mode buffer. This automatically sets up a mail buffer with @@ -1438,18 +1406,11 @@ Key bindings: \\{objc-mode-map}" - (c-initialize-cc-mode t) - (set-syntax-table objc-mode-syntax-table) - (setq local-abbrev-table objc-mode-abbrev-table - abbrev-mode t) - (use-local-map objc-mode-map) (c-init-language-vars-for 'objc-mode) (c-make-macro-with-semi-re) ; matches macro names whose expansion ends with ; (c-common-init 'objc-mode) (easy-menu-add c-objc-menu) - (cc-imenu-init nil 'cc-imenu-objc-function) - (c-run-mode-hooks 'c-mode-common-hook 'objc-mode-hook) - (c-update-modeline)) + (cc-imenu-init nil 'cc-imenu-objc-function)) ;; Support for Java @@ -1466,7 +1427,7 @@ "Abbreviation table used in java-mode buffers.") (defvar java-mode-map - (let ((map (c-make-inherited-keymap))) + (let ((map (make-sparse-keymap))) ;; Add bindings which are only useful for Java. map) "Keymap used in java-mode buffers.") @@ -1484,7 +1445,7 @@ ;;;###autoload (add-to-list 'auto-mode-alist '("\\.java\\'" . java-mode)) ;;;###autoload -(define-derived-mode java-mode prog-mode "Java" +(define-derived-mode java-mode c-mode-common "Java" "Major mode for editing Java code. To submit a problem report, enter `\\[c-submit-bug-report]' from a java-mode buffer. This automatically sets up a mail buffer with @@ -1499,17 +1460,10 @@ Key bindings: \\{java-mode-map}" - (c-initialize-cc-mode t) - (set-syntax-table java-mode-syntax-table) - (setq local-abbrev-table java-mode-abbrev-table - abbrev-mode t) - (use-local-map java-mode-map) (c-init-language-vars-for 'java-mode) (c-common-init 'java-mode) (easy-menu-add c-java-menu) - (cc-imenu-init cc-imenu-java-generic-expression) - (c-run-mode-hooks 'c-mode-common-hook 'java-mode-hook) - (c-update-modeline)) + (cc-imenu-init cc-imenu-java-generic-expression)) ;; Support for CORBA's IDL language @@ -1522,7 +1476,7 @@ "Abbreviation table used in idl-mode buffers.") (defvar idl-mode-map - (let ((map (c-make-inherited-keymap))) + (let ((map (make-sparse-keymap))) ;; Add bindings which are only useful for IDL. map) "Keymap used in idl-mode buffers.") @@ -1533,7 +1487,7 @@ ;;;###autoload (add-to-list 'auto-mode-alist '("\\.idl\\'" . idl-mode)) ;;;###autoload -(define-derived-mode idl-mode prog-mode "IDL" +(define-derived-mode idl-mode c-mode-common "IDL" "Major mode for editing CORBA's IDL, PSDL and CIDL code. To submit a problem report, enter `\\[c-submit-bug-report]' from an idl-mode buffer. This automatically sets up a mail buffer with @@ -1548,16 +1502,12 @@ Key bindings: \\{idl-mode-map}" - (c-initialize-cc-mode t) - (set-syntax-table idl-mode-syntax-table) - (setq local-abbrev-table idl-mode-abbrev-table) - (use-local-map idl-mode-map) + (kill-local-variable 'abbrev-mode) ;FIXME: Only mode that doesn't enable it!? (c-init-language-vars-for 'idl-mode) (c-common-init 'idl-mode) (easy-menu-add c-idl-menu) ;;(cc-imenu-init cc-imenu-idl-generic-expression) ;TODO - (c-run-mode-hooks 'c-mode-common-hook 'idl-mode-hook) - (c-update-modeline)) + ) ;; Support for Pike @@ -1572,7 +1522,7 @@ "Abbreviation table used in pike-mode buffers.") (defvar pike-mode-map - (let ((map (c-make-inherited-keymap))) + (let ((map (make-sparse-keymap))) ;; Additional bindings. (define-key map "\C-c\C-e" 'c-macro-expand) map) @@ -1585,7 +1535,7 @@ ;;;###autoload (add-to-list 'interpreter-mode-alist '("pike" . pike-mode)) ;;;###autoload -(define-derived-mode pike-mode prog-mode "Pike" +(define-derived-mode pike-mode c-mode-common "Pike" "Major mode for editing Pike code. To submit a problem report, enter `\\[c-submit-bug-report]' from a pike-mode buffer. This automatically sets up a mail buffer with @@ -1600,86 +1550,11 @@ Key bindings: \\{pike-mode-map}" - (c-initialize-cc-mode t) - (set-syntax-table pike-mode-syntax-table) - (setq local-abbrev-table pike-mode-abbrev-table - abbrev-mode t) - (use-local-map pike-mode-map) (c-init-language-vars-for 'pike-mode) (c-common-init 'pike-mode) (easy-menu-add c-pike-menu) ;;(cc-imenu-init cc-imenu-pike-generic-expression) ;TODO - (c-run-mode-hooks 'c-mode-common-hook 'pike-mode-hook) - (c-update-modeline)) - - -;; Support for AWK - -;;;###autoload (add-to-list 'auto-mode-alist '("\\.awk\\'" . awk-mode)) -;;;###autoload (add-to-list 'interpreter-mode-alist '("awk" . awk-mode)) -;;;###autoload (add-to-list 'interpreter-mode-alist '("mawk" . awk-mode)) -;;;###autoload (add-to-list 'interpreter-mode-alist '("nawk" . awk-mode)) -;;;###autoload (add-to-list 'interpreter-mode-alist '("gawk" . awk-mode)) - -(c-define-abbrev-table 'awk-mode-abbrev-table - '(("else" "else" c-electric-continued-statement 0) - ("while" "while" c-electric-continued-statement 0)) - "Abbreviation table used in awk-mode buffers.") - -(defvar awk-mode-map - (let ((map (c-make-inherited-keymap))) - ;; Add bindings which are only useful for awk. - (define-key map "#" 'self-insert-command) - (define-key map "/" 'self-insert-command) - (define-key map "*" 'self-insert-command) - (define-key map "\C-c\C-n" 'undefined) ; #if doesn't exist in awk. - (define-key map "\C-c\C-p" 'undefined) - (define-key map "\C-c\C-u" 'undefined) - (define-key map "\M-a" 'c-beginning-of-statement) ; 2003/10/7 - (define-key map "\M-e" 'c-end-of-statement) ; 2003/10/7 - (define-key map "\C-\M-a" 'c-awk-beginning-of-defun) - (define-key map "\C-\M-e" 'c-awk-end-of-defun) - map) - "Keymap used in awk-mode buffers.") - -(easy-menu-define c-awk-menu awk-mode-map "AWK Mode Commands" - (cons "AWK" (c-lang-const c-mode-menu awk))) - -;; (require 'cc-awk) brings these in. -(defvar awk-mode-syntax-table) -(declare-function c-awk-unstick-NL-prop "cc-awk" ()) - -;;;###autoload -(define-derived-mode awk-mode prog-mode "AWK" - "Major mode for editing AWK code. -To submit a problem report, enter `\\[c-submit-bug-report]' from an -awk-mode buffer. This automatically sets up a mail buffer with version -information already added. You just need to add a description of the -problem, including a reproducible test case, and send the message. - -To see what version of CC Mode you are running, enter `\\[c-version]'. - -The hook `c-mode-common-hook' is run with no args at mode -initialization, then `awk-mode-hook'. - -Key bindings: -\\{awk-mode-map}" - ;; We need the next line to stop the macro defining - ;; `awk-mode-syntax-table'. This would mask the real table which is - ;; declared in cc-awk.el and hasn't yet been loaded. - :syntax-table nil - (require 'cc-awk) ; Added 2003/6/10. - (c-initialize-cc-mode t) - (set-syntax-table awk-mode-syntax-table) - (setq local-abbrev-table awk-mode-abbrev-table - abbrev-mode t) - (use-local-map awk-mode-map) - (c-init-language-vars-for 'awk-mode) - (c-common-init 'awk-mode) - (c-awk-unstick-NL-prop) - - (c-run-mode-hooks 'c-mode-common-hook 'awk-mode-hook) - (c-update-modeline)) + ) ;; bug reporting