changeset 79560:775eab7b2975

(defcustom-c-stylevar): Rewrite.
author Thien-Thi Nguyen <ttn@gnuvola.org>
date Wed, 12 Dec 2007 08:00:45 +0000
parents 415850ba0b0f
children 638444060b82
files lisp/progmodes/cc-vars.el
diffstat 1 files changed, 35 insertions(+), 24 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/progmodes/cc-vars.el	Tue Dec 11 05:50:37 2007 +0000
+++ b/lisp/progmodes/cc-vars.el	Wed Dec 12 08:00:45 2007 +0000
@@ -156,34 +156,45 @@
   (setq c-fallback-style (cons (cons name val) c-fallback-style)))
 
 (defmacro defcustom-c-stylevar (name val doc &rest args)
-  "Defines a style variable."
-  `(let ((-value- ,val))
-     (c-set-stylevar-fallback ',name -value-)
-     (custom-declare-variable
-      ',name ''set-from-style
-      ,(concat doc "
+  "Define a style variable NAME with VAL and DOC.
+More precisely, convert the given `:type FOO', mined out of ARGS,
+to an aggregate `:type (radio STYLE (PREAMBLE FOO))', append some
+some boilerplate documentation to DOC, arrange for the fallback
+value of NAME to be VAL, and call `custom-declare-variable' to
+do the rest of the work.
+
+STYLE stands for the choice where the value is taken from some
+style setting.  PREAMBLE is optionally prepended to FOO; that is,
+if FOO contains :tag or :value, the respective two-element list
+component is ignored."
+  (declare (debug (symbolp form stringp &rest)))
+  (let* ((expanded-doc (concat doc "
 
 This is a style variable.  Apart from the valid values described
-above, it can be set to the symbol `set-from-style'.  In that case, it
-takes its value from the style system (see `c-default-style' and
+above, it can be set to the symbol `set-from-style'.  In that case,
+it takes its value from the style system (see `c-default-style' and
 `c-style-alist') when a CC Mode buffer is initialized.  Otherwise,
 the value set here overrides the style system (there is a variable
-`c-old-style-variable-behavior' that changes this, though).")
-      ,@(plist-put
-	 args ':type
-	 `(` (radio
-	      (const :tag "Use style settings"
-		     set-from-style)
-	      ,(, (let ((type (eval (plist-get args ':type))))
-		    (unless (consp type)
-		      (setq type (list type)))
-		    (unless (c-safe (plist-get (cdr type) ':value))
-		      (setcdr type (append '(:value (, -value-))
-					   (cdr type))))
-		    (unless (c-safe (plist-get (cdr type) ':tag))
-		      (setcdr type (append '(:tag "Override style settings")
-					   (cdr type))))
-		    (bq-process type)))))))))
+`c-old-style-variable-behavior' that changes this, though)."))
+         (typ (eval name (plist-get args :type)))
+         (type (if (consp typ) typ (list typ)))
+         (head (car type))
+         (tail (cdr type))
+         (newt (append (unless (plist-get tail :tag)
+                         '(:tag "Override style settings"))
+                       (unless (plist-get tail :value)
+                         `(:value ,val))
+                       tail))
+         (aggregate `'(radio
+                       (const :tag "Use style settings" set-from-style)
+                       ,(cons head newt))))
+    (message "aggregate: %S" aggregate)
+    `(progn
+       (c-set-stylevar-fallback ',name ,val)
+       (custom-declare-variable
+        ',name ''set-from-style
+        ,expanded-doc
+        ,@(plist-put args :type aggregate)))))
 
 (defun c-valid-offset (offset)
   "Return non-nil if OFFSET is a valid offset for a syntactic symbol.