Mercurial > emacs
changeset 69140:3d8b060d10fb
cc-align.el, cc-awk.el, cc-bytecomp.el, cc-cmds.el, cc-compat.el,
cc-defs.el, cc-engine.el, cc-fonts.el, cc-langs.el, cc-menus.el,
cc-mode.el, cc-styles.el, cc-subword.el, cc-vars.el: Add 2006 to the
copyright statement.
cc-awk.el: (c-awk-after-change): Protect the match data with
save-match-data. It was being corrupted when Font Lock was not enabled.
(ii): Fix a typo.
cc-cmds.el, cc-mode.el, cc-engine.el (c-update-modeline): Concatenate the
minor mode indicators directly onto mode-name, removing
c-submode-indicators. Sometimes, c-s-i got separated from the mode name
on the mode line.
cc-cmds.el, cc-mode.el: Rename c-hungry-backspace to
c-hungry-delete-backwards, at the request of RMS. Leave the old name as
an alias.
cc-cmds.el (c-electric-brace, c-electric-semi&comma, c-electric-colon):
Correct doc-strings: "/ln" -> "/la".
cc-cmds.el (c-electric-brace): Fix clean-up brace-else-brace (error due
to mbeg, mend being undefined).
cc-defs.el (c-version): Update to 5.31.3.
cc-defs.el: [Supersedes patch V1.38]: (top level): Check for a buggy
font-lock-compile-keywords ONLY in XEmacs. GNU Emacs 22 now has a check
which would throw an error here.
cc-engine.el (c-beginning-of-statement-1): Clarify doc-string and
comments. Distinguish real labels ("case 1:" or "foo:") from non-labels
("public:").
cc-engine.el (c-after-change-check-<>-operators): Remove save-match-data,
reversing change for V1.45. save-match-data is now in c-after-change.
cc-engine.el (c-forward-objc-directive): Replace c-forward-token-2 with
crude coding; c-f-t-2 doesn't move over a token at EOB. Objc Mode was
hanging after typing, e.g., "@implementation".
cc-langs.el (c-filter-ops): Made it available at runtime too to work when
`c-make-init-lang-vars-fun' needs to evaluate from source.
cc-langs.el (c-make-init-lang-vars-fun): Improved the error message when
there's an evaluation error to show whether it's loaded from source or
not.
(c-mode-menu): Add menu items for Electric Mode and Subword Mode.
cc-mode.el (c-after-change): Protect the match data with save-match-data.
It was getting corrupted by c-after-change-check-<>-operators.
cc-mode.el: File Local variables: Solve the problem where both `mode' and
c-file-offsets are specified: `mode' will overwrite c-f-o's settings:
(c-remove-any-local-eval-or-mode-variables): new function.
(c-postprocess-file-styles): call the above new function, within
c-tentative-buffer-change, to splat `mode' and `eval' before the second
hack-local-variables.
author | Alan Mackenzie <acm@muc.de> |
---|---|
date | Fri, 24 Feb 2006 15:33:02 +0000 |
parents | 85cd04b9bd25 |
children | 6b335e9ea577 |
files | lisp/ChangeLog lisp/progmodes/cc-align.el lisp/progmodes/cc-awk.el lisp/progmodes/cc-bytecomp.el lisp/progmodes/cc-cmds.el lisp/progmodes/cc-compat.el lisp/progmodes/cc-defs.el lisp/progmodes/cc-engine.el lisp/progmodes/cc-langs.el lisp/progmodes/cc-menus.el lisp/progmodes/cc-mode.el lisp/progmodes/cc-styles.el lisp/progmodes/cc-vars.el |
diffstat | 13 files changed, 323 insertions(+), 140 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/ChangeLog Fri Feb 24 12:20:45 2006 +0000 +++ b/lisp/ChangeLog Fri Feb 24 15:33:02 2006 +0000 @@ -1,3 +1,93 @@ +2006-02-24 Alan Mackenzie <bug-cc-mode@gnu.org> + + * CC Mode Update to 5.31.3. + +2006-02-24 Alan Mackenzie <bug-cc-mode@gnu.org> + + * progmodes/cc-mode.el (c-postprocess-file-styles): bind + inhibit-read-only to t, around the call to + c-remove-any-local-eval-or-mode-variables, so that it works on a + RO file. + +2006-02-24 Alan Mackenzie <bug-cc-mode@gnu.org> + + * progmodes/cc-awk.el: Correct a typo. + +2006-02-24 Alan Mackenzie <bug-cc-mode@gnu.org> + + * progmodes/cc-cmds.el, cc-mode.el: Rename c-hungry-backspace to + c-hungry-delete-backwards, at the request of RMS. Leave the old + name as an alias. + +2006-02-24 Alan Mackenzie <bug-cc-mode@gnu.org> + + * progmodes/cc-mode.el: Correct a typo. + +2006-02-24 Alan Mackenzie <bug-cc-mode@gnu.org> + + * progmodes/cc-defs.el: Update the version number to 5.31.3. + +2006-02-24 Alan Mackenzie <bug-cc-mode@gnu.org> + + * progmodes/cc-cmds.el (c-electric-brace): Fix clean-up + brace-else-brace (error due to mbeg, mend being undefined). + +2006-02-24 Alan Mackenzie <bug-cc-mode@gnu.org> + + * progmodes/cc-mode.el: File Local variables: Solve the problem + where both `mode' and c-file-offsets are specified: `mode' will + overwrite c-f-o's settings: + (c-remove-any-local-eval-or-mode-variables): new function. + (c-postprocess-file-styles): call the above new function, within + c-tentative-buffer-change, to splat `mode' and `eval' before the + second hack-local-variables. + +2006-02-24 Alan Mackenzie <bug-cc-mode@gnu.org> + + * progmodes/cc-mode.el: + [Supersedes patch to cc-engine.el V 1.45] + (c-after-change): Protect the match data with save-match-data. It + was getting corrupted by c-after-change-check-<>-operators. + + * cc-defs.el: [Supersedes patch V1.38]: + (top level): Check for a buggy font-lock-compile-keywords ONLY in + XEmacs. GNU Emacs 22 now has a check which would throw an error + here. + + * progmodes/cc-awk.el (c-awk-after-change): Protect the match data + with save-match-data. It was being corrupted when Font Lock was + not enabled. + +2006-02-24 Alan Mackenzie <bug-cc-mode@gnu.org> + + * progmodes/cc-langs.el (c-mode-menu): Add menu items for Electric + Mode and Subword Mode. + + * progmodes/cc-engine.el (c-beginning-of-statment-1): Distinguish + real labels ("case 1:" or "foo:") from non-labels ("public:"). + (c-forward-objc-directive): Replace c-forward-token-2 with crude + coding; c-f-t-2 doesn't move over a token at EOB. + + * progmodes/cc-defs.el (c-version): Update version number to + 5.31.2 + + * progmodes/cc-cmds.el, cc-mode.el, cc-engine.el + (c-update-modeline): Concatenate the minor mode indicators + directly onto mode-name, removing c-submode-indicators. + Sometimes, c-s-i got separated from the mode name on the mode + line. + + * progmodes/cc-cmds.el (c-electric-brace, c-electric-semi&comma, + c-electric-colon): Correct doc-strings: "/ln" -> "/la". + +2006-02-24 Martin Stjernholm <bug-cc-mode@gnu.org> + + * progmodes/cc-langs.el (c-make-init-lang-vars-fun): Improved the + error message when there's an evaluation error to show whether + it's loaded from source or not. + (c-filter-ops): Made it available at runtime too to work when + `c-make-init-lang-vars-fun' needs to evaluate from source. + 2006-02-24 Juanma Barranquero <lekktu@gmail.com> * help.el (help): Revert last part of 2006-02-23 change (deletion
--- a/lisp/progmodes/cc-align.el Fri Feb 24 12:20:45 2006 +0000 +++ b/lisp/progmodes/cc-align.el Fri Feb 24 15:33:02 2006 +0000 @@ -1,7 +1,7 @@ ;;; cc-align.el --- custom indentation functions for CC Mode -;; Copyright (C) 1985,1987,1992-2003, 2004, 2005, 2006 -;; Free Software Foundation, Inc. +;; Copyright (C) 1985,1987,1992-2003, 2004, 2005, 2006 Free Software +;; Foundation, Inc. ;; Authors: 1998- Martin Stjernholm ;; 1992-1999 Barry A. Warsaw
--- a/lisp/progmodes/cc-awk.el Fri Feb 24 12:20:45 2006 +0000 +++ b/lisp/progmodes/cc-awk.el Fri Feb 24 15:33:02 2006 +0000 @@ -1,7 +1,7 @@ ;;; cc-awk.el --- AWK specific code within cc-mode. -;; Copyright (C) 1988,94,96,2000, 2001, 2002, 2003, 2004, 2005, 2006 -;; Free Software Foundation, Inc. +;; Copyright (C) 1988,94,96,2000, 2001, 2002, 2003, 2004, 2005, 2006 Free +;; Software Foundation, Inc. ;; Author: Alan Mackenzie <acm@muc.de> (originally based on awk-mode.el) ;; Maintainer: FSF @@ -804,7 +804,7 @@ (defun c-awk-end-of-change-region (beg end old-len) ;; Find the end of the region which needs to be font-locked after a change. ;; This is the end of the logical line on which the change happened, either - ;; as it was before the change, or as it is now, which ever is later. + ;; as it was before the change, or as it is now, whichever is later. ;; N.B. point is left undefined. ;; ;; This function might do hidden buffer changes. @@ -822,11 +822,12 @@ (unless (and (boundp 'font-lock-mode) font-lock-mode) (save-restriction (save-excursion - (setq end (c-awk-end-of-change-region beg end old-len)) - (c-awk-beginning-of-logical-line beg) - (c-save-buffer-state nil ; So that read-only status isn't affected. + (save-match-data + (setq end (c-awk-end-of-change-region beg end old-len)) + (c-awk-beginning-of-logical-line beg) + (c-save-buffer-state nil ; So that read-only status isn't affected. ; (e.g. when first loading the buffer) - (c-awk-set-syntax-table-properties end)))))) + (c-awk-set-syntax-table-properties end))))))) ;; 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
--- a/lisp/progmodes/cc-bytecomp.el Fri Feb 24 12:20:45 2006 +0000 +++ b/lisp/progmodes/cc-bytecomp.el Fri Feb 24 15:33:02 2006 +0000 @@ -1,7 +1,7 @@ ;;; cc-bytecomp.el --- compile time setup for proper compilation -;; Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006 -;; Free Software Foundation, Inc. +;; Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software +;; Foundation, Inc. ;; Author: Martin Stjernholm ;; Maintainer: bug-cc-mode@gnu.org
--- a/lisp/progmodes/cc-cmds.el Fri Feb 24 12:20:45 2006 +0000 +++ b/lisp/progmodes/cc-cmds.el Fri Feb 24 15:33:02 2006 +0000 @@ -1,7 +1,7 @@ ;;; cc-cmds.el --- user level commands for CC Mode -;; Copyright (C) 1985,1987,1992-2003, 2004, 2005, 2006 -;; Free Software Foundation, Inc. +;; Copyright (C) 1985, 1987, 1992-2003, 2004, 2005, 2006 Free Software +;; Foundation, Inc. ;; Authors: 1998- Martin Stjernholm ;; 1992-1999 Barry A. Warsaw @@ -262,10 +262,17 @@ (boundp 'c-subword-mode) (symbol-value 'c-subword-mode)) "w" - "")))) - (setq c-submode-indicators + ""))) + (bare-mode-name (if (string-match "\\(^[^/]*\\)/" mode-name) + (substring mode-name (match-beginning 1) (match-end 1)) + mode-name))) +;; (setq c-submode-indicators +;; (if (> (length fmt) 1) +;; fmt)) + (setq mode-name (if (> (length fmt) 1) - fmt)) + (concat bare-mode-name fmt) + bare-mode-name)) (force-mode-line-update))) (defun c-toggle-syntactic-indentation (&optional arg) @@ -365,9 +372,9 @@ arg (c-in-literal))) (funcall c-backspace-function (prefix-numeric-value arg)) - (c-hungry-backspace))) - -(defun c-hungry-backspace () + (c-hungry-delete-backwards))) + +(defun c-hungry-delete-backwards () "Delete the preceding character or all preceding whitespace back to the previous non-whitespace character. See also \\[c-hungry-delete-forward]." @@ -378,6 +385,8 @@ (delete-region (point) here) (funcall c-backspace-function 1)))) +(defalias 'c-hungry-backspace 'c-hungry-delete-backwards) + (defun c-electric-delete-forward (arg) "Delete the following character or whitespace. If `c-hungry-delete-key' is non-nil (indicated by \"/h\" on the mode @@ -396,7 +405,7 @@ (defun c-hungry-delete-forward () "Delete the following character or all following whitespace up to the next non-whitespace character. -See also \\[c-hungry-backspace]." +See also \\[c-hungry-delete-backwards]." (interactive) (let ((here (point))) (c-skip-ws-forward) @@ -436,7 +445,7 @@ (if (and (fboundp 'delete-forward-p) (delete-forward-p)) (c-hungry-delete-forward) - (c-hungry-backspace))) + (c-hungry-delete-backwards))) (defun c-electric-pound (arg) "Insert a \"#\". @@ -648,7 +657,7 @@ numeric ARG hasn't been supplied, the command performs several electric actions: -\(a) If the auto-newline feature is turned on (indicated by \"/ln\" on +\(a) If the auto-newline feature is turned on (indicated by \"/la\" on the mode line) newlines are inserted before and after the brace as directed by the settings in `c-hanging-braces-alist'. @@ -752,7 +761,7 @@ "{" "\\=") nil t)) - (delete-region mbeg mend) + (delete-region (match-beginning 0) (match-end 0)) (insert-and-inherit "} else {")) ((and (memq 'brace-elseif-brace c-cleanup-list) (progn @@ -886,7 +895,7 @@ numeric ARG hasn't been supplied, the command performs several electric actions: -\(a) When the auto-newline feature is turned on (indicated by \"/ln\" on +\(a) When the auto-newline feature is turned on (indicated by \"/la\" on the mode line) a newline might be inserted. See the variable `c-hanging-semi&comma-criteria' for how newline insertion is determined. @@ -958,7 +967,7 @@ numeric ARG hasn't been supplied, the command performs several electric actions: -\(a) If the auto-newline feature is turned on (indicated by \"/ln\" on +\(a) If the auto-newline feature is turned on (indicated by \"/la\" on the mode line) newlines are inserted before and after the colon based on the settings in `c-hanging-colons-alist'.
--- a/lisp/progmodes/cc-compat.el Fri Feb 24 12:20:45 2006 +0000 +++ b/lisp/progmodes/cc-compat.el Fri Feb 24 15:33:02 2006 +0000 @@ -1,7 +1,7 @@ ;;; cc-compat.el --- cc-mode compatibility with c-mode.el confusion -;; Copyright (C) 1985,1987,1992-2003, 2004, 2005, 2006 -;; Free Software Foundation, Inc. +;; Copyright (C) 1985,1987,1992-2003, 2004, 2005, 2006 Free Software +;; Foundation, Inc. ;; Authors: 1998- Martin Stjernholm ;; 1994-1999 Barry A. Warsaw
--- a/lisp/progmodes/cc-defs.el Fri Feb 24 12:20:45 2006 +0000 +++ b/lisp/progmodes/cc-defs.el Fri Feb 24 15:33:02 2006 +0000 @@ -1,7 +1,7 @@ ;;; cc-defs.el --- compile time definitions for CC Mode -;; Copyright (C) 1985,1987,1992-2003, 2004, 2005, 2006 -;; Free Software Foundation, Inc. +;; Copyright (C) 1985,1987,1992-2003, 2004, 2005, 2006 Free Software +;; Foundation, Inc. ;; Authors: 1998- Martin Stjernholm ;; 1992-1999 Barry A. Warsaw @@ -71,10 +71,10 @@ (eval-after-load "font-lock" '(if (and (not (featurep 'cc-fix)) ; only load the file once. + (featurep 'xemacs) ; There is now (2005/12) code in GNU Emacs CVS + ; to make the call to f-l-c-k throw an error. (let (font-lock-keywords) - (condition-case nil - (font-lock-compile-keywords '("\\<\\>")) - (error nil)) + (font-lock-compile-keywords '("\\<\\>")) font-lock-keywords)) ; did the previous call foul this up? (load "cc-fix"))) @@ -82,19 +82,18 @@ ;; to ensure correct byte compilation. (eval-when-compile (if (and (not (featurep 'cc-fix)) + (featurep 'xemacs) (progn (require 'font-lock) (let (font-lock-keywords) - (condition-case nil - (font-lock-compile-keywords '("\\<\\>")) - (error nil)) + (font-lock-compile-keywords '("\\<\\>")) font-lock-keywords))) (cc-load "cc-fix"))) ;;; Variables also used at compile time. -(defconst c-version "5.31" +(defconst c-version "5.31.3" "CC Mode version number.") (defconst c-version-sym (intern c-version)) @@ -2041,5 +2040,5 @@ (cc-provide 'cc-defs) -;; arch-tag: 3bb2629d-dd84-4ff0-ad39-584be0fe3cda +;;; arch-tag: 3bb2629d-dd84-4ff0-ad39-584be0fe3cda ;;; cc-defs.el ends here
--- a/lisp/progmodes/cc-engine.el Fri Feb 24 12:20:45 2006 +0000 +++ b/lisp/progmodes/cc-engine.el Fri Feb 24 15:33:02 2006 +0000 @@ -1,7 +1,7 @@ ;;; cc-engine.el --- core syntax guessing engine for CC mode -;; Copyright (C) 1985,1987,1992-2003, 2004, 2005, 2006 -;; Free Software Foundation, Inc. +;; Copyright (C) 1985,1987,1992-2003, 2004, 2005, 2006 Free Software Foundation, +;; Inc. ;; Authors: 1998- Martin Stjernholm ;; 1992-1999 Barry A. Warsaw @@ -179,8 +179,8 @@ (make-variable-buffer-local 'c-auto-newline) ;; Included in the mode line to indicate the active submodes. -(defvar c-submode-indicators nil) -(make-variable-buffer-local 'c-submode-indicators) +;; (defvar c-submode-indicators nil) +;; (make-variable-buffer-local 'c-submode-indicators) (defun c-calculate-state (arg prevstate) ;; Calculate the new state of PREVSTATE, t or nil, based on arg. If @@ -525,14 +525,15 @@ Labels are treated as part of the following statements if IGNORE-LABELS is non-nil. (FIXME: Doesn't work if we stop at a known -statement start keyword.) - -Macros are ignored unless point is within one, in which case the -content of the macro is treated as normal code. Aside from any normal -statement starts found in it, stop at the first token of the content -in the macro, i.e. the expression of an \"#if\" or the start of the -definition in a \"#define\". Also stop at start of macros before -leaving them. +statement start keyword.) Otherwise, each label is treated as a +separate statement. + +Macros are ignored \(i.e. skipped over) unless point is within one, in +which case the content of the macro is treated as normal code. Aside +from any normal statement starts found in it, stop at the first token +of the content in the macro, i.e. the expression of an \"#if\" or the +start of the definition in a \"#define\". Also stop at start of +macros before leaving them. Return 'label if stopped at a label, 'same if stopped at the beginning of the current statement, 'up if stepped to a containing statement, @@ -547,8 +548,9 @@ NOERROR turns off error logging to `c-parsing-error'. -Normally only ';' is considered to delimit statements, but if -COMMA-DELIM is non-nil then ',' is treated likewise. +Normally only ';' and virtual semicolons are considered to delimit +statements, but if COMMA-DELIM is non-nil then ',' is treated +as a delimiter too. Note that this function might do hidden buffer changes. See the comment at the start of cc-engine.el for more info." @@ -883,6 +885,7 @@ ;; barriers in this round. (sexp-loop-end-pos pos)) + ;; The following while goes back one sexp per iteration. (while (progn (unless (c-safe (c-backward-sexp) t) @@ -954,7 +957,7 @@ ;; Like a C "continue". Analyze the next sexp. (throw 'loop t))) - sexp-loop-continue-pos) + sexp-loop-continue-pos) ; End of "go back a sexp" loop. (goto-char sexp-loop-continue-pos) (setq sexp-loop-end-pos sexp-loop-continue-pos sexp-loop-continue-pos nil)))) @@ -969,17 +972,26 @@ ;; Handle labels. (unless (eq ignore-labels t) (when (numberp c-maybe-labelp) - ;; `c-crosses-statement-barrier-p' has found a - ;; colon, so we might be in a label now. - (if after-labels-pos - (if (not last-label-pos) - (setq last-label-pos (or tok start))) - (setq after-labels-pos (or tok start))) - (setq c-maybe-labelp t - label-good-pos nil)) - - (when (and (not label-good-pos) - (looking-at c-nonlabel-token-key)) + ;; `c-crosses-statement-barrier-p' has found a colon, so we + ;; might be in a label now. Have we got a real label + ;; (including a case label) or something like C++'s "public:"? + (if (or (not (looking-at c-nonlabel-token-key)) ; proper label + (save-excursion ; e.g. "case 'a':" ? + (and (c-safe (c-backward-sexp) t) + (looking-at "\\<case\\>")))) ; FIXME!!! this is + ; wrong for AWK. 2006/1/14. + (progn + (if after-labels-pos ; Have we already encountered a label? + (if (not last-label-pos) + (setq last-label-pos (or tok start))) + (setq after-labels-pos (or tok start))) + (setq c-maybe-labelp t + label-good-pos nil)) + (setq c-maybe-labelp nil))) ; bogus "label" + + (when (and (not label-good-pos) ; i.e. no invalid "label"'s yet + ; been found. + (looking-at c-nonlabel-token-key)) ; e.g. "while :" ;; We're in a potential label and it's the first ;; time we've found something that isn't allowed in ;; one. @@ -3993,36 +4005,35 @@ ;; ;; This function might do hidden buffer changes. - (save-match-data - (save-excursion + (save-excursion + (goto-char beg) + (when (or (looking-at "[<>]") + (< (skip-chars-backward "<>") 0)) + (goto-char beg) + (c-beginning-of-current-token) + (when (and (< (point) beg) + (looking-at c-<>-multichar-token-regexp) + (< beg (setq beg (match-end 0)))) + (while (progn (skip-chars-forward "^<>" beg) + (< (point) beg)) + (c-clear-char-property (point) 'syntax-table) + (forward-char)))) + + (when (< beg end) + (goto-char end) (when (or (looking-at "[<>]") (< (skip-chars-backward "<>") 0)) - (goto-char beg) + (goto-char end) (c-beginning-of-current-token) - (when (and (< (point) beg) + (when (and (< (point) end) (looking-at c-<>-multichar-token-regexp) - (< beg (setq beg (match-end 0)))) - (while (progn (skip-chars-forward "^<>" beg) - (< (point) beg)) + (< end (setq end (match-end 0)))) + (while (progn (skip-chars-forward "^<>" end) + (< (point) end)) (c-clear-char-property (point) 'syntax-table) - (forward-char)))) - - (when (< beg end) - (goto-char end) - (when (or (looking-at "[<>]") - (< (skip-chars-backward "<>") 0)) - - (goto-char end) - (c-beginning-of-current-token) - (when (and (< (point) end) - (looking-at c-<>-multichar-token-regexp) - (< end (setq end (match-end 0)))) - (while (progn (skip-chars-forward "^<>" end) - (< (point) end)) - (c-clear-char-property (point) 'syntax-table) - (forward-char)))))))) + (forward-char))))))) ;; Dynamically bound variable that instructs `c-forward-type' to also ;; treat possible types (i.e. those that it normally returns 'maybe or @@ -5991,7 +6002,10 @@ ;; Handle the name of the class itself. (progn - (c-forward-token-2) +; (c-forward-token-2) ; 2006/1/13 This doesn't move if the token's +; at EOB. + (goto-char (match-end 0)) + (c-skip-ws-forward) (c-forward-type)) (catch 'break
--- a/lisp/progmodes/cc-langs.el Fri Feb 24 12:20:45 2006 +0000 +++ b/lisp/progmodes/cc-langs.el Fri Feb 24 15:33:02 2006 +0000 @@ -1,7 +1,7 @@ ;;; cc-langs.el --- language specific settings for CC Mode -;; Copyright (C) 1985,1987,1992-2003, 2004, 2005, 2006 -;; Free Software Foundation, Inc. +;; Copyright (C) 1985,1987,1992-2003, 2004, 2005, 2006 Free Software +;; Foundation, Inc. ;; Authors: 1998- Martin Stjernholm ;; 1992-1999 Barry A. Warsaw @@ -177,7 +177,7 @@ '(def-edebug-spec c-lang-defvar (&define name def-form &optional stringp))) -(eval-when-compile +(eval-and-compile ;; Some helper functions used when building the language constants. (defun c-filter-ops (ops opgroup-filter op-filter &optional xlate) @@ -260,10 +260,14 @@ ("Toggle..." ["Syntactic indentation" c-toggle-syntactic-indentation :style toggle :selected c-syntactic-indentation] - ["Auto newline" c-toggle-auto-newline + ["Electric mode" c-toggle-electric-state + :style toggle :selected c-electric-flag] + ["Auto newline" c-toggle-auto-newline :style toggle :selected c-auto-newline] - ["Hungry delete" c-toggle-hungry-state - :style toggle :selected c-hungry-delete-key]))) + ["Hungry delete" c-toggle-hungry-state + :style toggle :selected c-hungry-delete-key] + ["Subword mode" c-subword-mode + :style toggle :selected c-subword-mode]))) ;;; Syntax tables. @@ -2826,7 +2830,7 @@ ;; This let sets up the context for `c-mode-var' and similar ;; that could be in the result from `cl-macroexpand-all'. (let ((c-buffer-is-cc-mode ',mode) - current-var) + current-var source-eval) (condition-case err (if (eq c-version-sym ',c-version-sym) @@ -2852,6 +2856,7 @@ ;; (put ',mode 'c-has-warned-lang-consts t)) (require 'cc-langs) + (setq source-eval t) (let ((init (cdr c-lang-variable-inits))) (while init (setq current-var (caar init)) @@ -2860,8 +2865,14 @@ (error (if current-var - (message "Eval error in the `c-lang-defvar' for `%s': %S" - current-var err) + (message "Eval error in the `c-lang-defvar' for `%s'%s: %S" + current-var + (if source-eval + (format "\ + (fallback source eval - %s compiled with CC Mode %s but loaded with %s)" + ',mode ,c-version c-version) + "") + err) (signal (car err) (cdr err))))))) ;; Being evaluated from source. Always use the dynamic method to @@ -2881,8 +2892,9 @@ (error (if current-var - (message "Eval error in the `c-lang-defvar' for `%s': %S" - current-var err) + (message + "Eval error in the `c-lang-defvar' for `%s' (source eval): %S" + current-var err) (signal (car err) (cdr err))))))) ))
--- a/lisp/progmodes/cc-menus.el Fri Feb 24 12:20:45 2006 +0000 +++ b/lisp/progmodes/cc-menus.el Fri Feb 24 15:33:02 2006 +0000 @@ -1,7 +1,7 @@ ;;; cc-menus.el --- imenu support for CC Mode -;; Copyright (C) 1985,1987,1992-2003, 2004, 2005, 2006 -;; Free Software Foundation, Inc. +;; Copyright (C) 1985,1987,1992-2003, 2004, 2005, 2006 Free Software +;; Foundation, Inc. ;; Authors: 1998- Martin Stjernholm ;; 1992-1999 Barry A. Warsaw
--- a/lisp/progmodes/cc-mode.el Fri Feb 24 12:20:45 2006 +0000 +++ b/lisp/progmodes/cc-mode.el Fri Feb 24 15:33:02 2006 +0000 @@ -1,7 +1,7 @@ ;;; cc-mode.el --- major mode for editing C and similar languages -;; Copyright (C) 1985,1987,1992-2003, 2004, 2005, 2006 -;; Free Software Foundation, Inc. +;; Copyright (C) 1985,1987,1992-2003, 2004, 2005, 2006 Free Software +;; Foundation, Inc. ;; Authors: 2003- Alan Mackenzie ;; 1998- Martin Stjernholm @@ -242,9 +242,9 @@ (define-key c-mode-base-map (kbd "C-c C-<delete>") 'c-hungry-delete-forward) (define-key c-mode-base-map (kbd "C-c C-<backspace>") - 'c-hungry-backspace)) + 'c-hungry-delete-backwards)) (define-key c-mode-base-map (kbd "C-c C-<delete>") - 'c-hungry-backspace) + 'c-hungry-delete-backwards) (define-key c-mode-base-map (kbd "C-c C-<backspace>") 'c-hungry-delete-forward))) @@ -304,10 +304,11 @@ ;; `c-electric-backspace'. The hungry variants are bound to the ;; same keys but prefixed with C-c. This implies that C-c C-d is ;; `c-hungry-delete-forward'. For consistency, we bind not only C-c - ;; <backspace> to `c-hungry-backspace' but also C-c C-<backspace>, - ;; so that the Ctrl key can be held down during the whole sequence - ;; regardless of the direction. This in turn implies that we bind - ;; C-c C-<delete> to `c-hungry-delete-forward', for the same reason. + ;; <backspace> to `c-hungry-delete-backwards' but also + ;; C-c C-<backspace>, so that the Ctrl key can be held down during + ;; the whole sequence regardless of the direction. This in turn + ;; implies that we bind C-c C-<delete> to `c-hungry-delete-forward', + ;; for the same reason. ;; Bind the electric deletion functions to C-d and DEL. Emacs 21 ;; automatically maps the [delete] and [backspace] keys to these two @@ -316,8 +317,8 @@ (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-backspace) - (define-key c-mode-base-map [?\C-c ?\C-\d] 'c-hungry-backspace) + (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 <delete> on a tty. (define-key c-mode-base-map [?\C-c (control deletechar)] ; C-c C-<delete> on a tty. 'c-hungry-delete-forward) @@ -339,8 +340,10 @@ (define-key c-mode-base-map [backspace] 'c-electric-backspace) (define-key c-mode-base-map (kbd "C-c <delete>") 'c-hungry-delete) (define-key c-mode-base-map (kbd "C-c C-<delete>") 'c-hungry-delete) - (define-key c-mode-base-map (kbd "C-c <backspace>") 'c-hungry-backspace) - (define-key c-mode-base-map (kbd "C-c C-<backspace>") 'c-hungry-backspace)) + (define-key c-mode-base-map (kbd "C-c <backspace>") + 'c-hungry-delete-backwards) + (define-key c-mode-base-map (kbd "C-c C-<backspace>") + 'c-hungry-delete-backwards)) (define-key c-mode-base-map "#" 'c-electric-pound) (define-key c-mode-base-map "{" 'c-electric-brace) @@ -414,23 +417,24 @@ ;; with regions outside the current narrowing. This has been ;; observed in Emacs 20.7. (save-restriction - (widen) + (save-match-data ; c-recognize-<>-arglists changes match-data + (widen) - (when (> end (point-max)) - ;; Some emacsen might return positions past the end. This has been - ;; observed in Emacs 20.7 when rereading a buffer changed on disk - ;; (haven't been able to minimize it, but Emacs 21.3 appears to - ;; work). - (setq end (point-max)) - (when (> beg end) - (setq beg end))) + (when (> end (point-max)) + ;; Some emacsen might return positions past the end. This has been + ;; observed in Emacs 20.7 when rereading a buffer changed on disk + ;; (haven't been able to minimize it, but Emacs 21.3 appears to + ;; work). + (setq end (point-max)) + (when (> beg end) + (setq beg end))) - (c-invalidate-sws-region-after beg end) - (c-invalidate-state-cache beg) - (c-invalidate-find-decl-cache beg) + (c-invalidate-sws-region-after beg end) + (c-invalidate-state-cache beg) + (c-invalidate-find-decl-cache beg) - (when c-recognize-<>-arglists - (c-after-change-check-<>-operators beg end))))) + (when c-recognize-<>-arglists + (c-after-change-check-<>-operators beg end)))))) (defun c-basic-common-init (mode default-style) "Do the necessary initialization for the syntax handling routines @@ -550,11 +554,12 @@ (make-local-variable 'comment-indent-function) (setq comment-indent-function 'c-comment-indent) - ;; Put submode indicators onto minor-mode-alist, but only once. - (or (assq 'c-submode-indicators minor-mode-alist) - (setq minor-mode-alist - (cons '(c-submode-indicators c-submode-indicators) - minor-mode-alist))) +;; ;; Put submode indicators onto minor-mode-alist, but only once. +;; (or (assq 'c-submode-indicators minor-mode-alist) +;; (setq minor-mode-alist +;; (cons '(c-submode-indicators c-submode-indicators) +;; minor-mode-alist))) + (c-update-modeline) ;; Install the functions that ensure that various internal caches ;; don't become invalid due to buffer changes. @@ -629,6 +634,51 @@ (and (cdr rfn) (setq require-final-newline mode-require-final-newline))))) +(defun c-remove-any-local-eval-or-mode-variables () + ;; If the buffer specifies `mode' or `eval' in its File Local Variable list + ;; or on the first line, remove all occurrences. See + ;; `c-postprocess-file-styles' for justification. There is no need to save + ;; point here, or even bother too much about the buffer contents. + ;; + ;; Most of the code here is derived from Emacs 21.3's `hack-local-variables' + ;; in files.el. + (goto-char (point-max)) + (search-backward "\n\^L" (max (- (point-max) 3000) (point-min)) 'move) + (let (lv-point (prefix "") (suffix "")) + (when (let ((case-fold-search t)) + (search-forward "Local Variables:" nil t)) + (setq lv-point (point)) + ;; The prefix is what comes before "local variables:" in its line. + ;; The suffix is what comes after "local variables:" in its line. + (skip-chars-forward " \t") + (or (eolp) + (setq suffix (buffer-substring (point) + (progn (end-of-line) (point))))) + (goto-char (match-beginning 0)) + (or (bolp) + (setq prefix + (buffer-substring (point) + (progn (beginning-of-line) (point))))) + + (while (search-forward-regexp + (concat "^[ \t]*" + (regexp-quote prefix) + "\\(mode\\|eval\\):.*" + (regexp-quote suffix) + "$") + nil t) + (beginning-of-line) + (kill-line 1))) + + ;; Delete the first line, if we've got one, in case it contains a mode spec. + (unless (and lv-point + (progn (goto-char lv-point) + (forward-line 0) + (bobp))) + (goto-char (point-min)) + (unless (eobp) + (kill-line 1))))) + (defun c-postprocess-file-styles () "Function that post processes relevant file local variables in CC Mode. Currently, this function simply applies any style and offset settings @@ -656,12 +706,20 @@ ;; overwritten this. So we run `hack-local-variables' again to remedy ;; this. There are no guarantees this will work properly, particularly as ;; we have no control over what the other hook functions on - ;; `hack-local-variables-hook' would have done, or what any "eval" - ;; expression will do when evaluated again. C'est la vie! ACM, - ;; 2005/11/2. + ;; `hack-local-variables-hook' would have done. We now (2006/2/1) remove + ;; any `eval' or `mode' expressions before we evaluate again (see below). + ;; ACM, 2005/11/2. + ;; + ;; Problem (bug reported by Gustav Broberg): if one of the variables is + ;; `mode', this will invoke c-mode (etc.) again, setting up the style etc. + ;; We prevent this by temporarily removing `mode' from the Local Variables + ;; section. (if (or c-file-style c-file-offsets) - (let ((hack-local-variables-hook nil)) - (hack-local-variables))))) + (c-tentative-buffer-changes + (let ((hack-local-variables-hook nil)) + (c-remove-any-local-eval-or-mode-variables) + (hack-local-variables)) + nil)))) (add-hook 'hack-local-variables-hook 'c-postprocess-file-styles)
--- a/lisp/progmodes/cc-styles.el Fri Feb 24 12:20:45 2006 +0000 +++ b/lisp/progmodes/cc-styles.el Fri Feb 24 15:33:02 2006 +0000 @@ -1,7 +1,7 @@ ;;; cc-styles.el --- support for styles in CC Mode -;; Copyright (C) 1985,1987,1992-2003, 2004, 2005, 2006 -;; Free Software Foundation, Inc. +;; Copyright (C) 1985,1987,1992-2003, 2004, 2005, 2006 Free Software +;; Foundation, Inc. ;; Authors: 1998- Martin Stjernholm ;; 1992-1999 Barry A. Warsaw
--- a/lisp/progmodes/cc-vars.el Fri Feb 24 12:20:45 2006 +0000 +++ b/lisp/progmodes/cc-vars.el Fri Feb 24 15:33:02 2006 +0000 @@ -1,7 +1,7 @@ ;;; cc-vars.el --- user customization variables for CC Mode -;; Copyright (C) 1985,1987,1992-2003, 2004, 2005, 2006 -;; Free Software Foundation, Inc. +;; Copyright (C) 1985,1987,1992-2003, 2004, 2005, 2006 Free Software +;; Foundation, Inc. ;; Authors: 1998- Martin Stjernholm ;; 1992-1999 Barry A. Warsaw