annotate lisp/custom.el @ 771:943eaba38521

[xemacs-hg @ 2002-03-13 08:51:24 by ben] The big ben-mule-21-5 check-in! Various files were added and deleted. See CHANGES-ben-mule. There are still some test suite failures. No crashes, though. Many of the failures have to do with problems in the test suite itself rather than in the actual code. I'll be addressing these in the next day or so -- none of the test suite failures are at all critical. Meanwhile I'll be trying to address the biggest issues -- i.e. build or run failures, which will almost certainly happen on various platforms. All comments should be sent to ben@xemacs.org -- use a Cc: if necessary when sending to mailing lists. There will be pre- and post- tags, something like pre-ben-mule-21-5-merge-in, and post-ben-mule-21-5-merge-in.
author ben
date Wed, 13 Mar 2002 08:54:06 +0000
parents 576fb035e263
children 4a27df428c73
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1 ;;; custom.el -- Tools for declaring and initializing options.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3 ;; Copyright (C) 1996, 1997 Free Software Foundation, Inc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5 ;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6 ;; Maintainer: Hrvoje Niksic <hniksic@xemacs.org>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7 ;; Keywords: help, faces, dumped
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8 ;; Version: 1.9960-x
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9 ;; X-URL: http://www.dina.kvl.dk/~abraham/custom/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11 ;; This file is part of XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13 ;; XEmacs is free software; you can redistribute it and/or modify
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14 ;; it under the terms of the GNU General Public License as published by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15 ;; the Free Software Foundation; either version 2, or (at your option)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16 ;; any later version.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18 ;; XEmacs is distributed in the hope that it will be useful,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21 ;; GNU General Public License for more details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23 ;; You should have received a copy of the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24 ;; along with XEmacs; see the file COPYING. If not, write to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26 ;; Boston, MA 02111-1307, USA.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28 ;;; Commentary:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30 ;; This file is dumped with XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32 ;; This file only contain the code needed to declare and initialize
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33 ;; user options. The code to customize options is autoloaded from
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34 ;; `cus-edit.el'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35 ;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36 ;; The code implementing face declarations is in `cus-face.el'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
38 ;;; Code:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 444
diff changeset
40 ;; it is now safe to put the `provide' anywhere. if an error occurs while
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 444
diff changeset
41 ;; loading, all provides (and fsets) will be undone. put it first to
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 444
diff changeset
42 ;; prevent require/provide loop with custom and cus-face.
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 444
diff changeset
43 (provide 'custom)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 444
diff changeset
44
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45 (eval-when-compile
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 444
diff changeset
46 (load "cl-macs" nil t)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 444
diff changeset
47 ;; To elude warnings.
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 444
diff changeset
48 (require 'cus-face))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
50 (autoload 'custom-declare-face "cus-face")
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
51 (autoload 'defun* "cl-macs")
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 (require 'widget)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55 (defvar custom-define-hook nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 ;; Customize information for this option is in `cus-edit.el'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 "Hook called after defining each customize option.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59 ;;; The `defcustom' Macro.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61 (defun custom-initialize-default (symbol value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62 "Initialize SYMBOL with VALUE.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63 This will do nothing if symbol already has a default binding.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 Otherwise, if symbol has a `saved-value' property, it will evaluate
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65 the car of that and used as the default binding for symbol.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66 Otherwise, VALUE will be evaluated and used as the default binding for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67 symbol."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68 (unless (default-boundp symbol)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69 ;; Use the saved value if it exists, otherwise the standard setting.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70 (set-default symbol (if (get symbol 'saved-value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71 (eval (car (get symbol 'saved-value)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72 (eval value)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74 (defun custom-initialize-set (symbol value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75 "Initialize SYMBOL with VALUE.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76 Like `custom-initialize-default', but use the function specified by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77 `:set' to initialize SYMBOL."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78 (unless (default-boundp symbol)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 (funcall (or (get symbol 'custom-set) 'set-default)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 symbol
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81 (if (get symbol 'saved-value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82 (eval (car (get symbol 'saved-value)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83 (eval value)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85 (defun custom-initialize-reset (symbol value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86 "Initialize SYMBOL with VALUE.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 Like `custom-initialize-set', but use the function specified by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88 `:get' to reinitialize SYMBOL if it is already bound."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89 (funcall (or (get symbol 'custom-set) 'set-default)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 symbol
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 (cond ((default-boundp symbol)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92 (funcall (or (get symbol 'custom-get) 'default-value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93 symbol))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 ((get symbol 'saved-value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95 (eval (car (get symbol 'saved-value))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97 (eval value)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99 (defun custom-initialize-changed (symbol value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100 "Initialize SYMBOL with VALUE.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101 Like `custom-initialize-reset', but only use the `:set' function if the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102 not using the standard setting. Otherwise, use the `set-default'."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103 (cond ((default-boundp symbol)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 (funcall (or (get symbol 'custom-set) 'set-default)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 symbol
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106 (funcall (or (get symbol 'custom-get) 'default-value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107 symbol)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108 ((get symbol 'saved-value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109 (funcall (or (get symbol 'custom-set) 'set-default)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110 symbol
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111 (eval (car (get symbol 'saved-value)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113 (set-default symbol (eval value)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115 (defun custom-declare-variable (symbol value doc &rest args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116 "Like `defcustom', but SYMBOL and VALUE are evaluated as normal arguments."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
117 ;; Remember the standard setting.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118 (put symbol 'standard-value (list value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119 ;; Maybe this option was rogue in an earlier version. It no longer is.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120 (when (eq (get symbol 'force-value) 'rogue)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121 ;; It no longer is.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122 (put symbol 'force-value nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123 (when doc
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124 (put symbol 'variable-documentation doc))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125 (let ((initialize 'custom-initialize-reset)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 (requests nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 (while args
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 (let ((arg (car args)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 (setq args (cdr args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 (check-argument-type 'keywordp arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131 (let ((keyword arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132 (value (car args)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133 (unless args
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134 (signal 'error (list "Keyword is missing an argument" keyword)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135 (setq args (cdr args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136 (cond ((eq keyword :initialize)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137 (setq initialize value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 ((eq keyword :set)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139 (put symbol 'custom-set value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 ((eq keyword :get)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141 (put symbol 'custom-get value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142 ((eq keyword :require)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143 (setq requests (cons value requests)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144 ((eq keyword :type)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145 (put symbol 'custom-type value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 ((eq keyword :options)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 (if (get symbol 'custom-options)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148 ;; Slow safe code to avoid duplicates.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 (mapc (lambda (option)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150 (custom-add-option symbol option))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151 value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152 ;; Fast code for the common case.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153 (put symbol 'custom-options (copy-sequence value))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155 (custom-handle-keyword symbol keyword value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156 'custom-variable))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 (put symbol 'custom-requests requests)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158 ;; Do the actual initialization.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159 (funcall initialize symbol value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160 ;; #### This is a rough equivalent of LOADHIST_ATTACH. However,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161 ;; LOADHIST_ATTACH also checks for `initialized'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162 (push symbol current-load-list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 (run-hooks 'custom-define-hook)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164 symbol)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166 (defmacro defcustom (symbol value doc &rest args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167 "Declare SYMBOL as a customizable variable that defaults to VALUE.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168 DOC is the variable documentation.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170 Neither SYMBOL nor VALUE needs to be quoted.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171 If SYMBOL is not already bound, initialize it to VALUE.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172 The remaining arguments should have the form
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174 [KEYWORD VALUE]...
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 The following KEYWORD's are defined:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 :type VALUE should be a widget type for editing the symbols value.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 The default is `sexp'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 :options VALUE should be a list of valid members of the widget type.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 :group VALUE should be a customization group.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182 Add SYMBOL to that group.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 :initialize VALUE should be a function used to initialize the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184 variable. It takes two arguments, the symbol and value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 given in the `defcustom' call. The default is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 `custom-initialize-set'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 :set VALUE should be a function to set the value of the symbol.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188 It takes two arguments, the symbol to set and the value to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189 give it. The default is `set-default'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190 :get VALUE should be a function to extract the value of symbol.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191 The function takes one argument, a symbol, and should return
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192 the current value for that symbol. The default is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 `default-value'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 :require VALUE should be a feature symbol. Each feature will be
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
195 required after initialization, of the user have saved this
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 option.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 Read the section about customization in the Emacs Lisp manual for more
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 information."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200 `(custom-declare-variable (quote ,symbol) (quote ,value) ,doc ,@args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202 ;;; The `defface' Macro.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204 (defmacro defface (face spec doc &rest args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205 "Declare FACE as a customizable face that defaults to SPEC.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 FACE does not need to be quoted.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208 Third argument DOC is the face documentation.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210 If FACE has been set with `custom-set-face', set the face attributes
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 as specified by that function, otherwise set the face attributes
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212 according to SPEC.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 The remaining arguments should have the form
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216 [KEYWORD VALUE]...
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 The following KEYWORDs are defined:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220 :group VALUE should be a customization group.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 Add FACE to that group.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 SPEC should be an alist of the form ((DISPLAY ATTS)...).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 ATTS is a list of face attributes and their values. The possible
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226 attributes are defined in the variable `custom-face-attributes'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 The ATTS of the first entry in SPEC where the DISPLAY matches the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229 frame should take effect in that frame. DISPLAY can either be the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 symbol t, which will match all frames, or an alist of the form
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 \((REQ ITEM...)...)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 For the DISPLAY to match a FRAME, the REQ property of the frame must
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 match one of the ITEM. The following REQ are defined:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236 `type' (the value of `window-system')
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
237 Should be one of `x', `mswindows', or `tty'.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 `class' (the frame's color support)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240 Should be one of `color', `grayscale', or `mono'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242 `background' (what color is used for the background text)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243 Should be one of `light' or `dark'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245 Read the section about customization in the Emacs Lisp manual for more
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 information."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 `(custom-declare-face (quote ,face) ,spec ,doc ,@args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 ;;; The `defgroup' Macro.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 (defun custom-declare-group (symbol members doc &rest args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 "Like `defgroup', but SYMBOL is evaluated as a normal argument."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253 (while members
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254 (apply 'custom-add-to-group symbol (car members))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255 (pop members))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256 (put symbol 'custom-group (nconc members (get symbol 'custom-group)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257 (when doc
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 (put symbol 'group-documentation doc))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259 (while args
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260 (let ((arg (car args)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261 (setq args (cdr args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262 (check-argument-type 'keywordp arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263 (let ((keyword arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 (value (car args)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265 (unless args
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266 (signal 'error (list "Keyword is missing an argument" keyword)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267 (setq args (cdr args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268 (cond ((eq keyword :prefix)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 (put symbol 'custom-prefix value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271 (custom-handle-keyword symbol keyword value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272 'custom-group))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273 (run-hooks 'custom-define-hook)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274 symbol)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
276 (defmacro defgroup (symbol members doc &rest args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
277 "Declare SYMBOL as a customization group containing MEMBERS.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
278 SYMBOL does not need to be quoted.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
279
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
280 Third arg DOC is the group documentation.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
281
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282 MEMBERS should be an alist of the form ((NAME WIDGET)...) where NAME
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 is a symbol and WIDGET is a widget for editing that symbol. Useful
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284 widgets are `custom-variable' for editing variables, `custom-face' for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285 edit faces, and `custom-group' for editing groups.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287 The remaining arguments should have the form
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
289 [KEYWORD VALUE]...
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
290
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
291 The following KEYWORD's are defined:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293 :group VALUE should be a customization group.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294 Add SYMBOL to that group.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296 Read the section about customization in the Emacs Lisp manual for more
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297 information."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
298 `(custom-declare-group (quote ,symbol) ,members ,doc ,@args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
299
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
300 (defvar custom-group-hash-table (make-hash-table :size 300 :test 'eq)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
301 "Hash-table of non-empty groups.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
303 (defun custom-add-to-group (group option widget)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304 "To existing GROUP add a new OPTION of type WIDGET.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305 If there already is an entry for that option, overwrite it."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
306 (let* ((members (get group 'custom-group))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307 (old (assq option members)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308 (if old
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309 (setcar (cdr old) widget)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310 (put group 'custom-group (nconc members (list (list option widget))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311 (puthash group t custom-group-hash-table))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313 ;;; Properties.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315 (defun custom-handle-all-keywords (symbol args type)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316 "For customization option SYMBOL, handle keyword arguments ARGS.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
317 Third argument TYPE is the custom option type."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318 (while args
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319 (let ((arg (car args)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320 (setq args (cdr args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321 (check-argument-type 'keywordp arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322 (let ((keyword arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323 (value (car args)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324 (unless args
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325 (signal 'error (list "Keyword is missing an argument" keyword)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326 (setq args (cdr args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327 (custom-handle-keyword symbol keyword value type)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 (defun custom-handle-keyword (symbol keyword value type)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 "For customization option SYMBOL, handle KEYWORD with VALUE.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 Fourth argument TYPE is the custom option type."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 (cond ((eq keyword :group)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 (custom-add-to-group value symbol type))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334 ((eq keyword :version)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335 (custom-add-version symbol value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336 ((eq keyword :link)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337 (custom-add-link symbol value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338 ((eq keyword :load)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339 (custom-add-load symbol value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340 ((eq keyword :tag)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341 (put symbol 'custom-tag value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343 (signal 'error (list "Unknown keyword" keyword)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345 (defun custom-add-option (symbol option)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346 "To the variable SYMBOL add OPTION.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348 If SYMBOL is a hook variable, OPTION should be a hook member.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349 For other types variables, the effect is undefined."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350 (let ((options (get symbol 'custom-options)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351 (unless (member option options)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
352 (put symbol 'custom-options (cons option options)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
353
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354 (defun custom-add-link (symbol widget)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355 "To the custom option SYMBOL add the link WIDGET."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356 (let ((links (get symbol 'custom-links)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
357 (unless (member widget links)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
358 (put symbol 'custom-links (cons widget links)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360 (defun custom-add-version (symbol version)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361 "To the custom option SYMBOL add the version VERSION."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 (put symbol 'custom-version version))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
364 (defun custom-add-load (symbol load)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365 "To the custom option SYMBOL add the dependency LOAD.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366 LOAD should be either a library file name, or a feature name."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367 (puthash symbol t custom-group-hash-table)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368 (let ((loads (get symbol 'custom-loads)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369 (unless (member load loads)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
370 (put symbol 'custom-loads (cons load loads)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
371
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
372 ;;; deftheme macro
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
374 (defvar custom-known-themes '(user standard)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
375 "Themes that have been defthemed.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
376
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
377 ;; #### add strings for group
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
378 ;; #### during bootstrap we cannot use cl-macs stuff
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
379 (defun* custom-define-theme (theme feature &optional doc
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
380 &key short-description immediate variable-reset-string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
381 variable-set-string face-set-string face-reset-string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
382 &allow-other-keys)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
383 (push theme custom-known-themes)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
384 (put theme 'theme-feature feature)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
385 (put theme 'theme-documentation doc)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
386 (if immediate (put theme 'theme-immediate immediate))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
387 (if variable-reset-string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
388 (put theme 'theme-variable-reset-string variable-reset-string ))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
389 (if variable-set-string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
390 (put theme 'theme-variable-set-string variable-set-string ))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
391 (if face-reset-string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
392 (put theme 'theme-face-reset-string face-reset-string ))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
393 (if face-set-string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
394 (put theme 'theme-face-set-string face-set-string ))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
395 (if short-description
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
396 (put theme 'theme-short-description short-description )))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
397
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
398 (defun custom-make-theme-feature (theme)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
399 (intern (concat (symbol-name theme) "-theme")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
400
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
401 (defmacro deftheme (theme &rest body)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
402 "(deftheme THEME &optional DOC &key KEYWORDS)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
403
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
404 Define a theme labeled by SYMBOL THEME. The optional argument DOC is a
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
405 doc string describing the theme. It is optionally followed by the
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
406 following keyword arguments
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
407
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
408 :short-description DESC
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
409 DESC is a short (one line) description of the theme. If not given DOC
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
410 is used.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
411 :immediate FLAG
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
412 If FLAG is non-nil variables set in this theme are bound
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
413 immediately when loading the theme.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
414 :variable-set-string VARIABLE_-SET-STRING
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
415 A string used by the UI to indicate that the value takes it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
416 setting from this theme. It is passed to FORMAT with the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
417 name of the theme a additional argument.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
418 If not given, a generic description is used.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
419 :variable-reset-string VARIABLE-RESET-STRING
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
420 As above but used in the case the variable has been forced to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
421 the value in this theme.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
422 :face-set-string FACE-SET-STRING
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
423 :face-reset-string FACE-RESET-STRING
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
424 As above but for faces."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
425 (let ((feature (custom-make-theme-feature theme)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
426 `(custom-define-theme (quote ,theme) (quote ,feature) ,@body)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
427
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
428 (defsubst custom-theme-p (theme)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
429 "Non-nil when THEME has been defined."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
430 (memq theme custom-known-themes))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
431
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
432 (defsubst custom-check-theme (theme)
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
433 "Check whether THEME is valid and signal an error if NOT."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
434 (unless (custom-theme-p theme)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
435 (error "Unknown theme `%s'" theme)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
436
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
437
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
438 ; #### do we need to deftheme 'user and/or 'standard here to make the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
439 ; code in cus-edit cleaner?.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
440
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
441 ;;; Initializing.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
442
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
443 (defun custom-push-theme (prop symbol theme mode value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
444 (let ((old (get symbol prop)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
445 (if (eq (car-safe (car-safe old)) theme)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
446 (setq old (cdr old)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
447 (put symbol prop (cons (list theme mode value) old))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
448
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
449 (defun custom-set-variables (&rest args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
450 "Initialize variables according to user preferences.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
451 The settings are registered as theme `user'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
452 The arguments should be a list where each entry has the form:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
453
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
454 (SYMBOL VALUE [NOW [REQUEST [COMMENT]]])
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
455
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
456 The unevaluated VALUE is stored as the saved value for SYMBOL.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
457 If NOW is present and non-nil, VALUE is also evaluated and bound as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
458 the default value for the SYMBOL.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
459 REQUEST is a list of features we must 'require for SYMBOL.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
460 COMMENT is a comment string about SYMBOL."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
461 (apply 'custom-theme-set-variables 'user args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
462
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
463 (defun custom-theme-set-variables (theme &rest args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
464 "Initialize variables according to settings specified by args.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
465 Records the settings as belonging to THEME.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
466
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
467 See `custom-set-variables' for a description of the arguments ARGS."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
468 (custom-check-theme theme)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
469 (let ((immediate (get theme 'theme-immediate)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
470 (while args * etc/custom/example-themes/example-theme.el:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
471 (let ((entry (car args)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
472 (if (listp entry)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
473 (let* ((symbol (nth 0 entry))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
474 (value (nth 1 entry))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
475 (now (nth 2 entry))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
476 (requests (nth 3 entry))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
477 (comment (nth 4 entry))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
478 (set (or (get symbol 'custom-set) 'set-default)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
479 (put symbol 'saved-value (list value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
480 (custom-push-theme 'theme-value symbol theme 'set value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
481 (put symbol 'saved-variable-comment comment)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
482 (cond ((or now immediate)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
483 ;; Rogue variable, set it now.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
484 (put symbol 'force-value (if now 'rogue 'immediate))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
485 (funcall set symbol (eval value)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
486 ((default-boundp symbol)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
487 ;; Something already set this, overwrite it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
488 (funcall set symbol (eval value))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
489 (and (or now (default-boundp symbol))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
490 (put symbol 'variable-comment comment))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
491 (when requests
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
492 (put symbol 'custom-requests requests)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
493 (mapc 'require requests))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
494 (setq args (cdr args)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
495 ;; Old format, a plist of SYMBOL VALUE pairs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
496 (message "Warning: old format `custom-set-variables'")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
497 (ding)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
498 (sit-for 2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
499 (let ((symbol (nth 0 args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
500 (value (nth 1 args)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
501 (put symbol 'saved-value (list value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
502 (custom-push-theme 'theme-value symbol theme 'set value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
503 (setq args (cdr (cdr args))))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
504
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
505 (defvar custom-loaded-themes nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
506 "Themes in the order they are loaded.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
507
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
508 (defun custom-theme-loaded-p (theme)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
509 "Return non-nil when THEME has been loaded."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
510 (memq theme custom-loaded-themes))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
511
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
512 (defun provide-theme (theme)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
513 "Indicate that this file provides THEME."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
514 (custom-check-theme theme)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
515 (provide (get theme 'theme-feature))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
516 (push theme custom-loaded-themes))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
517
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
518 (defun require-theme (theme &optional soft)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
519 "Try to load a theme by requiring its feature."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
520 ;; Note we do no check for validity of the theme here.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
521 ;; This allows to pull in themes by a file-name convention
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
522 (require (get theme 'theme-feature (custom-make-theme-feature theme))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
523
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
524 (defun custom-do-theme-reset (theme)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
525 ; #### untested! slow!
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
526 (let (spec-list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
527 (mapatoms (lambda (symbol)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
528 (setq spec-list (get symbol 'theme-value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
529 (when spec-list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
530 (setq spec-list (delete-if (lambda (elt)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
531 (eq (car elt) theme))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
532 spec-list))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
533 (put symbol 'theme-value spec-list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
534 (custom-theme-reset-internal symbol 'user))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
535 (setq spec-list (get symbol 'theme-face))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
536 (when spec-list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
537 (setq spec-list (delete-if (lambda (elt)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
538 (eq (car elt) theme))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
539 spec-list))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
540 (put symbol 'theme-face spec-list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
541 (custom-theme-reset-internal-face symbol 'user))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
542
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
543 (defun custom-theme-load-themes (by-theme &rest body)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
544 "Load the themes specified by BODY and record them as required by
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
545 theme BY-THEME. BODY is a sequence of
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
546 - a SYMBOL
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
547 require the theme SYMBOL
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
548 - a list (reset THEME)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
549 Undo all the settings made by THEME.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
550 - a list (hidden THEME)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
551 require the THEME but hide it from the user."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
552 (custom-check-theme by-theme)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
553 (dolist (theme body)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
554 (cond ((and (consp theme) (eq (car theme) 'reset))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
555 (custom-do-theme-reset (cadr theme)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
556 ((and (consp theme) (eq (car theme) 'hidden))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
557 (require-theme (cadr theme))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
558 (unless (custom-theme-loaded-p (cadr theme))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
559 (put (cadr theme) 'theme-hidden t)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
560 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
561 (require-theme theme)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
562 (remprop theme 'theme-hidden)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
563 (push theme (get by-theme 'theme-loads-themes))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
564
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
565 (defun custom-load-themes (&rest body)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
566 "Load themes for the USER theme as specified by BODY.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
567
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
568 BODY is as with custom-theme-load-themes."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
569 (apply #'custom-theme-load-themes 'user body))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
570
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
571
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
572
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
573
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
574 (defsubst copy-upto-last (elt list)
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
575 "Copy all the elements of the list upto the last occurrence of elt."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
576 ;; Is it faster to do more work in C than to do less in elisp?
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
577 (nreverse (cdr (member elt (reverse list)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
578
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
579 (defun custom-theme-value (theme theme-spec-list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
580 "Determine the value for THEME defined by THEME-SPEC-LIST.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
581 Returns (list value) if found. Nil otherwise."
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
582 ;; Note we do _NOT_ signal an error if the theme is unknown
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
583 ;; it might have gone away without the user knowing.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
584 (let ((theme-or-lower (memq theme (cons 'user custom-loaded-themes)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
585 value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
586 (mapc #'(lambda (theme-spec)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587 (when (member (car theme-spec) theme-or-lower)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
588 (setq value (cdr theme-spec))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
589 ;; We need to continue because if theme =A and we found
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
590 ;; B then if the load order is B A C B
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
591 ;; we actually want the value in C.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
592 (setq theme-or-lower (copy-upto-last (car theme-spec)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
593 theme-or-lower))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
594 ;; We could should circuit if this is now nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
595 ))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
596 theme-spec-list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
597 (if value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
598 (if (eq (car value) 'set)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
599 (list (cadr value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
600 ;; Yet another reset spec. car value = reset
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
601 (custom-theme-value (cadr value) theme-spec-list)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
602
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
603
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
604 (defun custom-theme-variable-value (variable theme)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
605 "Return (list value) value of VARIABLE in THEME if the THEME modifies the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
606 VARIABLE. Nil otherwise."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
607 (custom-theme-value theme (get variable 'theme-value)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
608
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
609 (defun custom-theme-reset-internal (symbol to-theme)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
610 (let ((value (custom-theme-variable-value symbol to-theme))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
611 was-in-theme)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
612 (setq was-in-theme value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
613 (setq value (or value (get symbol 'standard-value)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
614 (when value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
615 (put symbol 'saved-value was-in-theme)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
616 (if (or (get 'force-value symbol) (default-boundp symbol))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
617 (funcall (get symbol 'custom-set 'set-default) symbol
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
618 (eval (car value)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
619 value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
620
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
621
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
622 (defun custom-theme-reset-variables (theme &rest args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
623 "Reset the value of the variables to values previously defined.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
624 Associate this setting with THEME.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
625
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
626 ARGS is a list of lists of the form
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
627
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
628 (variable to-theme)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
629
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
630 This means reset variable to its value in to-theme."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
631 (custom-check-theme theme)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
632 (mapc #'(lambda (arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
633 (apply #'custom-theme-reset-internal arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
634 (custom-push-theme 'theme-value (car arg) theme 'reset (cadr arg)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
635 args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
636
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
637 (defun custom-reset-variables (&rest args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
638 "Reset the value of the variables to values previously defined.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
639 Associate this setting with the `user' theme.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
640
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
641 The ARGS are as in `custom-theme-reset-variables'."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
642 (apply #'custom-theme-reset-variables 'user args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
643
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
644
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
645 ;;; The End.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
646
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
647 ;; custom.el ends here