;;; cus-edit.el --- tools for customizing Emacs and Lisp packages
;;
-;; Copyright (C) 1996, 1997, 1999, 2000, 2001 Free Software Foundation, Inc.
+;; Copyright (C) 1996, 1997, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
;;
;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
;; Keywords: help, faces
(defcustom custom-unlispify-remove-prefixes nil
"Non-nil means remove group prefixes from option names in buffer."
:group 'custom-menu
+ :group 'custom-buffer
:type 'boolean)
(defun custom-unlispify-menu-entry (symbol &optional no-suffix)
(list var val))))
;;;###autoload
-(defun customize-set-value (var val &optional comment)
- "Set VARIABLE to VALUE. VALUE is a Lisp object.
+(defun customize-set-value (variable value &optional comment)
+ "Set VARIABLE to VALUE, and return VALUE. VALUE is a Lisp object.
If VARIABLE has a `variable-interactive' property, that is used as if
it were the arg to `interactive' (which see) to interactively read the value.
"Set %s to value: "
current-prefix-arg))
- (set var val)
(cond ((string= comment "")
- (put var 'variable-comment nil))
+ (put variable 'variable-comment nil))
(comment
- (put var 'variable-comment comment))))
+ (put variable 'variable-comment comment)))
+ (set variable value))
;;;###autoload
(defun customize-set-variable (variable value &optional comment)
- "Set the default for VARIABLE to VALUE. VALUE is a Lisp object.
+ "Set the default for VARIABLE to VALUE, and return VALUE.
+VALUE is a Lisp object.
If VARIABLE has a `custom-set' property, that is used for setting
VARIABLE, otherwise `set-default' is used.
(interactive (custom-prompt-variable "Set variable: "
"Set customized value for %s to: "
current-prefix-arg))
+ (custom-load-symbol variable)
(funcall (or (get variable 'custom-set) 'set-default) variable value)
(put variable 'customized-value (list (custom-quote value)))
(cond ((string= comment "")
(put variable 'customized-variable-comment nil))
(comment
(put variable 'variable-comment comment)
- (put variable 'customized-variable-comment comment))))
+ (put variable 'customized-variable-comment comment)))
+ value)
;;;###autoload
-(defun customize-save-variable (var value &optional comment)
+(defun customize-save-variable (variable value &optional comment)
"Set the default for VARIABLE to VALUE, and save it for future sessions.
+Return VALUE.
+
If VARIABLE has a `custom-set' property, that is used for setting
VARIABLE, otherwise `set-default' is used.
`:prompt-value' property of that widget will be used for reading the value.
If given a prefix (or a COMMENT argument), also prompt for a comment."
- (interactive (custom-prompt-variable "Set and ave variable: "
+ (interactive (custom-prompt-variable "Set and save variable: "
"Set and save value for %s as: "
current-prefix-arg))
- (funcall (or (get var 'custom-set) 'set-default) var value)
- (put var 'saved-value (list (custom-quote value)))
+ (funcall (or (get variable 'custom-set) 'set-default) variable value)
+ (put variable 'saved-value (list (custom-quote value)))
(cond ((string= comment "")
- (put var 'variable-comment nil)
- (put var 'saved-variable-comment nil))
+ (put variable 'variable-comment nil)
+ (put variable 'saved-variable-comment nil))
(comment
- (put var 'variable-comment comment)
- (put var 'saved-variable-comment comment)))
- (custom-save-all))
+ (put variable 'variable-comment comment)
+ (put variable 'saved-variable-comment comment)))
+ (custom-save-all)
+ value)
;;;###autoload
(defun customize ()
(format "*Customize Option: %s*" (custom-unlispify-tag-name symbol))))
;;;###autoload
-(defun customize-face (&optional symbol)
+(defun customize-face (&optional face)
"Customize SYMBOL, which should be a face name or nil.
-If SYMBOL is nil, customize all faces."
- (interactive (list (completing-read "Customize face: (default all) "
- obarray 'custom-facep t)))
- (if (or (null symbol) (and (stringp symbol) (zerop (length symbol))))
+If SYMBOL is nil, customize all faces.
+
+Interactively, when point is on text which has a face specified,
+suggest to customized that face, if it's customizable."
+ (interactive
+ (list (read-face-name "Customize face" "all faces" t)))
+ (if (member face '(nil ""))
+ (setq face (face-list)))
+ (if (and (listp face) (null (cdr face)))
+ (setq face (car face)))
+ (if (listp face)
(custom-buffer-create (custom-sort-items
- (mapcar (lambda (symbol)
- (list symbol 'custom-face))
- (face-list))
+ (mapcar (lambda (s)
+ (list s 'custom-face))
+ face)
t nil)
"*Customize Faces*")
- (when (stringp symbol)
- (setq symbol (intern symbol)))
- (unless (symbolp symbol)
- (error "Should be a symbol %S" symbol))
- (custom-buffer-create (list (list symbol 'custom-face))
+ (unless (facep face)
+ (error "Invalid face %S"))
+ (custom-buffer-create (list (list face 'custom-face))
(format "*Customize Face: %s*"
- (custom-unlispify-tag-name symbol)))))
+ (custom-unlispify-tag-name face)))))
;;;###autoload
-(defun customize-face-other-window (&optional symbol)
- "Show customization buffer for face SYMBOL in other window."
- (interactive (list (completing-read "Customize face: "
- obarray 'custom-facep t)))
- (if (or (null symbol) (and (stringp symbol) (zerop (length symbol))))
- ()
- (if (stringp symbol)
- (setq symbol (intern symbol)))
- (unless (symbolp symbol)
- (error "Should be a symbol %S" symbol))
+(defun customize-face-other-window (&optional face)
+ "Show customization buffer for face SYMBOL in other window.
+
+Interactively, when point is on text which has a face specified,
+suggest to customized that face, if it's customizable."
+ (interactive
+ (list (read-face-name "Customize face" "all faces" t)))
+ (if (member face '(nil ""))
+ (setq face (face-list)))
+ (if (and (listp face) (null (cdr face)))
+ (setq face (car face)))
+ (if (listp face)
+ (custom-buffer-create-other-window
+ (custom-sort-items
+ (mapcar (lambda (s)
+ (list s 'custom-face))
+ face)
+ t nil)
+ "*Customize Faces*")
+ (unless (facep face)
+ (error "Invalid face %S"))
(custom-buffer-create-other-window
- (list (list symbol 'custom-face))
- (format "*Customize Face: %s*" (custom-unlispify-tag-name symbol)))))
+ (list (list face 'custom-face))
+ (format "*Customize Face: %s*"
+ (custom-unlispify-tag-name face)))))
;;;###autoload
(defun customize-customized ()
:type 'boolean
:group 'custom-buffer)
+(defcustom custom-buffer-verbose-help t
+ "If non-nil, include explanatory text in the customization buffer."
+ :type 'boolean
+ :group 'custom-buffer)
+
(defun Custom-buffer-done (&rest ignore)
"Remove current buffer by calling `custom-buffer-done-function'."
(interactive)
(defun custom-buffer-create-internal (options &optional description)
(message "Creating customization buffer...")
(custom-mode)
- (widget-insert "This is a customization buffer")
- (if description
- (widget-insert description))
- (widget-insert (format ".
+ (if custom-buffer-verbose-help
+ (progn
+ (widget-insert "This is a customization buffer")
+ (if description
+ (widget-insert description))
+ (widget-insert (format ".
%s show active fields; type RET or click mouse-1
on an active field to invoke its action. Editing an option value
changes the text in the buffer; invoke the State button and
Invoke " (if custom-raised-buttons
"`Raised' buttons"
"Square brackets")))
- (widget-create 'info-link
- :tag "Help"
- :help-echo "Read the online help."
- "(emacs)Easy Customization")
- (widget-insert " for more information.\n\n")
- (message "Creating customization buttons...")
- (widget-insert "Operate on everything in this buffer:\n ")
+ (widget-create 'info-link
+ :tag "Help"
+ :help-echo "Read the online help."
+ "(emacs)Easy Customization")
+ (widget-insert " for more information.\n\n")
+ (message "Creating customization buttons...")
+ (widget-insert "Operate on everything in this buffer:\n "))
+ (widget-insert " "))
(widget-create 'push-button
:tag "Set for Current Session"
:help-echo "\
:help-echo "\
Un-customize all values in this buffer. They get their standard settings."
:action 'Custom-reset-standard))
+ (if (not custom-buffer-verbose-help)
+ (progn
+ (widget-insert " ")
+ (widget-create 'info-link
+ :tag "Help"
+ :help-echo "Read the online help."
+ "(emacs)Easy Customization")))
(widget-insert " ")
(widget-create 'push-button
:tag "Finish"
(t
(funcall show widget value)))))
-(defvar custom-load-recursion nil
- "Hack to avoid recursive dependencies.")
-
-(defun custom-load-symbol (symbol)
- "Load all dependencies for SYMBOL."
- (unless custom-load-recursion
- (let ((custom-load-recursion t)
- (loads (get symbol 'custom-loads))
- load)
- (while loads
- (setq load (car loads)
- loads (cdr loads))
- (cond ((symbolp load)
- (condition-case nil
- (require load)
- (error nil)))
- ;; Don't reload a file already loaded.
- ((and (boundp 'preloaded-file-list)
- (member load preloaded-file-list)))
- ((assoc load load-history))
- ;; This was just (assoc (locate-library load) load-history)
- ;; but has been optimized not to load locate-library
- ;; if not necessary.
- ((let (found (regexp (regexp-quote load)))
- (dolist (loaded load-history)
- (and (string-match regexp (car loaded))
- (eq (locate-library load) (car loaded))
- (setq found t)))
- found))
- ;; Without this, we would load cus-edit recursively.
- ;; We are still loading it when we call this,
- ;; and it is not in load-history yet.
- ((equal load "cus-edit"))
- (t
- (condition-case nil
- (load-library load)
- (error nil))))))))
-
(defun custom-load-widget (widget)
"Load all dependencies for WIDGET."
(custom-load-symbol (widget-value widget)))
(const :format "Dark\n"
:sibling-args (:help-echo "\
Match frames with dark backgrounds.")
- dark)))))))
+ dark)))
+ (group :sibling-args (:help-echo "\
+Only match frames that support the specified face attributes.")
+ (const :format "Supports attributes:" supports)
+ (custom-face-edit :inline t :format "%n%v"))))))
;;; The `custom-face' Widget.
(save-excursion
(let ((default-major-mode nil))
(set-buffer (find-file-noselect (custom-file))))
- (save-buffer))))
+ (let ((file-precious-flag t))
+ (save-buffer)))))
;;; The Customize Menu.