emacs-devel
[Top][All Lists]
Advanced

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

Re: comment-start redefined in cc-langs.el


From: Alan Mackenzie
Subject: Re: comment-start redefined in cc-langs.el
Date: Thu, 20 Jul 2006 11:44:33 +0100
User-agent: Mutt/1.5.9i

Good Morning, Martin!

On Sat, Apr 29, 2006 at 04:41:55PM +0200, martin rudalics wrote:
> With emacs -Q do

> C-h v comment-start RET

> gets me

> comment-start is a variable defined in `newcomment.el'
> ...

> Now load cc-mode in a new buffer, return to scratch, and do again

> C-h v comment-start RET

> gets me

> comment-start is a variable defined in `cc-engine.el'
> ...

OK, here is a patch.

Basically, the declarations like (c-lang-defvar comment-start ....) (in
cc-langs.el ~L1131) were causing forms (defvar comment-start ...) to get
generated in cc-engine.el (via the macro c-declare-lang-variables).

I have added the macro c-lang-setvar which does all the fancy stuff that
c-lang-defvar does, only without generating the defvar.

Please let me know if there are any problems with this patch.


2006-07-20  Alan Mackenzie  <address@hidden>

        * progmodes/cc-langs.el (c-emacs-variable-inits): new variable.
        (c-lang-setvar): new macro.
        (c-make-init-lang-vars-fun): Use the initialization forms in
        c-emacs-variable-inits in addition to those in c-lang-variable-inits.
        (comment-start, comment-end, comment-start-skip): Change these from
        c-lang-defvar's to c-lang-setvar's.

        * progmodes/cc-mode.el (c-make-emacs-variables-local): new macro,
        which calls make-local-variable on the elements of
        c-emacs-variable-inits.
        (c-init-language-vars-for): Call this new macro.


Index: cc-langs.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/progmodes/cc-langs.el,v
retrieving revision 1.39
diff -c -r1.39 cc-langs.el
*** cc-langs.el 10 Jul 2006 13:17:09 -0000      1.39
--- cc-langs.el 20 Jul 2006 09:18:43 -0000
***************
*** 134,145 ****
  
  (eval-and-compile
    ;; These are used to collect the init forms from the subsequent
!   ;; `c-lang-defvar'.  They are used to build the lambda in
!   ;; `c-make-init-lang-vars-fun' below.
    (defvar c-lang-variable-inits nil)
    (defvar c-lang-variable-inits-tail nil)
    (setq c-lang-variable-inits (list nil)
!       c-lang-variable-inits-tail c-lang-variable-inits))
  
  (defmacro c-lang-defvar (var val &optional doc)
    "Declares the buffer local variable VAR to get the value VAL.  VAL is
--- 134,151 ----
  
  (eval-and-compile
    ;; These are used to collect the init forms from the subsequent
!   ;; `c-lang-defvar' and `c-lang-setvar'.  They are used to build the
!   ;;  lambda in `c-make-init-lang-vars-fun' below, and to build `defvar's
!   ;;  and `make-variable-buffer-local's in cc-engine and
!   ;;  `make-local-variable's in `c-init-language-vars-for'.
    (defvar c-lang-variable-inits nil)
    (defvar c-lang-variable-inits-tail nil)
    (setq c-lang-variable-inits (list nil)
!       c-lang-variable-inits-tail c-lang-variable-inits)
!   (defvar c-emacs-variable-inits nil)
!   (defvar c-emacs-variable-inits-tail nil)
!   (setq c-emacs-variable-inits (list nil)
!       c-emacs-variable-inits-tail c-emacs-variable-inits))
  
  (defmacro c-lang-defvar (var val &optional doc)
    "Declares the buffer local variable VAR to get the value VAL.  VAL is
***************
*** 172,177 ****
--- 178,202 ----
    ;; Return the symbol, like the other def* forms.
    `',var)
  
+ (defmacro c-lang-setvar (var val)
+   "Causes the variable VAR to be made buffer local and to get set to the
+ value VAL.  VAL is evaluated and assigned at mode initialization.  More
+ precisely, VAL is evaluated and bound to VAR when the result from the
+ macro `c-init-language-vars' is evaluated.  VAR is typically a standard
+ Emacs variable like `comment-start'.
+ 
+ `c-lang-const' is typically used in VAL to get the right value for the
+ language being initialized, and such calls will be macro expanded to
+ the evaluated constant value at compile time."
+   (let ((elem (assq var (cdr c-emacs-variable-inits))))
+     (if elem
+       (setcdr elem (list val)) ; Maybe remove "list", sometime. 2006-07-19
+       (setcdr c-emacs-variable-inits-tail (list (list var val)))
+       (setq c-emacs-variable-inits-tail (cdr c-emacs-variable-inits-tail))))
+ 
+   ;; Return the symbol, like the other def* forms.
+   `',var)
+ 
  (put 'c-lang-defvar 'lisp-indent-function 'defun)
  ; (eval-after-load "edebug" ; 2006-07-09: def-edebug-spec is now in subr.el.
  ;  '
***************
*** 1103,1110 ****
    ;; In C we still default to the block comment style since line
    ;; comments aren't entirely portable.
    c "/* ")
! (c-lang-defvar comment-start (c-lang-const comment-start)
!   'dont-doc)
  
  (c-lang-defconst comment-end
    "String that ends comments inserted with M-; etc.
--- 1128,1134 ----
    ;; In C we still default to the block comment style since line
    ;; comments aren't entirely portable.
    c "/* ")
! (c-lang-setvar comment-start (c-lang-const comment-start))
  
  (c-lang-defconst comment-end
    "String that ends comments inserted with M-; etc.
***************
*** 1117,1124 ****
                      (c-lang-const comment-start))
        (concat " " (c-lang-const c-block-comment-ender))
        ""))
! (c-lang-defvar comment-end (c-lang-const comment-end)
!   'dont-doc)
  
  (c-lang-defconst comment-start-skip
    "Regexp to match the start of a comment plus everything up to its body.
--- 1141,1147 ----
                      (c-lang-const comment-start))
        (concat " " (c-lang-const c-block-comment-ender))
        ""))
! (c-lang-setvar comment-end (c-lang-const comment-end))
  
  (c-lang-defconst comment-start-skip
    "Regexp to match the start of a comment plus everything up to its body.
***************
*** 1134,1141 ****
                           (c-lang-const c-block-comment-starter)))
             "\\|")
            "\\)\\s *"))
! (c-lang-defvar comment-start-skip (c-lang-const comment-start-skip)
!   'dont-doc)
  
  (c-lang-defconst c-syntactic-ws-start
    ;; Regexp matching any sequence that can start syntactic whitespace.
--- 1157,1163 ----
                           (c-lang-const c-block-comment-starter)))
             "\\|")
            "\\)\\s *"))
! (c-lang-setvar comment-start-skip (c-lang-const comment-start-skip))
  
  (c-lang-defconst c-syntactic-ws-start
    ;; Regexp matching any sequence that can start syntactic whitespace.
***************
*** 2806,2814 ****
  ;;; Wrap up the `c-lang-defvar' system.
  
  ;; Compile in the list of language variables that has been collected
! ;; with the `c-lang-defvar' macro.  Note that the first element is
! ;; nil.
  (defconst c-lang-variable-inits (cc-eval-when-compile c-lang-variable-inits))
  
  (defun c-make-init-lang-vars-fun (mode)
    "Create a function that initializes all the language dependent variables
--- 2828,2837 ----
  ;;; Wrap up the `c-lang-defvar' system.
  
  ;; Compile in the list of language variables that has been collected
! ;; with the `c-lang-defvar' and `c-lang-setvar' macros.  Note that the
! ;; first element of each is nil.
  (defconst c-lang-variable-inits (cc-eval-when-compile c-lang-variable-inits))
+ (defconst c-emacs-variable-inits (cc-eval-when-compile 
c-emacs-variable-inits))
  
  (defun c-make-init-lang-vars-fun (mode)
    "Create a function that initializes all the language dependent variables
***************
*** 2841,2852 ****
                             ;; `c-lang-const' will expand to the evaluated
                             ;; constant immediately in `cl-macroexpand-all'
                             ;; below.
!                            (mapcan
!                             (lambda (init)
!                               `(current-var ',(car init)
!                                 ,(car init) ,(cl-macroexpand-all
!                                               (elt init 1))))
!                             (cdr c-lang-variable-inits))))
  
                 ;; This diagnostic message isn't useful for end
                 ;; users, so it's disabled.
--- 2864,2879 ----
                             ;; `c-lang-const' will expand to the evaluated
                             ;; constant immediately in `cl-macroexpand-all'
                             ;; below.
!                             (mapcan
!                              (lambda (init)
!                                `(current-var ',(car init)
!                                  ,(car init) ,(cl-macroexpand-all
!                                                (elt init 1))))
!                              ;; Note: The following `append' copies the
!                              ;; first argument.  That list is small, so
!                              ;; this doesn't matter too much.
!                             (append (cdr c-emacs-variable-inits)
!                                     (cdr c-lang-variable-inits)))))
  
                 ;; This diagnostic message isn't useful for end
                 ;; users, so it's disabled.
***************
*** 2859,2865 ****
  
                 (require 'cc-langs)
                 (setq source-eval t)
!                (let ((init (cdr c-lang-variable-inits)))
                   (while init
                     (setq current-var (caar init))
                     (set (caar init) (eval (cadar init)))
--- 2886,2893 ----
  
                 (require 'cc-langs)
                 (setq source-eval t)
!                (let ((init (append (cdr c-emacs-variable-inits)
!                                    (cdr c-lang-variable-inits))))
                   (while init
                     (setq current-var (caar init))
                     (set (caar init) (eval (cadar init)))
***************
*** 2867,2873 ****
  
             (error
              (if current-var
!                 (message "Eval error in the `c-lang-defvar' for `%s'%s: %S"
                           current-var
                           (if source-eval
                               (format "\
--- 2895,2901 ----
  
             (error
              (if current-var
!                 (message "Eval error in the `c-lang-defvar' or 
`c-lang-setvar' for `%s'%s: %S"
                           current-var
                           (if source-eval
                               (format "\
***************
*** 2883,2889 ****
      `(lambda ()
         (require 'cc-langs)
         (let ((c-buffer-is-cc-mode ',mode)
!            (init (cdr c-lang-variable-inits))
             current-var)
         (condition-case err
  
--- 2911,2918 ----
      `(lambda ()
         (require 'cc-langs)
         (let ((c-buffer-is-cc-mode ',mode)
!            (init (append (cdr c-emacs-variable-inits)
!                          (cdr c-lang-variable-inits)))
             current-var)
         (condition-case err
  
***************
*** 2895,2901 ****
           (error
            (if current-var
                (message
!                "Eval error in the `c-lang-defvar' for `%s' (source eval): %S"
                 current-var err)
              (signal (car err) (cdr err)))))))
      ))
--- 2924,2930 ----
           (error
            (if current-var
                (message
!                "Eval error in the `c-lang-defvar' or `c-lang-setver' for `%s' 
(source eval): %S"
                 current-var err)
              (signal (car err) (cdr err)))))))
      ))
Index: cc-mode.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/progmodes/cc-mode.el,v
retrieving revision 1.48
diff -c -r1.48 cc-mode.el
*** cc-mode.el  10 Jul 2006 13:17:09 -0000      1.48
--- cc-mode.el  20 Jul 2006 09:18:47 -0000
***************
*** 153,164 ****
--- 153,173 ----
  (defun c-leave-cc-mode-mode ()
    (setq c-buffer-is-cc-mode nil))
  
+ ;; Make the `c-lang-setvar' variables buffer local in the current buffer.
+ ;; These are typically standard emacs variables such as `comment-start'.
+ (defmacro c-make-emacs-variables-local ()
+   `(progn
+      ,@(mapcan (lambda (init)
+                `((make-local-variable ',(car init))))
+              (cdr c-emacs-variable-inits))))
+ 
  (defun c-init-language-vars-for (mode)
    "Initialize the language variables for one of the language modes
  directly supported by CC Mode.  This can be used instead of the
  `c-init-language-vars' macro if the language you want to use is one of
  those, rather than a derived language defined through the language
  variable system (see \"cc-langs.el\")."
+   (c-make-emacs-variables-local)
    (cond ((eq mode 'c-mode)    (c-init-language-vars c-mode))
        ((eq mode 'c++-mode)  (c-init-language-vars c++-mode))
        ((eq mode 'objc-mode) (c-init-language-vars objc-mode))



-- 
Alan.





reply via email to

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