From: Alan Mackenzie <acm@muc.de>
Cc: bug-cc-mode@gnu.org, emacs-devel <emacs-devel@gnu.org>
Subject: Re: comment-start redefined in cc-langs.el
Date: Thu, 20 Jul 2006 11:44:33 +0100 [thread overview]
Message-ID: <20060720104433.GA1575@muc.de> (raw)
In-Reply-To: <44537B33.7080600@gmx.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 <acm@muc.de>
* 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.
next prev parent reply other threads:[~2006-07-20 10:44 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-04-29 14:41 comment-start redefined in cc-langs.el martin rudalics
2006-05-02 7:58 ` Alan Mackenzie
2006-05-02 12:57 ` martin rudalics
2006-05-02 15:55 ` Alan Mackenzie
2006-07-20 10:44 ` Alan Mackenzie [this message]
2006-07-21 16:05 ` martin rudalics
2006-07-21 22:52 ` Alan Mackenzie
2006-07-21 22:13 ` martin rudalics
2006-07-24 6:59 ` martin rudalics
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20060720104433.GA1575@muc.de \
--to=acm@muc.de \
--cc=bug-cc-mode@gnu.org \
--cc=emacs-devel@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.