emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] master a8231e0: CC Mode now uses the new :after-hook featu


From: Alan Mackenzie
Subject: [Emacs-diffs] master a8231e0: CC Mode now uses the new :after-hook feature of define-derived-mode
Date: Mon, 9 May 2016 17:52:29 +0000 (UTC)

branch: master
commit a8231e00cbad60652ff7ab6ae51a758f1d939971
Author: Alan Mackenzie <address@hidden>
Commit: Alan Mackenzie <address@hidden>

    CC Mode now uses the new :after-hook feature of define-derived-mode
    
    It now runs internal variable setting functions after the mode hooks, no
    longer runs the mode hooks twice, and declares the configuration variables 
for
    noise macros and macros with semicolons as safe variables (when given 
suitable
    arguments).
    
    Fixes bug #16759 and bug #23476.
    
    * .dir-locals: Put the c-noise-macros-with-paren-names setting back into 
the C
    Mode value.
    
    * lisp/progmodes/cc-mode.el: (c-basic-common-init): Remove the call to
    c-make-macro-with-semi-re.
    (c-mode, c++-mode, objc-mode, java-mode, idl-mode, pike-mode, awk-mode): 
Move
    c-make-noise-macro-regexps and c-make-macro-with-semi-re (where appropriate)
    and c-update-modeline into the :after-hook form.  Remove the explicit 
settings
    of the syntax table, the abbreviation table and the local key map, since 
they
    duplicate forms generated by define-derived-mode.  Remove the explicit
    invocation of each mode's mode hook, since they duplicate ones generated by
    define-derived-mode.
    
    * lisp/progmodes/cc-vars.el: (c-string-list-p, c-string-or-string-list-p): 
New
    functions.
    (c-noise-macro-names, c-noise-macro-with-parens-names): give the
    save-local-variable property c-string-list-p.
    (c-macro-names-with-semicolon): give the save-local-variable property
    c-string-or-string-list-p.
    
    * doc/misc/cc-mode.texi: (Macros with ;, Noise Macros): Note that it's not
    necessary to call the regexp generating functions after setting the 
pertinent
    configuration values in a mode hook.
---
 .dir-locals.el            |    3 +-
 doc/misc/cc-mode.texi     |   13 ++++----
 lisp/progmodes/cc-mode.el |   72 ++++++++++++++++-----------------------------
 lisp/progmodes/cc-vars.el |   19 +++++++++++-
 4 files changed, 53 insertions(+), 54 deletions(-)

diff --git a/.dir-locals.el b/.dir-locals.el
index 9853d7b..7c14802 100644
--- a/.dir-locals.el
+++ b/.dir-locals.el
@@ -1,7 +1,8 @@
 ((nil . ((tab-width . 8)
          (sentence-end-double-space . t)
          (fill-column . 70)))
- (c-mode . ((c-file-style . "GNU")))
+ (c-mode . ((c-file-style . "GNU")
+            (c-noise-macro-with-parens-names . ("IF_LINT"))))
  (objc-mode . ((c-file-style . "GNU")))
  (log-edit-mode . ((log-edit-font-lock-gnu-style . t)
                    (log-edit-setup-add-author . t)))
diff --git a/doc/misc/cc-mode.texi b/doc/misc/cc-mode.texi
index 70146b2..82f8cbc 100644
--- a/doc/misc/cc-mode.texi
+++ b/doc/misc/cc-mode.texi
@@ -6767,10 +6767,10 @@ example:
 @defun c-make-macro-with-semi-re
 @findex make-macro-with-semi-re (c-)
 Call this (non-interactive) function, which sets internal variables,
-each time you change the value of
address@hidden  It takes no arguments, and its
+each time you change the value of @code{c-macro-names-with-semicolon}
+after the major mode function has run.  It takes no arguments, and its
 return value has no meaning.  This function is called by @ccmode{}'s
-initialization code.
+initialization code, after the mode hooks have run.
 @end defun
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -6822,9 +6822,10 @@ but doing so is OK.
 @defun c-make-noise-macro-regexps
 @findex make-noise-macro-regexps (c-)
 Call this (non-interactive) function, which sets internal variables,
-after changing the value of @code{c-noise-macro-names} or
address@hidden (e.g. in a hook (@pxref{CC
-Hooks})).  This function is called by @ccmode{}'s initialization code.
+on changing the value of @code{c-noise-macro-names} or
address@hidden after the major mode's function
+has run.  This function is called by @ccmode{}'s initialization code,
+after the mode hooks have run.
 @end defun
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
diff --git a/lisp/progmodes/cc-mode.el b/lisp/progmodes/cc-mode.el
index 2ab1d6b..6a78992 100644
--- a/lisp/progmodes/cc-mode.el
+++ b/lisp/progmodes/cc-mode.el
@@ -596,7 +596,6 @@ that requires a literal mode spec at compile time."
                                     (not (string-equal c-indentation-style
                                                        style)))))))
   (c-setup-paragraph-variables)
-  (c-make-noise-macro-regexps)
 
   ;; we have to do something special for c-offsets-alist so that the
   ;; buffer local value has its own alist structure.
@@ -1487,18 +1486,16 @@ initialization, then `c-mode-hook'.
 
 Key bindings:
 \\{c-mode-map}"
+  :after-hook (progn (c-make-noise-macro-regexps)
+                    (c-make-macro-with-semi-re)
+                    (c-update-modeline))
   (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)
+  (setq abbrev-mode t)
   (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))
+  (c-run-mode-hooks 'c-mode-common-hook))
 
 
 ;; Support for C++
@@ -1542,18 +1539,16 @@ initialization, then `c++-mode-hook'.
 
 Key bindings:
 \\{c++-mode-map}"
+  :after-hook (progn (c-make-noise-macro-regexps)
+                    (c-make-macro-with-semi-re)
+                    (c-update-modeline))
   (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)
+  (setq abbrev-mode t)
   (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))
+  (c-run-mode-hooks 'c-mode-common-hook))
 
 
 ;; Support for Objective-C
@@ -1595,18 +1590,16 @@ initialization, then `objc-mode-hook'.
 
 Key bindings:
 \\{objc-mode-map}"
+  :after-hook (progn (c-make-noise-macro-regexps)
+                    (c-make-macro-with-semi-re)
+                    (c-update-modeline))
   (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)
+  (setq abbrev-mode t)
   (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))
+  (c-run-mode-hooks 'c-mode-common-hook))
 
 
 ;; Support for Java
@@ -1656,17 +1649,14 @@ initialization, then `java-mode-hook'.
 
 Key bindings:
 \\{java-mode-map}"
+  :after-hook (c-update-modeline)
   (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)
+  (setq abbrev-mode t)
   (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))
+  (c-run-mode-hooks 'c-mode-common-hook))
 
 
 ;; Support for CORBA's IDL language
@@ -1705,16 +1695,13 @@ initialization, then `idl-mode-hook'.
 
 Key bindings:
 \\{idl-mode-map}"
+  :after-hook (c-update-modeline)
   (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)
   (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))
+  (c-run-mode-hooks 'c-mode-common-hook))
 
 
 ;; Support for Pike
@@ -1757,17 +1744,14 @@ initialization, then `pike-mode-hook'.
 
 Key bindings:
 \\{pike-mode-map}"
+  :after-hook (c-update-modeline)
   (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)
+  (setq        abbrev-mode t)
   (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))
+  (c-run-mode-hooks 'c-mode-common-hook))
 
 
 ;; Support for AWK
@@ -1821,22 +1805,18 @@ initialization, then `awk-mode-hook'.
 
 Key bindings:
 \\{awk-mode-map}"
+  :after-hook (c-update-modeline)
   ;; 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)
+  (setq        abbrev-mode t)
   (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))
+  (c-run-mode-hooks 'c-mode-common-hook))
 
 
 ;; bug reporting
diff --git a/lisp/progmodes/cc-vars.el b/lisp/progmodes/cc-vars.el
index 98195da..8cad27f 100644
--- a/lisp/progmodes/cc-vars.el
+++ b/lisp/progmodes/cc-vars.el
@@ -229,7 +229,20 @@ See `c-offsets-alist'."
               (setq offset (cdr offset)))
             (null offset)))))
 
-
+(defun c-string-list-p (val)
+  "Return non-nil if VAL is a list of strings."
+  (and
+   (listp val)
+   (catch 'string
+     (dolist (elt val)
+       (if (not (stringp elt))
+          (throw 'string nil)))
+     t)))
+
+(defun c-string-or-string-list-p (val)
+  "Return non-nil if VAL is a string or a list of strings."
+  (or (stringp val)
+      (c-string-list-p val)))
 
 ;;; User variables
 
@@ -1633,6 +1646,7 @@ If you change this variable's value, call the function
 this implicitly by reinitializing C/C++/Objc Mode on any buffer)."
   :type '(repeat :tag "List of names" string)
   :group 'c)
+(put 'c-noise-macro-names 'safe-local-variable #'c-string-list-p)
 
 (defcustom c-noise-macro-with-parens-names nil
   "A list of names of macros \(or compiler extensions like \"__attribute__\")
@@ -1640,6 +1654,7 @@ which optionally have arguments in parentheses, and which 
expand to nothing.
 These are recognized by CC Mode only in declarations."
   :type '(regexp :tag "List of names (possibly empty)" string)
   :group 'c)
+(put 'c-noise-macro-with-parens-names 'safe-local-variable #'c-string-list-p)
 
 (defun c-make-noise-macro-regexps ()
   ;; Convert `c-noise-macro-names' and `c-noise-macro-with-parens-names' into
@@ -1690,6 +1705,8 @@ variables.
 Note that currently \(2008-11-04) this variable is a prototype,
 and is likely to disappear or change its form soon.")
 (make-variable-buffer-local 'c-macro-names-with-semicolon)
+(put 'c-macro-names-with-semicolon 'safe-local-variable
+     #'c-string-or-string-list-p)
 
 (defun c-make-macro-with-semi-re ()
   ;; Convert `c-macro-names-with-semicolon' into the regexp



reply via email to

[Prev in Thread] Current Thread [Next in Thread]