From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Alan Mackenzie Newsgroups: gmane.emacs.devel Subject: Re: comment-start redefined in cc-langs.el Date: Thu, 20 Jul 2006 11:44:33 +0100 Message-ID: <20060720104433.GA1575@muc.de> References: <44537B33.7080600@gmx.at> NNTP-Posting-Host: main.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Trace: sea.gmane.org 1153388637 8009 80.91.229.2 (20 Jul 2006 09:43:57 GMT) X-Complaints-To: usenet@sea.gmane.org NNTP-Posting-Date: Thu, 20 Jul 2006 09:43:57 +0000 (UTC) Cc: bug-cc-mode@gnu.org, emacs-devel Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Thu Jul 20 11:43:53 2006 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by ciao.gmane.org with esmtp (Exim 4.43) id 1G3V4S-0000SQ-2B for ged-emacs-devel@m.gmane.org; Thu, 20 Jul 2006 11:43:53 +0200 Original-Received: from localhost ([127.0.0.1] helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1G3V4Q-0007Li-BB for ged-emacs-devel@m.gmane.org; Thu, 20 Jul 2006 05:43:50 -0400 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1G3V4B-0007IB-Cj for emacs-devel@gnu.org; Thu, 20 Jul 2006 05:43:35 -0400 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1G3V49-0007F0-Kk for emacs-devel@gnu.org; Thu, 20 Jul 2006 05:43:35 -0400 Original-Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1G3V49-0007ER-51 for emacs-devel@gnu.org; Thu, 20 Jul 2006 05:43:33 -0400 Original-Received: from [193.149.48.1] (helo=mail.muc.de) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA:32) (Exim 4.52) id 1G3V4I-0000fg-JQ for emacs-devel@gnu.org; Thu, 20 Jul 2006 05:43:43 -0400 Original-Received: (qmail 44386 invoked from network); 20 Jul 2006 09:43:26 -0000 Original-Received: from acm.muc.de (HELO localhost.localdomain) (Debian-exim@193.149.49.134) by mail.muc.de with SMTP; 20 Jul 2006 09:43:26 -0000 Original-Received: from acm by localhost.localdomain with local (Exim 4.50) id 1G3W1C-000106-1I; Thu, 20 Jul 2006 11:44:34 +0100 Original-To: martin rudalics Content-Disposition: inline In-Reply-To: <44537B33.7080600@gmx.at> User-Agent: Mutt/1.5.9i X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:57372 Archived-At: 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 * 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.