Mercurial > emacs
annotate lisp/custom.el @ 20279:69a6030e443a
(kill-region): Detect read-only text
by getting an error trying to delete it.
Handle the cases where we can, and can't, get the killed text
from the undo list with much the same code.
author | Karl Heuer <kwzh@gnu.org> |
---|---|
date | Wed, 19 Nov 1997 21:36:56 +0000 |
parents | e9d8fcec9843 |
children | 20ff88ac8cc2 |
rev | line source |
---|---|
17334 | 1 ;;; custom.el -- Tools for declaring and initializing options. |
2 ;; | |
3 ;; Copyright (C) 1996, 1997 Free Software Foundation, Inc. | |
4 ;; | |
5 ;; Author: Per Abrahamsen <abraham@dina.kvl.dk> | |
6 ;; Keywords: help, faces | |
18033
bccd356a3b7c
Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17949
diff
changeset
|
7 ;; Version: 1.9900 |
17334 | 8 ;; X-URL: http://www.dina.kvl.dk/~abraham/custom/ |
9 | |
17520 | 10 ;; This file is part of GNU Emacs. |
11 | |
12 ;; GNU Emacs is free software; you can redistribute it and/or modify | |
13 ;; it under the terms of the GNU General Public License as published by | |
14 ;; the Free Software Foundation; either version 2, or (at your option) | |
15 ;; any later version. | |
16 | |
17 ;; GNU Emacs is distributed in the hope that it will be useful, | |
18 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
20 ;; GNU General Public License for more details. | |
21 | |
22 ;; You should have received a copy of the GNU General Public License | |
23 ;; along with GNU Emacs; see the file COPYING. If not, write to the | |
24 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
25 ;; Boston, MA 02111-1307, USA. | |
26 | |
17334 | 27 ;;; Commentary: |
28 ;; | |
29 ;; If you want to use this code, please visit the URL above. | |
30 ;; | |
31 ;; This file only contain the code needed to declare and initialize | |
32 ;; user options. The code to customize options is autoloaded from | |
33 ;; `cus-edit.el'. | |
34 | |
35 ;; The code implementing face declarations is in `cus-face.el' | |
36 | |
37 ;;; Code: | |
38 | |
39 (require 'widget) | |
40 | |
17550
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
41 (define-widget-keywords :initialize :set :get :require :prefix :tag |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
42 :load :link :options :type :group) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
43 |
17334 | 44 |
17415 | 45 (defvar custom-define-hook nil |
46 ;; Customize information for this option is in `cus-edit.el'. | |
47 "Hook called after defining each customize option.") | |
48 | |
17334 | 49 ;;; The `defcustom' Macro. |
50 | |
17550
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
51 (defun custom-initialize-default (symbol value) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
52 "Initialize SYMBOL with VALUE. |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
53 This will do nothing if symbol already has a default binding. |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
54 Otherwise, if symbol has a `saved-value' property, it will evaluate |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
55 the car of that and used as the default binding for symbol. |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
56 Otherwise, VALUE will be evaluated and used as the default binding for |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
57 symbol." |
17415 | 58 (unless (default-boundp symbol) |
18033
bccd356a3b7c
Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17949
diff
changeset
|
59 ;; Use the saved value if it exists, otherwise the standard setting. |
17334 | 60 (set-default symbol (if (get symbol 'saved-value) |
61 (eval (car (get symbol 'saved-value))) | |
17550
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
62 (eval value))))) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
63 |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
64 (defun custom-initialize-set (symbol value) |
19535
e9d8fcec9843
(custom-declare-variable): Use custom-initialize-reset
Richard M. Stallman <rms@gnu.org>
parents:
19516
diff
changeset
|
65 "Initialize SYMBOL based on VALUE. |
e9d8fcec9843
(custom-declare-variable): Use custom-initialize-reset
Richard M. Stallman <rms@gnu.org>
parents:
19516
diff
changeset
|
66 If the symbol doesn't have a default binding already, |
e9d8fcec9843
(custom-declare-variable): Use custom-initialize-reset
Richard M. Stallman <rms@gnu.org>
parents:
19516
diff
changeset
|
67 then set it using its `:set' function (or `set-default' if it has none). |
e9d8fcec9843
(custom-declare-variable): Use custom-initialize-reset
Richard M. Stallman <rms@gnu.org>
parents:
19516
diff
changeset
|
68 The value is either the value in the symbol's `saved-value' property, |
e9d8fcec9843
(custom-declare-variable): Use custom-initialize-reset
Richard M. Stallman <rms@gnu.org>
parents:
19516
diff
changeset
|
69 if any, or VALUE." |
17550
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
70 (unless (default-boundp symbol) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
71 (funcall (or (get symbol 'custom-set) 'set-default) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
72 symbol |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
73 (if (get symbol 'saved-value) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
74 (eval (car (get symbol 'saved-value))) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
75 (eval value))))) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
76 |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
77 (defun custom-initialize-reset (symbol value) |
19535
e9d8fcec9843
(custom-declare-variable): Use custom-initialize-reset
Richard M. Stallman <rms@gnu.org>
parents:
19516
diff
changeset
|
78 "Initialize SYMBOL based on VALUE. |
e9d8fcec9843
(custom-declare-variable): Use custom-initialize-reset
Richard M. Stallman <rms@gnu.org>
parents:
19516
diff
changeset
|
79 Set the symbol, using its `:set' function (or `set-default' if it has none). |
e9d8fcec9843
(custom-declare-variable): Use custom-initialize-reset
Richard M. Stallman <rms@gnu.org>
parents:
19516
diff
changeset
|
80 The value is either the symbol's current value |
e9d8fcec9843
(custom-declare-variable): Use custom-initialize-reset
Richard M. Stallman <rms@gnu.org>
parents:
19516
diff
changeset
|
81 \(as obtained using the `:get' function), if any, |
e9d8fcec9843
(custom-declare-variable): Use custom-initialize-reset
Richard M. Stallman <rms@gnu.org>
parents:
19516
diff
changeset
|
82 or the value in the symbol's `saved-value' property if any, |
e9d8fcec9843
(custom-declare-variable): Use custom-initialize-reset
Richard M. Stallman <rms@gnu.org>
parents:
19516
diff
changeset
|
83 or (last of all) VALUE." |
17550
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
84 (funcall (or (get symbol 'custom-set) 'set-default) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
85 symbol |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
86 (cond ((default-boundp symbol) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
87 (funcall (or (get symbol 'custom-get) 'default-value) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
88 symbol)) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
89 ((get symbol 'saved-value) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
90 (eval (car (get symbol 'saved-value)))) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
91 (t |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
92 (eval value))))) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
93 |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
94 (defun custom-initialize-changed (symbol value) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
95 "Initialize SYMBOL with VALUE. |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
96 Like `custom-initialize-reset', but only use the `:set' function if the |
19535
e9d8fcec9843
(custom-declare-variable): Use custom-initialize-reset
Richard M. Stallman <rms@gnu.org>
parents:
19516
diff
changeset
|
97 not using the standard setting. |
e9d8fcec9843
(custom-declare-variable): Use custom-initialize-reset
Richard M. Stallman <rms@gnu.org>
parents:
19516
diff
changeset
|
98 For the standard setting, use the `set-default'." |
17550
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
99 (cond ((default-boundp symbol) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
100 (funcall (or (get symbol 'custom-set) 'set-default) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
101 symbol |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
102 (funcall (or (get symbol 'custom-get) 'default-value) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
103 symbol))) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
104 ((get symbol 'saved-value) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
105 (funcall (or (get symbol 'custom-set) 'set-default) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
106 symbol |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
107 (eval (car (get symbol 'saved-value))))) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
108 (t |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
109 (set-default symbol (eval value))))) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
110 |
19516
6591f294b265
(custom-declare-variable): Rename 2nd arg to DEFAULT.
Richard M. Stallman <rms@gnu.org>
parents:
18882
diff
changeset
|
111 (defun custom-declare-variable (symbol default doc &rest args) |
6591f294b265
(custom-declare-variable): Rename 2nd arg to DEFAULT.
Richard M. Stallman <rms@gnu.org>
parents:
18882
diff
changeset
|
112 "Like `defcustom', but SYMBOL and DEFAULT are evaluated as normal arguments. |
6591f294b265
(custom-declare-variable): Rename 2nd arg to DEFAULT.
Richard M. Stallman <rms@gnu.org>
parents:
18882
diff
changeset
|
113 DEFAULT should be an expression to evaluate to compute the default value, |
6591f294b265
(custom-declare-variable): Rename 2nd arg to DEFAULT.
Richard M. Stallman <rms@gnu.org>
parents:
18882
diff
changeset
|
114 not the default value itself." |
18033
bccd356a3b7c
Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17949
diff
changeset
|
115 ;; Remember the standard setting. |
19516
6591f294b265
(custom-declare-variable): Rename 2nd arg to DEFAULT.
Richard M. Stallman <rms@gnu.org>
parents:
18882
diff
changeset
|
116 (put symbol 'standard-value (list default)) |
17415 | 117 ;; Maybe this option was rogue in an earlier version. It no longer is. |
118 (when (get symbol 'force-value) | |
119 ;; It no longer is. | |
120 (put symbol 'force-value nil)) | |
17334 | 121 (when doc |
122 (put symbol 'variable-documentation doc)) | |
19535
e9d8fcec9843
(custom-declare-variable): Use custom-initialize-reset
Richard M. Stallman <rms@gnu.org>
parents:
19516
diff
changeset
|
123 (let ((initialize 'custom-initialize-reset) |
17550
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
124 (requests nil)) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
125 (while args |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
126 (let ((arg (car args))) |
17334 | 127 (setq args (cdr args)) |
17550
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
128 (unless (symbolp arg) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
129 (error "Junk in args %S" args)) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
130 (let ((keyword arg) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
131 (value (car args))) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
132 (unless args |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
133 (error "Keyword %s is missing an argument" keyword)) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
134 (setq args (cdr args)) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
135 (cond ((eq keyword :initialize) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
136 (setq initialize value)) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
137 ((eq keyword :set) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
138 (put symbol 'custom-set value)) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
139 ((eq keyword :get) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
140 (put symbol 'custom-get value)) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
141 ((eq keyword :require) |
17576
1cc3913deaf8
(custom-declare-variable): Don't use `push'.
Richard M. Stallman <rms@gnu.org>
parents:
17550
diff
changeset
|
142 (setq requests (cons value requests))) |
17550
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
143 ((eq keyword :type) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
144 (put symbol 'custom-type value)) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
145 ((eq keyword :options) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
146 (if (get symbol 'custom-options) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
147 ;; Slow safe code to avoid duplicates. |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
148 (mapcar (lambda (option) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
149 (custom-add-option symbol option)) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
150 value) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
151 ;; Fast code for the common case. |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
152 (put symbol 'custom-options (copy-sequence value)))) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
153 (t |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
154 (custom-handle-keyword symbol keyword value |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
155 'custom-variable)))))) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
156 (put symbol 'custom-requests requests) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
157 ;; Do the actual initialization. |
19516
6591f294b265
(custom-declare-variable): Rename 2nd arg to DEFAULT.
Richard M. Stallman <rms@gnu.org>
parents:
18882
diff
changeset
|
158 (funcall initialize symbol default)) |
17334 | 159 (run-hooks 'custom-define-hook) |
160 symbol) | |
161 | |
162 (defmacro defcustom (symbol value doc &rest args) | |
163 "Declare SYMBOL as a customizable variable that defaults to VALUE. | |
164 DOC is the variable documentation. | |
165 | |
166 Neither SYMBOL nor VALUE needs to be quoted. | |
167 If SYMBOL is not already bound, initialize it to VALUE. | |
168 The remaining arguments should have the form | |
169 | |
170 [KEYWORD VALUE]... | |
171 | |
172 The following KEYWORD's are defined: | |
173 | |
17550
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
174 :type VALUE should be a widget type for editing the symbols value. |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
175 The default is `sexp'. |
17334 | 176 :options VALUE should be a list of valid members of the widget type. |
177 :group VALUE should be a customization group. | |
178 Add SYMBOL to that group. | |
17550
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
179 :initialize VALUE should be a function used to initialize the |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
180 variable. It takes two arguments, the symbol and value |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
181 given in the `defcustom' call. The default is |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
182 `custom-initialize-default' |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
183 :set VALUE should be a function to set the value of the symbol. |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
184 It takes two arguments, the symbol to set and the value to |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
185 give it. The default is `set-default'. |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
186 :get VALUE should be a function to extract the value of symbol. |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
187 The function takes one argument, a symbol, and should return |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
188 the current value for that symbol. The default is |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
189 `default-value'. |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
190 :require VALUE should be a feature symbol. Each feature will be |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
191 required after initialization, of the the user have saved this |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
192 option. |
17334 | 193 |
17442 | 194 Read the section about customization in the Emacs Lisp manual for more |
17334 | 195 information." |
17751
01342565404e
(defcustom): Get rid of eval-and-compile.
Richard M. Stallman <rms@gnu.org>
parents:
17576
diff
changeset
|
196 `(custom-declare-variable (quote ,symbol) (quote ,value) ,doc ,@args)) |
17334 | 197 |
198 ;;; The `defface' Macro. | |
199 | |
200 (defmacro defface (face spec doc &rest args) | |
201 "Declare FACE as a customizable face that defaults to SPEC. | |
202 FACE does not need to be quoted. | |
203 | |
204 Third argument DOC is the face documentation. | |
205 | |
206 If FACE has been set with `custom-set-face', set the face attributes | |
207 as specified by that function, otherwise set the face attributes | |
208 according to SPEC. | |
209 | |
210 The remaining arguments should have the form | |
211 | |
212 [KEYWORD VALUE]... | |
213 | |
17949 | 214 The following KEYWORDs are defined: |
17334 | 215 |
216 :group VALUE should be a customization group. | |
217 Add FACE to that group. | |
218 | |
219 SPEC should be an alist of the form ((DISPLAY ATTS)...). | |
220 | |
17949 | 221 The first element of SPEC where the DISPLAY matches the frame |
222 is the one that takes effect in that frame. The ATTRs in this | |
223 element take effect; the other elements are ignored, on that frame. | |
17334 | 224 |
17949 | 225 ATTS is a list of face attributes followed by their values: |
226 (ATTR VALUE ATTR VALUE...) | |
227 The possible attributes are `:bold', `:italic', `:underline', | |
228 `:foreground', `:background', `:stipple' and `:inverse-video'. | |
17334 | 229 |
17949 | 230 DISPLAY can either be the symbol t, which will match all frames, or an |
231 alist of the form \((REQ ITEM...)...). For the DISPLAY to match a | |
232 FRAME, the REQ property of the frame must match one of the ITEM. The | |
233 following REQ are defined: | |
17334 | 234 |
235 `type' (the value of `window-system') | |
236 Should be one of `x' or `tty'. | |
237 | |
238 `class' (the frame's color support) | |
239 Should be one of `color', `grayscale', or `mono'. | |
240 | |
241 `background' (what color is used for the background text) | |
242 Should be one of `light' or `dark'. | |
243 | |
17442 | 244 Read the section about customization in the Emacs Lisp manual for more |
17334 | 245 information." |
246 `(custom-declare-face (quote ,face) ,spec ,doc ,@args)) | |
247 | |
248 ;;; The `defgroup' Macro. | |
249 | |
250 (defun custom-declare-group (symbol members doc &rest args) | |
251 "Like `defgroup', but SYMBOL is evaluated as a normal argument." | |
17550
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
252 (while members |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
253 (apply 'custom-add-to-group symbol (car members)) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
254 (setq members (cdr members))) |
17334 | 255 (put symbol 'custom-group (nconc members (get symbol 'custom-group))) |
256 (when doc | |
257 (put symbol 'group-documentation doc)) | |
258 (while args | |
259 (let ((arg (car args))) | |
260 (setq args (cdr args)) | |
261 (unless (symbolp arg) | |
262 (error "Junk in args %S" args)) | |
263 (let ((keyword arg) | |
264 (value (car args))) | |
265 (unless args | |
266 (error "Keyword %s is missing an argument" keyword)) | |
267 (setq args (cdr args)) | |
268 (cond ((eq keyword :prefix) | |
269 (put symbol 'custom-prefix value)) | |
270 (t | |
271 (custom-handle-keyword symbol keyword value | |
272 'custom-group)))))) | |
273 (run-hooks 'custom-define-hook) | |
274 symbol) | |
275 | |
276 (defmacro defgroup (symbol members doc &rest args) | |
277 "Declare SYMBOL as a customization group containing MEMBERS. | |
278 SYMBOL does not need to be quoted. | |
279 | |
280 Third arg DOC is the group documentation. | |
281 | |
282 MEMBERS should be an alist of the form ((NAME WIDGET)...) where | |
283 NAME is a symbol and WIDGET is a widget is a widget for editing that | |
284 symbol. Useful widgets are `custom-variable' for editing variables, | |
285 `custom-face' for edit faces, and `custom-group' for editing groups. | |
286 | |
287 The remaining arguments should have the form | |
288 | |
289 [KEYWORD VALUE]... | |
290 | |
291 The following KEYWORD's are defined: | |
292 | |
293 :group VALUE should be a customization group. | |
294 Add SYMBOL to that group. | |
295 | |
17442 | 296 Read the section about customization in the Emacs Lisp manual for more |
17334 | 297 information." |
298 `(custom-declare-group (quote ,symbol) ,members ,doc ,@args)) | |
299 | |
300 (defun custom-add-to-group (group option widget) | |
301 "To existing GROUP add a new OPTION of type WIDGET. | |
302 If there already is an entry for that option, overwrite it." | |
303 (let* ((members (get group 'custom-group)) | |
304 (old (assq option members))) | |
305 (if old | |
306 (setcar (cdr old) widget) | |
307 (put group 'custom-group (nconc members (list (list option widget))))))) | |
308 | |
309 ;;; Properties. | |
310 | |
311 (defun custom-handle-all-keywords (symbol args type) | |
312 "For customization option SYMBOL, handle keyword arguments ARGS. | |
313 Third argument TYPE is the custom option type." | |
314 (while args | |
315 (let ((arg (car args))) | |
316 (setq args (cdr args)) | |
317 (unless (symbolp arg) | |
318 (error "Junk in args %S" args)) | |
319 (let ((keyword arg) | |
320 (value (car args))) | |
321 (unless args | |
322 (error "Keyword %s is missing an argument" keyword)) | |
323 (setq args (cdr args)) | |
324 (custom-handle-keyword symbol keyword value type))))) | |
325 | |
326 (defun custom-handle-keyword (symbol keyword value type) | |
327 "For customization option SYMBOL, handle KEYWORD with VALUE. | |
328 Fourth argument TYPE is the custom option type." | |
329 (cond ((eq keyword :group) | |
330 (custom-add-to-group value symbol type)) | |
331 ((eq keyword :link) | |
332 (custom-add-link symbol value)) | |
333 ((eq keyword :load) | |
334 (custom-add-load symbol value)) | |
335 ((eq keyword :tag) | |
336 (put symbol 'custom-tag value)) | |
337 (t | |
338 (error "Unknown keyword %s" symbol)))) | |
339 | |
340 (defun custom-add-option (symbol option) | |
341 "To the variable SYMBOL add OPTION. | |
342 | |
343 If SYMBOL is a hook variable, OPTION should be a hook member. | |
344 For other types variables, the effect is undefined." | |
345 (let ((options (get symbol 'custom-options))) | |
346 (unless (member option options) | |
347 (put symbol 'custom-options (cons option options))))) | |
348 | |
349 (defun custom-add-link (symbol widget) | |
350 "To the custom option SYMBOL add the link WIDGET." | |
351 (let ((links (get symbol 'custom-links))) | |
352 (unless (member widget links) | |
353 (put symbol 'custom-links (cons widget links))))) | |
354 | |
355 (defun custom-add-load (symbol load) | |
356 "To the custom option SYMBOL add the dependency LOAD. | |
357 LOAD should be either a library file name, or a feature name." | |
358 (let ((loads (get symbol 'custom-loads))) | |
359 (unless (member load loads) | |
360 (put symbol 'custom-loads (cons load loads))))) | |
361 | |
362 ;;; Initializing. | |
363 | |
364 (defun custom-set-variables (&rest args) | |
365 "Initialize variables according to user preferences. | |
366 | |
367 The arguments should be a list where each entry has the form: | |
368 | |
369 (SYMBOL VALUE [NOW]) | |
370 | |
371 The unevaluated VALUE is stored as the saved value for SYMBOL. | |
372 If NOW is present and non-nil, VALUE is also evaluated and bound as | |
373 the default value for the SYMBOL." | |
374 (while args | |
375 (let ((entry (car args))) | |
376 (if (listp entry) | |
17550
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
377 (let* ((symbol (nth 0 entry)) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
378 (value (nth 1 entry)) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
379 (now (nth 2 entry)) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
380 (requests (nth 3 entry)) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
381 (set (or (get symbol 'custom-set) 'set-default))) |
17334 | 382 (put symbol 'saved-value (list value)) |
17415 | 383 (cond (now |
384 ;; Rogue variable, set it now. | |
385 (put symbol 'force-value t) | |
17550
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
386 (funcall set symbol (eval value))) |
17415 | 387 ((default-boundp symbol) |
388 ;; Something already set this, overwrite it. | |
17550
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
389 (funcall set symbol (eval value)))) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
390 (when requests |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
391 (put symbol 'custom-requests requests) |
d6545cfb6c5a
Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
17529
diff
changeset
|
392 (mapcar 'require requests)) |
17334 | 393 (setq args (cdr args))) |
394 ;; Old format, a plist of SYMBOL VALUE pairs. | |
17415 | 395 (message "Warning: old format `custom-set-variables'") |
396 (ding) | |
397 (sit-for 2) | |
17334 | 398 (let ((symbol (nth 0 args)) |
399 (value (nth 1 args))) | |
400 (put symbol 'saved-value (list value))) | |
401 (setq args (cdr (cdr args))))))) | |
402 | |
403 ;;; The End. | |
404 | |
18882
539611251037
(custom-declare-variable-list): Process already-declared
Richard M. Stallman <rms@gnu.org>
parents:
18033
diff
changeset
|
405 ;; Process the defcustoms for variables loaded before this file. |
539611251037
(custom-declare-variable-list): Process already-declared
Richard M. Stallman <rms@gnu.org>
parents:
18033
diff
changeset
|
406 (while custom-declare-variable-list |
539611251037
(custom-declare-variable-list): Process already-declared
Richard M. Stallman <rms@gnu.org>
parents:
18033
diff
changeset
|
407 (apply 'custom-declare-variable (car custom-declare-variable-list)) |
539611251037
(custom-declare-variable-list): Process already-declared
Richard M. Stallman <rms@gnu.org>
parents:
18033
diff
changeset
|
408 (setq custom-declare-variable-list (cdr custom-declare-variable-list))) |
539611251037
(custom-declare-variable-list): Process already-declared
Richard M. Stallman <rms@gnu.org>
parents:
18033
diff
changeset
|
409 |
17334 | 410 (provide 'custom) |
411 | |
412 ;; custom.el ends here |