1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-11-22 07:09:54 +00:00

Sync with 1.84.

This commit is contained in:
Per Abrahamsen 1997-04-12 17:51:31 +00:00
parent c5292bc831
commit bd042c030f
6 changed files with 466 additions and 237 deletions

View File

@ -4,7 +4,7 @@
;;
;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
;; Keywords: help, faces
;; Version: 1.71
;; Version: 1.84
;; X-URL: http://www.dina.kvl.dk/~abraham/custom/
;;; Commentary:
@ -22,6 +22,10 @@
:custom-set :custom-save :custom-reset-current :custom-reset-saved
:custom-reset-factory)
(put 'custom-define-hook 'custom-type 'hook)
(put 'custom-define-hook 'factory-value '(nil))
(custom-add-to-group 'customize 'custom-define-hook 'custom-variable)
;;; Customization Groups.
(defgroup emacs nil
@ -202,9 +206,90 @@
:link '(url-link :tag "Development Page"
"http://www.dina.kvl.dk/~abraham/custom/")
:prefix "custom-"
:group 'help
:group 'help)
(defgroup custom-faces nil
"Faces used by customize."
:group 'customize
:group 'faces)
(defgroup abbrev-mode nil
"Word abbreviations mode."
:group 'abbrev)
(defgroup alloc nil
"Storage allocation and gc for GNU Emacs Lisp interpreter."
:tag "Storage Allocation"
:group 'internal)
(defgroup undo nil
"Undoing changes in buffers."
:group 'editing)
(defgroup modeline nil
"Content of the modeline."
:group 'environment)
(defgroup fill nil
"Indenting and filling text."
:group 'editing)
(defgroup editing-basics nil
"Most basic editing facilities."
:group 'editing)
(defgroup display nil
"How characters are displayed in buffers."
:group 'environment)
(defgroup execute nil
"Executing external commands."
:group 'processes)
(defgroup installation nil
"The Emacs installation."
:group 'environment)
(defgroup dired nil
"Directory editing."
:group 'environment)
(defgroup limits nil
"Internal Emacs limits."
:group 'internal)
(defgroup debug nil
"Debugging Emacs itself."
:group 'development)
(defgroup minibuffer nil
"Controling the behaviour of the minibuffer."
:group 'environment)
(defgroup keyboard nil
"Input from the keyboard."
:group 'environment)
(defgroup mouse nil
"Input from the mouse."
:group 'environment)
(defgroup menu nil
"Input from the menus."
:group 'environment)
(defgroup auto-save nil
"Preventing accidential loss of data."
:group 'data)
(defgroup processes-basics nil
"Basic stuff dealing with processes."
:group 'processes)
(defgroup windows nil
"Windows within a frame."
:group 'processes)
;;; Utilities.
(defun custom-quote (sexp)
@ -236,6 +321,23 @@ IF REGEXP is not a string, return it unchanged."
(nreverse (cons (substring regexp start) all)))
regexp))
(defun custom-variable-prompt ()
;; Code stolen from `help.el'.
"Prompt for a variable, defaulting to the variable at point.
Return a list suitable for use in `interactive'."
(let ((v (variable-at-point))
(enable-recursive-minibuffers t)
val)
(setq val (completing-read
(if v
(format "Customize variable (default %s): " v)
"Customize variable: ")
obarray 'boundp t))
(list (if (equal val "")
v (intern val)))))
;;; Unlispify.
(defvar custom-prefix-list nil
"List of prefixes that should be ignored by `custom-unlispify'")
@ -258,6 +360,10 @@ IF REGEXP is not a string, return it unchanged."
(erase-buffer)
(princ symbol (current-buffer))
(goto-char (point-min))
(when (and (eq (get symbol 'custom-type) 'boolean)
(re-search-forward "-p\\'" nil t))
(replace-match "" t t)
(goto-char (point-min)))
(let ((prefixes custom-prefix-list)
prefix)
(while prefixes
@ -290,62 +396,73 @@ IF REGEXP is not a string, return it unchanged."
(concat (symbol-name symbol) "-"))
prefixes))
;;; The Custom Mode.
;;; Guess.
(defcustom custom-guess-name-alist
'(("-p\\'" boolean)
("-hook\\'" hook)
("-face\\'" face)
("-file\\'" file)
("-function\\'" function)
("-functions\\'" (repeat function))
("-list\\'" (repeat sexp))
("-alist\\'" (repeat (cons sexp sexp))))
"Alist of (MATCH TYPE).
MATCH should be a regexp matching the name of a symbol, and TYPE should
be a widget suitable for editing the value of that symbol. The TYPE
of the first entry where MATCH matches the name of the symbol will be
used.
This is used for guessing the type of variables not declared with
customize."
:type '(repeat (group (regexp :tag "Match") (sexp :tag "Type")))
:group 'customize)
(defcustom custom-guess-doc-alist
'(("\\`\\*?Non-nil " boolean))
"Alist of (MATCH TYPE).
MATCH should be a regexp matching a documentation string, and TYPE
should be a widget suitable for editing the value of a variable with
that documentation string. The TYPE of the first entry where MATCH
matches the name of the symbol will be used.
This is used for guessing the type of variables not declared with
customize."
:type '(repeat (group (regexp :tag "Match") (sexp :tag "Type")))
:group 'customize)
(defun custom-guess-type (symbol)
"Guess a widget suitable for editing the value of SYMBOL.
This is done by matching SYMBOL with `custom-guess-name-alist' and
if that fails, the doc string with `custom-guess-doc-alist'."
(let ((name (symbol-name symbol))
(names custom-guess-name-alist)
current found)
(while names
(setq current (car names)
names (cdr names))
(when (string-match (nth 0 current) name)
(setq found (nth 1 current)
names nil)))
(unless found
(let ((doc (documentation-property symbol 'variable-documentation))
(docs custom-guess-doc-alist))
(when doc
(while docs
(setq current (car docs)
docs (cdr docs))
(when (string-match (nth 0 current) doc)
(setq found (nth 1 current)
docs nil))))))
found))
;;; Custom Mode Commands.
(defvar custom-options nil
"Customization widgets in the current buffer.")
(defvar custom-mode-map nil
"Keymap for `custom-mode'.")
(unless custom-mode-map
(setq custom-mode-map (make-sparse-keymap))
(set-keymap-parent custom-mode-map widget-keymap)
(define-key custom-mode-map "q" 'bury-buffer))
(easy-menu-define custom-mode-menu
custom-mode-map
"Menu used in customization buffers."
'("Custom"
["Set" custom-set t]
["Save" custom-save t]
["Reset to Current" custom-reset-current t]
["Reset to Saved" custom-reset-saved t]
["Reset to Factory Settings" custom-reset-factory t]
["Info" (Info-goto-node "(custom)The Customization Buffer") t]))
(defcustom custom-mode-hook nil
"Hook called when entering custom-mode."
:type 'hook
:group 'customize)
(defun custom-mode ()
"Major mode for editing customization buffers.
The following commands are available:
\\[widget-forward] Move to next button or editable field.
\\[widget-backward] Move to previous button or editable field.
\\[widget-button-click] Activate button under the mouse pointer.
\\[widget-button-press] Activate button under point.
\\[custom-set] Set all modifications.
\\[custom-save] Make all modifications default.
\\[custom-reset-current] Reset all modified options.
\\[custom-reset-saved] Reset all modified or set options.
\\[custom-reset-factory] Reset all options.
Entry to this mode calls the value of `custom-mode-hook'
if that value is non-nil."
(kill-all-local-variables)
(setq major-mode 'custom-mode
mode-name "Custom")
(use-local-map custom-mode-map)
(easy-menu-add custom-mode-menu)
(make-local-variable 'custom-options)
(run-hooks 'custom-mode-hook))
;;; Custom Mode Commands.
(defun custom-set ()
"Set changes in all modified options."
(interactive)
@ -430,20 +547,16 @@ when the action is chosen.")
;;;###autoload
(defun customize-variable (symbol)
"Customize SYMBOL, which must be a variable."
(interactive
;; Code stolen from `help.el'.
(let ((v (variable-at-point))
(enable-recursive-minibuffers t)
val)
(setq val (completing-read
(if v
(format "Customize variable (default %s): " v)
"Customize variable: ")
obarray 'boundp t))
(list (if (equal val "")
v (intern val)))))
(interactive (custom-variable-prompt))
(custom-buffer-create (list (list symbol 'custom-variable))))
;;;###autoload
(defun customize-variable-other-window (symbol)
"Customize SYMBOL, which must be a variable.
Show the buffer in another window, but don't select it."
(interactive (custom-variable-prompt))
(custom-buffer-create-other-window (list (list symbol 'custom-variable))))
;;;###autoload
(defun customize-face (&optional symbol)
"Customize SYMBOL, which should be a face name or nil.
@ -455,7 +568,10 @@ If SYMBOL is nil, customize all faces."
(message "Looking for faces...")
(mapcar (lambda (symbol)
(setq found (cons (list symbol 'custom-face) found)))
(face-list))
(nreverse (mapcar 'intern
(sort (mapcar 'symbol-name (face-list))
'string<))))
(custom-buffer-create found))
(if (stringp symbol)
(setq symbol (intern symbol)))
@ -463,6 +579,19 @@ If SYMBOL is nil, customize all faces."
(error "Should be a symbol %S" symbol))
(custom-buffer-create (list (list symbol 'custom-face)))))
;;;###autoload
(defun customize-face-other-window (&optional symbol)
"Show customization buffer for FACE in other window."
(interactive (list (completing-read "Customize face: "
obarray 'custom-facep)))
(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))
(custom-buffer-create-other-window (list (list symbol 'custom-face)))))
;;;###autoload
(defun customize-customized ()
"Customize all already customized user options."
@ -511,9 +640,24 @@ user-settable."
OPTIONS should be an alist of the form ((SYMBOL WIDGET)...), where
SYMBOL is a customization option, and WIDGET is a widget for editing
that option."
(message "Creating customization buffer...")
(kill-buffer (get-buffer-create "*Customization*"))
(switch-to-buffer (get-buffer-create "*Customization*"))
(custom-buffer-create-internal options))
(defun custom-buffer-create-other-window (options)
"Create a buffer containing OPTIONS.
OPTIONS should be an alist of the form ((SYMBOL WIDGET)...), where
SYMBOL is a customization option, and WIDGET is a widget for editing
that option."
(kill-buffer (get-buffer-create "*Customization*"))
(let ((window (selected-window)))
(switch-to-buffer-other-window (get-buffer-create "*Customization*"))
(custom-buffer-create-internal options)
(select-window window)))
(defun custom-buffer-create-internal (options)
(message "Creating customization buffer...")
(custom-mode)
(widget-insert "This is a customization buffer.
Push RET or click mouse-2 on the word ")
@ -753,7 +897,8 @@ The list should be sorted most significant first."
(string :tag "Magic")
face
(string :tag "Description"))))
:group 'customize)
:group 'customize
:group 'custom-faces)
(defcustom custom-magic-show 'long
"Show long description of the state of each customization option."
@ -956,9 +1101,14 @@ Change the state of this item."
(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."
(let ((loads (get symbol 'custom-loads))
(unless custom-load-recursion
(let ((custom-load-recursion t)
(loads (get symbol 'custom-loads))
load)
(while loads
(setq load (car loads)
@ -971,7 +1121,7 @@ Change the state of this item."
(t
(condition-case nil
(load-library load)
(error nil)))))))
(error nil))))))))
(defun custom-load-widget (widget)
"Load all dependencies for WIDGET."
@ -981,11 +1131,11 @@ Change the state of this item."
(defface custom-variable-sample-face '((t (:underline t)))
"Face used for unpushable variable tags."
:group 'customize)
:group 'custom-faces)
(defface custom-variable-button-face '((t (:underline t :bold t)))
"Face used for pushable variable tags."
:group 'customize)
:group 'custom-faces)
(define-widget 'custom-variable 'custom
"Customize variable."
@ -1003,6 +1153,22 @@ Change the state of this item."
:custom-reset-saved 'custom-variable-reset-saved
:custom-reset-factory 'custom-variable-reset-factory)
(defun custom-variable-type (symbol)
"Return a widget suitable for editing the value of SYMBOL.
If SYMBOL has a `custom-type' property, use that.
Otherwise, look up symbol in `custom-guess-type-alist'."
(let* ((type (or (get symbol 'custom-type)
(and (not (get symbol 'factory-value))
(custom-guess-type symbol))
'sexp))
(options (get symbol 'custom-options))
(tmp (if (listp type)
(copy-list type)
(list type))))
(when options
(widget-put tmp :options options))
tmp))
(defun custom-variable-value-create (widget)
"Here is where you edit the variables value."
(custom-load-widget widget)
@ -1011,15 +1177,8 @@ Change the state of this item."
(form (widget-get widget :custom-form))
(state (widget-get widget :custom-state))
(symbol (widget-get widget :value))
(options (get symbol 'custom-options))
(child-type (or (get symbol 'custom-type) 'sexp))
(tag (widget-get widget :tag))
(type (let ((tmp (if (listp child-type)
(copy-list child-type)
(list child-type))))
(when options
(widget-put tmp :options options))
tmp))
(type (custom-variable-type symbol))
(conv (widget-convert type))
(value (if (default-boundp symbol)
(default-value symbol)
@ -1162,10 +1321,10 @@ Optional EVENT is the location for the menu."
(goto-char (widget-get val :from))
(error "%s" (widget-get val :error)))
((eq form 'lisp)
(set symbol (eval (setq val (widget-value child))))
(set-default symbol (eval (setq val (widget-value child))))
(put symbol 'customized-value (list val)))
(t
(set symbol (setq val (widget-value child)))
(set-default symbol (setq val (widget-value child)))
(put symbol 'customized-value (list (custom-quote val)))))
(custom-variable-state-set widget)
(custom-redraw-magic widget)))
@ -1184,12 +1343,12 @@ Optional EVENT is the location for the menu."
(error "%s" (widget-get val :error)))
((eq form 'lisp)
(put symbol 'saved-value (list (widget-value child)))
(set symbol (eval (widget-value child))))
(set-default symbol (eval (widget-value child))))
(t
(put symbol
'saved-value (list (custom-quote (widget-value
child))))
(set symbol (widget-value child))))
(set-default symbol (widget-value child))))
(put symbol 'customized-value nil)
(custom-save-all)
(custom-variable-state-set widget)
@ -1200,7 +1359,7 @@ Optional EVENT is the location for the menu."
(let ((symbol (widget-value widget)))
(if (get symbol 'saved-value)
(condition-case nil
(set symbol (eval (car (get symbol 'saved-value))))
(set-default symbol (eval (car (get symbol 'saved-value))))
(error nil))
(error "No saved value for %s" symbol))
(put symbol 'customized-value nil)
@ -1211,7 +1370,7 @@ Optional EVENT is the location for the menu."
"Restore the factory setting for the variable being edited by WIDGET."
(let ((symbol (widget-value widget)))
(if (get symbol 'factory-value)
(set symbol (eval (car (get symbol 'factory-value))))
(set-default symbol (eval (car (get symbol 'factory-value))))
(error "No factory default for %S" symbol))
(put symbol 'customized-value nil)
(when (get symbol 'saved-value)
@ -1311,7 +1470,7 @@ Match frames with dark backgrounds.")
(defface custom-face-tag-face '((t (:underline t)))
"Face used for face tags."
:group 'customize)
:group 'custom-faces)
(define-widget 'custom-face 'custom
"Customize face."
@ -1613,7 +1772,7 @@ The first member is used for level 1 groups, the second for level 2,
and so forth. The remaining group tags are shown with
`custom-group-tag-face'."
:type '(repeat face)
:group 'customize)
:group 'custom-faces)
(defface custom-group-tag-face-1 '((((class color)
(background dark))
@ -1632,7 +1791,7 @@ and so forth. The remaining group tags are shown with
(:foreground "blue" :underline t))
(t (:underline t)))
"Face used for low level group tags."
:group 'customize)
:group 'custom-faces)
(define-widget 'custom-group 'custom
"Customize group."
@ -1835,9 +1994,21 @@ Leave point at the location of the call, or after the last expression."
(unless (bolp)
(princ "\n"))
(princ "(custom-set-faces")
(let ((value (get 'default 'saved-face)))
;; The default face must be first, since it affects the others.
(when value
(princ "\n '(default ")
(prin1 value)
(if (or (get 'default 'factory-face)
(and (not (custom-facep 'default))
(not (get 'default 'force-face))))
(princ ")")
(princ " t)"))))
(mapatoms (lambda (symbol)
(let ((value (get symbol 'saved-face)))
(when value
(when (and (not (eq symbol 'default))
;; Don't print default face here.
value)
(princ "\n '(")
(princ symbol)
(princ " ")
@ -1862,10 +2033,43 @@ Leave point at the location of the call, or after the last expression."
;;; The Customize Menu.
;;; Menu support
(unless (string-match "XEmacs" emacs-version)
(defconst custom-help-menu '("Customize"
["Update menu..." custom-menu-update t]
["Group..." customize t]
["Variable..." customize-variable t]
["Face..." customize-face t]
["Saved..." customize-customized t]
["Apropos..." customize-apropos t])
;; This menu should be identical to the one defined in `menu-bar.el'.
"Customize menu")
(defun custom-menu-reset ()
"Reset customize menu."
(remove-hook 'custom-define-hook 'custom-menu-reset)
(define-key global-map [menu-bar help-menu customize-menu]
(cons (car custom-help-menu)
(easy-menu-create-keymaps (car custom-help-menu)
(cdr custom-help-menu)))))
(defun custom-menu-update (event)
"Update customize menu."
(interactive "e")
(add-hook 'custom-define-hook 'custom-menu-reset)
(let* ((emacs (widget-apply '(custom-group) :custom-menu 'emacs))
(menu `(,(car custom-help-menu)
,emacs
,@(cdr (cdr custom-help-menu)))))
(let ((map (easy-menu-create-keymaps (car menu) (cdr menu))))
(define-key global-map [menu-bar help-menu customize-menu]
(cons (car menu) map)))))
(defcustom custom-menu-nesting 2
"Maximum nesting in custom menus."
:type 'integer
:group 'customize)
:group 'customize))
(defun custom-face-menu-create (widget symbol)
"Ignoring WIDGET, create a menu entry for customization face SYMBOL."
@ -1884,6 +2088,7 @@ Leave point at the location of the call, or after the last expression."
`(custom-buffer-create '((,symbol custom-variable)))
t))))
;; Add checkboxes to boolean variable entries.
(widget-put (get 'boolean 'widget-type)
:custom-menu (lambda (widget symbol)
(vector (custom-unlispify-menu-entry symbol)
@ -1906,17 +2111,15 @@ Leave point at the location of the call, or after the last expression."
(let ((custom-menu-nesting (1- custom-menu-nesting)))
(custom-menu-create symbol))))
(defun custom-menu-create (symbol &optional name)
;;;###autoload
(defun custom-menu-create (symbol)
"Create menu for customization group SYMBOL.
If optional NAME is given, use that as the name of the menu.
Otherwise make up a name from SYMBOL.
The menu is in a format applicable to `easy-menu-define'."
(unless name
(setq name (custom-unlispify-menu-entry symbol)))
(let ((item (vector name
(let* ((item (vector (custom-unlispify-menu-entry symbol)
`(custom-buffer-create '((,symbol custom-group)))
t)))
(if (and (>= custom-menu-nesting 0)
(if (and (or (not (boundp 'custom-menu-nesting))
(>= custom-menu-nesting 0))
(< (length (get symbol 'custom-group)) widget-menu-max-size))
(let ((custom-prefix-list (custom-prefix-add symbol
custom-prefix-list)))
@ -1933,58 +2136,77 @@ The menu is in a format applicable to `easy-menu-define'."
item)))
;;;###autoload
(defun custom-menu-update (event)
"Update customize menu."
(interactive "e")
(add-hook 'custom-define-hook 'custom-menu-reset)
(let* ((emacs (widget-apply '(custom-group) :custom-menu 'emacs))
(menu `(,(car custom-help-menu)
,emacs
,@(cdr (cdr custom-help-menu)))))
(let ((map (easy-menu-create-keymaps (car menu) (cdr menu))))
(define-key global-map [menu-bar help-menu customize-menu]
(cons (car menu) map)))))
(defun customize-menu-create (symbol &optional name)
"Return a customize menu for customization group SYMBOL.
If optional NAME is given, use that as the name of the menu.
Otherwise the menu will be named `Customize'.
The format is suitable for use with `easy-menu-define'."
(unless name
(setq name "Customize"))
(if (string-match "XEmacs" emacs-version)
;; We can delay it under XEmacs.
`(,name
:filter (lambda (&rest junk)
(cdr (custom-menu-create ',symbol))))
;; But we must create it now under Emacs.
(cons name (cdr (custom-menu-create symbol)))))
;;; Dependencies.
;;; The Custom Mode.
;;;###autoload
(defun custom-make-dependencies ()
"Batch function to extract custom dependencies from .el files.
Usage: emacs -batch *.el -f custom-make-dependencies > deps.el"
(let ((buffers (buffer-list)))
(while buffers
(set-buffer (car buffers))
(setq buffers (cdr buffers))
(let ((file (buffer-file-name)))
(when (and file (string-match "\\`\\(.*\\)\\.el\\'" file))
(goto-char (point-min))
(condition-case nil
(let ((name (file-name-nondirectory (match-string 1 file))))
(while t
(let ((expr (read (current-buffer))))
(when (and (listp expr)
(memq (car expr) '(defcustom defface defgroup)))
(eval expr)
(put (nth 1 expr) 'custom-where name)))))
(error nil))))))
(mapatoms (lambda (symbol)
(let ((members (get symbol 'custom-group))
item where found)
(when members
(princ "(put '")
(princ symbol)
(princ " 'custom-loads '(")
(while members
(setq item (car (car members))
members (cdr members)
where (get item 'custom-where))
(unless (or (null where)
(member where found))
(when found
(princ " "))
(prin1 where)
(push where found)))
(princ "))\n"))))))
(defvar custom-mode-map nil
"Keymap for `custom-mode'.")
(unless custom-mode-map
(setq custom-mode-map (make-sparse-keymap))
(set-keymap-parent custom-mode-map widget-keymap)
(define-key custom-mode-map "q" 'bury-buffer))
(easy-menu-define custom-mode-customize-menu
custom-mode-map
"Menu used in customization buffers."
(customize-menu-create 'customize))
(easy-menu-define custom-mode-menu
custom-mode-map
"Menu used in customization buffers."
`("Custom"
["Set" custom-set t]
["Save" custom-save t]
["Reset to Current" custom-reset-current t]
["Reset to Saved" custom-reset-saved t]
["Reset to Factory Settings" custom-reset-factory t]
["Info" (Info-goto-node "(custom)The Customization Buffer") t]))
(defcustom custom-mode-hook nil
"Hook called when entering custom-mode."
:type 'hook
:group 'customize)
(defun custom-mode ()
"Major mode for editing customization buffers.
The following commands are available:
Move to next button or editable field. \\[widget-forward]
Move to previous button or editable field. \\[widget-backward]
Activate button under the mouse pointer. \\[widget-button-click]
Activate button under point. \\[widget-button-press]
Set all modifications. \\[custom-set]
Make all modifications default. \\[custom-save]
Reset all modified options. \\[custom-reset-current]
Reset all modified or set options. \\[custom-reset-saved]
Reset all options. \\[custom-reset-factory]
Entry to this mode calls the value of `custom-mode-hook'
if that value is non-nil."
(kill-all-local-variables)
(setq major-mode 'custom-mode
mode-name "Custom")
(use-local-map custom-mode-map)
(easy-menu-add custom-mode-customize-menu)
(easy-menu-add custom-mode-menu)
(make-local-variable 'custom-options)
(run-hooks 'custom-mode-hook))
;;; The End.

View File

@ -4,7 +4,7 @@
;;
;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
;; Keywords: help, faces
;; Version: 1.71
;; Version: 1.84
;; X-URL: http://www.dina.kvl.dk/~abraham/custom/
;;; Commentary:
@ -39,7 +39,7 @@
(eval-and-compile
(unless (fboundp 'frame-property)
;; XEmacs function missing in Emacs 19.34.
;; XEmacs function missing in Emacs.
(defun frame-property (frame property &optional default)
"Return FRAME's value for property PROPERTY."
(or (cdr (assq property (frame-parameters frame)))
@ -49,44 +49,13 @@
;; XEmacs function missing in Emacs.
(defun face-doc-string (face)
"Get the documentation string for FACE."
(get face 'face-doc-string)))
(get face 'face-documentation)))
(unless (fboundp 'set-face-doc-string)
;; XEmacs function missing in Emacs.
(defun set-face-doc-string (face string)
"Set the documentation string for FACE to STRING."
(put face 'face-doc-string string)))
(when (and (not (fboundp 'set-face-stipple))
(fboundp 'set-face-background-pixmap))
;; Emacs function missing in XEmacs 19.15.
(defun set-face-stipple (face pixmap &optional frame)
;; Written by Kyle Jones.
"Change the stipple pixmap of face FACE to PIXMAP.
PIXMAP should be a string, the name of a file of pixmap data.
The directories listed in the `x-bitmap-file-path' variable are searched.
Alternatively, PIXMAP may be a list of the form (WIDTH HEIGHT DATA)
where WIDTH and HEIGHT are the size in pixels,
and DATA is a string, containing the raw bits of the bitmap.
If the optional FRAME argument is provided, change only
in that frame; otherwise change each frame."
(while (not (find-face face))
(setq face (signal 'wrong-type-argument (list 'facep face))))
(while (cond ((stringp pixmap)
(unless (file-readable-p pixmap)
(setq pixmap (vector 'xbm ':file pixmap)))
nil)
((and (consp pixmap) (= (length pixmap) 3))
(setq pixmap (vector 'xbm ':data pixmap))
nil)
(t t))
(setq pixmap (signal 'wrong-type-argument
(list 'stipple-pixmap-p pixmap))))
(while (and frame (not (framep frame)))
(setq frame (signal 'wrong-type-argument (list 'framep frame))))
(set-face-background-pixmap face pixmap frame))))
(put face 'face-documentation string))))
(unless (fboundp 'x-color-values)
;; Emacs function missing in XEmacs 19.14.
@ -410,7 +379,7 @@ If FRAME is nil, use the default face."
"Return the size of the font of FACE as a string."
(let* ((font (apply 'custom-face-font-name face args))
(fontobj (font-create-object font)))
(format "%d" (font-size fontobj))))
(format "%s" (font-size fontobj))))
(defun custom-set-face-font-family (face family &rest args)
"Set the font of FACE to FAMILY."
@ -425,8 +394,8 @@ If FRAME is nil, use the default face."
(fontobj (font-create-object font)))
(font-family fontobj)))
(nconc custom-face-attributes
'((:family (editable-field :format "Font Family: %v"
(setq custom-face-attributes
(append '((:family (editable-field :format "Font Family: %v"
:help-echo "\
Name of font family to use (e.g. times).")
custom-set-face-font-family
@ -435,7 +404,13 @@ Name of font family to use (e.g. times).")
:help-echo "\
Text size (e.g. 9pt or 2mm).")
custom-set-face-font-size
custom-face-font-size))))
custom-face-font-size)
(:strikethru (toggle :format "Strikethru: %[%v%]\n"
:help-echo "\
Control whether the text should be strikethru.")
set-face-strikethru-p
face-strikethru-p))
custom-face-attributes)))
;;; Frames.

View File

@ -4,7 +4,7 @@
;;
;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
;; Keywords: help, faces
;; Version: 1.71
;; Version: 1.84
;; X-URL: http://www.dina.kvl.dk/~abraham/custom/
;;; Commentary:
@ -23,16 +23,26 @@
(define-widget-keywords :prefix :tag :load :link :options :type :group)
(defvar custom-define-hook nil
;; Customize information for this option is in `cus-edit.el'.
"Hook called after defining each customize option.")
;;; The `defcustom' Macro.
(defun custom-declare-variable (symbol value doc &rest args)
"Like `defcustom', but SYMBOL and VALUE are evaluated as normal arguments."
(unless (and (default-boundp symbol)
(not (get symbol 'saved-value)))
;; Bind this variable unless it already is bound.
(unless (default-boundp symbol)
;; Use the saved value if it exists, otherwise the factory setting.
(set-default symbol (if (get symbol 'saved-value)
(eval (car (get symbol 'saved-value)))
(eval value))))
;; Remember the factory setting.
(put symbol 'factory-value (list value))
;; Maybe this option was rogue in an earlier version. It no longer is.
(when (get symbol 'force-value)
;; It no longer is.
(put symbol 'force-value nil))
(when doc
(put symbol 'variable-documentation doc))
(while args
@ -262,23 +272,23 @@ the default value for the SYMBOL."
(value (nth 1 entry))
(now (nth 2 entry)))
(put symbol 'saved-value (list value))
(when now
(cond (now
;; Rogue variable, set it now.
(put symbol 'force-value t)
(set-default symbol (eval value)))
((default-boundp symbol)
;; Something already set this, overwrite it.
(set-default symbol (eval value))))
(setq args (cdr args)))
;; Old format, a plist of SYMBOL VALUE pairs.
(message "Warning: old format `custom-set-variables'")
(ding)
(sit-for 2)
(let ((symbol (nth 0 args))
(value (nth 1 args)))
(put symbol 'saved-value (list value)))
(setq args (cdr (cdr args)))))))
;;; Meta Customization
(defcustom custom-define-hook nil
"Hook called after defining each customize option."
:group 'customize
:type 'hook)
;;; The End.
(provide 'custom)

View File

@ -4,7 +4,7 @@
;;
;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
;; Keywords: extensions
;; Version: 1.71
;; Version: 1.84
;; X-URL: http://www.dina.kvl.dk/~abraham/custom/
;;; Commentary:
@ -29,7 +29,13 @@
(unless widget-browse-mode-map
(setq widget-browse-mode-map (make-sparse-keymap))
(set-keymap-parent widget-browse-mode-map widget-keymap))
(set-keymap-parent widget-browse-mode-map widget-keymap)
(define-key widget-browse-mode-map "q" 'bury-buffer))
(easy-menu-define widget-browse-mode-customize-menu
widget-browse-mode-map
"Menu used in widget browser buffers."
(customize-menu-create 'widgets))
(easy-menu-define widget-browse-mode-menu
widget-browse-mode-map
@ -59,6 +65,7 @@ if that value is non-nil."
(setq major-mode 'widget-browse-mode
mode-name "Widget")
(use-local-map widget-browse-mode-map)
(easy-menu-add widget-browse-mode-customize-menu)
(easy-menu-add widget-browse-mode-menu)
(run-hooks 'widget-browse-mode-hook))
@ -82,6 +89,7 @@ if that value is non-nil."
(defvar widget-browse-history nil)
;;;###autoload
(defun widget-browse (widget)
"Create a widget browser for WIDGET."
(interactive (list (completing-read "Widget: "
@ -106,11 +114,11 @@ if that value is non-nil."
(widget-browse-mode)
;; Quick way to get out.
(widget-create 'push-button
:action (lambda (widget &optional event)
(bury-buffer))
"Quit")
(widget-insert "\n")
;; (widget-create 'push-button
;; :action (lambda (widget &optional event)
;; (bury-buffer))
;; "Quit")
;; (widget-insert "\n")
;; Top text indicating whether it is a class or object browser.
(if (listp widget)
@ -145,6 +153,18 @@ if that value is non-nil."
(widget-setup)
(goto-char (point-min)))
;;;###autoload
(defun widget-browse-other-window (&optional widget)
"Show widget browser for WIDGET in other window."
(interactive)
(let ((window (selected-window)))
(switch-to-buffer-other-window "*Browse Widget*")
(if widget
(widget-browse widget)
(call-interactively 'widget-browse))
(select-window window)))
;;; The `widget-browse' Widget.
(define-widget 'widget-browse 'push-button

View File

@ -4,7 +4,7 @@
;;
;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
;; Keywords: extensions
;; Version: 1.71
;; Version: 1.84
;; X-URL: http://www.dina.kvl.dk/~abraham/custom/
;;; Commentary:
@ -1238,13 +1238,14 @@ With optional ARG, move across that many fields."
(define-widget 'push-button 'item
"A pushable button."
:value-create 'widget-push-button-value-create
:text-format "[%s]"
:format "%[%v%]")
(defun widget-push-button-value-create (widget)
;; Insert text representing the `on' and `off' states.
(let* ((tag (or (widget-get widget :tag)
(widget-get widget :value)))
(text (concat "[" tag "]"))
(text (format (widget-get widget :text-format) tag))
(gui (cdr (assoc tag widget-push-button-cache))))
(if (and (fboundp 'make-gui-button)
(fboundp 'make-glyph)
@ -2374,7 +2375,7 @@ It will read a directory name from the minibuffer when activated."
(defun widget-vector-match (widget value)
(and (vectorp value)
(widget-group-match widget
(widget-apply :value-to-internal widget value))))
(widget-apply widget :value-to-internal value))))
(define-widget 'cons 'group
"A cons-cell."

View File

@ -4,7 +4,7 @@
;;
;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
;; Keywords: help, extensions, faces, hypermedia
;; Version: 1.71
;; Version: 1.84
;; X-URL: http://www.dina.kvl.dk/~abraham/custom/
;;; Commentary:
@ -27,8 +27,8 @@
(set (car keywords) (car keywords)))
(setq keywords (cdr keywords)))))))
(define-widget-keywords :deactivate :active :inactive :activate
:sibling-args :delete-button-args
(define-widget-keywords :text-format :deactivate :active :inactive
:activate :sibling-args :delete-button-args
:insert-button-args :append-button-args :button-args
:tag-glyph :off-glyph :on-glyph :valid-regexp
:secret :sample-face :sample-face-get :case-fold :widget-doc
@ -50,6 +50,7 @@
(autoload 'widget-create "wid-edit")
(autoload 'widget-insert "wid-edit")
(autoload 'widget-browse "wid-browse" nil t)
(autoload 'widget-browse-other-window "wid-browse" nil t)
(autoload 'widget-browse-at "wid-browse" nil t))
(defun define-widget (name class doc &rest args)