:link '(custom-manual "(emacs)Undo")
:group 'editing)
-(defgroup modeline nil
+(defgroup mode-line nil
"Content of the modeline."
:group 'environment)
;;; Utilities.
-(defun custom-quote (sexp)
- "Quote SEXP iff it is not self quoting."
- (if (or (memq sexp '(t nil))
- (keywordp sexp)
- (and (listp sexp)
- (memq (car sexp) '(lambda)))
- (stringp sexp)
- (numberp sexp)
- (vectorp sexp)
-;;; (and (fboundp 'characterp)
-;;; (characterp sexp))
- )
- sexp
- (list 'quote sexp)))
-
(defun custom-split-regexp-maybe (regexp)
"If REGEXP is a string, split it to a list at `\\|'.
You can get the original back with from the result with:
"List of prefixes that should be ignored by `custom-unlispify'.")
(defcustom custom-unlispify-menu-entries t
- "Display menu entries as words instead of symbols if non nil."
+ "Display menu entries as words instead of symbols if non-nil."
:group 'custom-menu
:type 'boolean)
(buffer-string)))))
(defcustom custom-unlispify-tag-names t
- "Display tag names as words instead of symbols if non nil."
+ "Display tag names as words instead of symbols if non-nil."
:group 'custom-buffer
:type 'boolean)
(defcustom custom-guess-name-alist
'(("-p\\'" boolean)
+ ("-flag\\'" boolean)
("-hook\\'" hook)
("-face\\'" face)
("-file\\'" file)
(if (or (and (= 1 (length children))
(memq (widget-type (car children))
'(custom-variable custom-face)))
- (y-or-n-p "Reset all settings' buffer text to show current values? "))
+ (y-or-n-p "Reset all settings' buffer text to show current values? "))
(mapc (lambda (widget)
(if (memq (widget-get widget :custom-state)
'(modified changed))
If the variable has a `custom-type' property, it must be a widget and the
`:prompt-value' property of that widget will be used for reading the value.
-If optional COMMENT argument is non nil, also prompt for a comment and return
+If optional COMMENT argument is non-nil, also prompt for a comment and return
it as the third element in the list."
(let* ((var (read-variable prompt-var))
(minibuffer-help-form '(describe-variable var))
"Set customized value for %s to: "
current-prefix-arg))
(custom-load-symbol variable)
+ (custom-push-theme 'theme-value variable 'user 'set (custom-quote value))
(funcall (or (get variable 'custom-set) 'set-default) variable value)
(put variable 'customized-value (list (custom-quote value)))
(cond ((string= comment "")
(defun customize-option (symbol)
"Customize SYMBOL, which must be a user option variable."
(interactive (custom-variable-prompt))
+ (unless symbol
+ (error "No variable specified"))
(let ((basevar (indirect-variable symbol)))
(custom-buffer-create (list (list basevar 'custom-variable))
(format "*Customize Option: %s*"
"Customize SYMBOL, which must be a user option variable.
Show the buffer in another window, but don't select it."
(interactive (custom-variable-prompt))
+ (unless symbol
+ (error "No variable specified"))
(let ((basevar (indirect-variable symbol)))
(custom-buffer-create-other-window
(list (list basevar 'custom-variable))
(defvar customize-changed-options-previous-release "21.1"
"Version for `customize-changed-options' to refer back to by default.")
+;; Packages will update this variable, so make it available.
+;;;###autoload
+(defvar customize-package-emacs-version-alist nil
+ "Alist mapping versions of a package to Emacs versions.
+We use this for packages that have their own names, but are released
+as part of Emacs itself.
+
+Each elements looks like this:
+
+ (PACKAGE (PVERSION . EVERSION)...)
+
+Here PACKAGE is the name of a package, as a symbol. After
+PACKAGE come one or more elements, each associating a
+package version PVERSION with the first Emacs version
+EVERSION in which it (or a subsequent version of PACKAGE)
+was first released. Both PVERSION and EVERSION are strings.
+PVERSION should be a string that this package used in
+the :package-version keyword for `defcustom', `defgroup',
+and `defface'.
+
+For example, the MH-E package updates this alist as follows:
+
+ (add-to-list 'customize-package-emacs-version-alist
+ '(MH-E (\"6.0\" . \"22.1\") (\"6.1\" . \"22.1\")
+ (\"7.0\" . \"22.1\") (\"7.1\" . \"22.1\")
+ (\"7.2\" . \"22.1\") (\"7.3\" . \"22.1\")
+ (\"7.4\" . \"22.1\") (\"8.0\" . \"22.1\")))
+
+The value of PACKAGE needs to be unique and it needs to match the
+PACKAGE value appearing in the :package-version keyword. Since
+the user might see the value in a error message, a good choice is
+the official name of the package, such as MH-E or Gnus.")
+
;;;###autoload
(defalias 'customize-changed 'customize-changed-options)
With argument SINCE-VERSION (a string), customize all settings
that were added or redefined since that version."
- (interactive "sCustomize options changed, since version (default all versions): ")
+ (interactive
+ (list
+ (read-from-minibuffer
+ (format "Customize options changed, since version (default %s): "
+ customize-changed-options-previous-release))))
(if (equal since-version "")
(setq since-version nil)
(unless (condition-case nil
(let (found)
(mapatoms
(lambda (symbol)
- (let ((version (get symbol 'custom-version)))
+ (let* ((package-version (get symbol 'custom-package-version))
+ (version
+ (or (and package-version
+ (customize-package-emacs-version symbol
+ package-version))
+ (get symbol 'custom-version))))
(if version
(when (customize-version-lessp since-version version)
(if (or (get symbol 'custom-group)
(error "No user option defaults have been changed since Emacs %s"
since-version))))
+(defun customize-package-emacs-version (symbol package-version)
+ "Return the Emacs version in which SYMBOL's meaning last changed.
+PACKAGE-VERSION has the form (PACKAGE . VERSION). We use
+`customize-package-emacs-version-alist' to find the version of
+Emacs that is associated with version VERSION of PACKAGE."
+ (let (package-versions emacs-version)
+ ;; Use message instead of error since we want user to be able to
+ ;; see the rest of the symbols even if a package author has
+ ;; botched things up.
+ (cond ((not (listp package-version))
+ (message "Invalid package-version value for %s" symbol))
+ ((setq package-versions (assq (car package-version)
+ customize-package-emacs-version-alist))
+ (setq emacs-version
+ (cdr (assoc (cdr package-version) package-versions)))
+ (unless emacs-version
+ (message "%s version %s not found in %s" symbol
+ (cdr package-version)
+ "customize-package-emacs-version-alist")))
+ (t
+ (message "Package %s version %s lists no corresponding Emacs version"
+ (car package-version)
+ (cdr package-version))))
+ emacs-version))
+
(defun customize-version-lessp (version1 version2)
;; Why are the versions strings, and given that they are, why aren't
;; they converted to numbers and compared as such here? -- fx
(get symbol 'variable-documentation))))
(push (list symbol 'custom-variable) found)))))
(if (not found)
- (error "No matches")
- (custom-buffer-create (custom-sort-items found t
- custom-buffer-order-groups)
- "*Customize Apropos*"))))
+ (error "No customizable items matching %s" regexp)
+ (custom-buffer-create
+ (custom-sort-items found t custom-buffer-order-groups)
+ "*Customize Apropos*"))))
;;;###autoload
(defun customize-apropos-options (regexp &optional arg)
(widget-insert description))
(widget-insert (format ".
%s buttons; type RET or click mouse-1 to actuate one.
-Editing a setting changes only the text in the buffer.
-Use the setting's State button to set it or save changes in it.
-Saving a change normally works by editing your Emacs init file.
-See "
+Editing a setting changes only the text in the buffer."
(if custom-raised-buttons
"`Raised' text indicates"
"Square brackets indicate")))
+ (if init-file-user
+ (widget-insert "
+Use the setting's State button to set it or save changes in it.
+Saving a change normally works by editing your Emacs init file.")
+ (widget-insert "
+\nSince you started Emacs with `-q', which inhibits use of the
+Emacs init file, you cannot save settings into the Emacs init file."))
+ (widget-insert "\nSee ")
(widget-create 'custom-manual
:tag "Custom file"
"(emacs)Saving Customizations")
'custom-button-pressed
'custom-button-pressed-unraised))
-(defface custom-documentation nil
+(defface custom-documentation '((t nil))
"Face used for documentation strings in customization buffers."
:group 'custom-faces)
;; backward-compatibility alias
(error nil))
(cond
((eq (caar tmp) 'user) 'saved)
- ((eq (caar tmp) 'changed) 'changed)
+ ((eq (caar tmp) 'changed)
+ (if (condition-case nil
+ (and (null comment)
+ (equal value
+ (eval
+ (car (get symbol 'standard-value)))))
+ (error nil))
+ ;; The value was originally set outside
+ ;; custom, but it was set to the standard
+ ;; value (probably an autoloaded defcustom).
+ 'standard
+ 'changed))
(t 'themed))
'changed))
((setq tmp (get symbol 'standard-value))
;; Make the comment invisible by hand if it's empty
(custom-comment-hide comment-widget))
(put symbol 'customized-face value)
+ (custom-push-theme 'theme-face symbol 'user 'set value)
(if (face-spec-choose value)
(face-spec-set symbol value)
;; face-set-spec ignores empty attribute lists, so just give it
;; something harmless instead.
(face-spec-set symbol '((t :foreground unspecified))))
- (custom-push-theme 'theme-face symbol 'user 'set value)
(put symbol 'customized-face-comment comment)
(put symbol 'face-comment comment)
(custom-face-state-set widget)
(put symbol 'customized-face nil)
(put symbol 'customized-face-comment nil)
(custom-push-theme 'theme-face symbol 'user 'reset)
+ (face-spec-set symbol value)
(custom-theme-recalc-face symbol)
(when (or (get symbol 'saved-face) (get symbol 'saved-face-comment))
(put symbol 'saved-face nil)
(put symbol 'saved-face-comment nil)
(custom-save-all))
(put symbol 'face-comment nil)
- (widget-value-set child value)
+ (widget-value-set child
+ (custom-pre-filter-face-spec
+ (list (list t (custom-face-attributes-get
+ symbol nil)))))
;; This call manages the comment visibility
(widget-value-set comment-widget "")
(custom-face-state-set widget)
;;;###autoload
(defun custom-save-all ()
"Save all customizations in `custom-file'."
+ (when (and (null custom-file) init-file-had-error)
+ (error "Cannot save customizations; init file was not fully loaded"))
(let* ((filename (custom-file))
(recentf-exclude (if recentf-mode
(cons (concat "\\`"
recentf-exclude)))
(old-buffer (find-buffer-visiting filename)))
(with-current-buffer (or old-buffer (find-file-noselect filename))
+ (unless (eq major-mode 'emacs-lisp-mode)
+ (emacs-lisp-mode))
(let ((inhibit-read-only t))
(custom-save-variables)
(custom-save-faces))
(mapatoms
(lambda (symbol)
(if (and (get symbol 'saved-value)
- (eq 'user (car (car-safe (get symbol 'theme-value)))))
+ ;; ignore theme values
+ (or (null (get symbol 'theme-value))
+ (eq 'user (caar (get symbol 'theme-value)))))
(nconc saved-list (list symbol)))))
(setq saved-list (sort (cdr saved-list) 'string<))
(unless (bolp)
(let ((spec (car-safe (get symbol 'theme-value)))
(value (get symbol 'saved-value))
(requests (get symbol 'custom-requests))
- (now (not (or (custom-variable-p symbol)
- (and (not (boundp symbol))
- (not (eq (get symbol 'force-value)
- 'rogue))))))
+ (now (and (not (custom-variable-p symbol))
+ (or (boundp symbol)
+ (eq (get symbol 'force-value)
+ 'rogue))))
(comment (get symbol 'saved-variable-comment)))
- ;; Check `requests'.
+ ;; Check REQUESTS for validity.
(dolist (request requests)
(when (and (symbolp request) (not (featurep request)))
(message "Unknown requested feature: %s" request)
(setq requests (delq request requests))))
+ ;; Is there anything customized about this variable?
(when (or (and spec (eq (car spec) 'user))
comment
(and (null spec) (get symbol 'saved-value)))
+ ;; Output an element for this variable.
+ ;; It has the form (SYMBOL VALUE-FORM NOW REQUESTS COMMENT).
+ ;; SYMBOL is the variable name.
+ ;; VALUE-FORM is an expression to return the customized value.
+ ;; NOW if non-nil means always set the variable immediately
+ ;; when the customizations are reloaded. This is used
+ ;; for rogue variables
+ ;; REQUESTS is a list of packages to load before setting the
+ ;; variable. Each element of it will be passed to `require'.
+ ;; COMMENT is whatever comment the user has specified
+ ;; with the customize facility.
(unless (bolp)
(princ "\n"))
(princ " '(")
"Ignoring WIDGET, create a menu entry for customization group SYMBOL."
`( ,(custom-unlispify-menu-entry symbol t)
:filter (lambda (&rest junk)
- (let ((menu (custom-menu-create ',symbol)))
+ (let* ((menu (custom-menu-create ',symbol)))
(if (consp menu) (cdr menu) menu)))))
;;;###autoload
(defun custom-menu-create (symbol)
"Create menu for customization group SYMBOL.
The menu is in a format applicable to `easy-menu-define'."
- (let* ((item (vector (custom-unlispify-menu-entry symbol)
+ (let* ((deactivate-mark nil)
+ (item (vector (custom-unlispify-menu-entry symbol)
`(customize-group ',symbol)
t)))
(if (and (or (not (boundp 'custom-menu-nesting))
;; Actually, this misfeature of dense keymaps was fixed on 2001-11-26.
(let ((map (make-keymap)))
(set-keymap-parent map widget-keymap)
- (suppress-keymap map)
+ (define-key map [remap self-insert-command] 'Custom-no-edit)
+ (define-key map "\^m" 'Custom-newline)
(define-key map " " 'scroll-up)
(define-key map "\177" 'scroll-down)
(define-key map "\C-c\C-c" 'Custom-set)
map)
"Keymap for `custom-mode'.")
+(defun Custom-no-edit (pos &optional event)
+ "Invoke button at POS, or refuse to allow editing of Custom buffer."
+ (interactive "@d")
+ (error "You can't edit this part of the Custom buffer"))
+
+(defun Custom-newline (pos &optional event)
+ "Invoke button at POS, or refuse to allow editing of Custom buffer."
+ (interactive "@d")
+ (let ((button (get-char-property pos 'button)))
+ (if button
+ (widget-apply-action button event)
+ (error "You can't edit this part of the Custom buffer"))))
+
(easy-menu-define Custom-mode-menu
custom-mode-map
"Menu used in customization buffers."
(setq widget-documentation-face 'custom-documentation)
(make-local-variable 'widget-button-face)
(setq widget-button-face custom-button)
+
+ ;; We need this because of the "More" button on docstrings.
+ ;; Otherwise clicking on "More" can push point offscreen, which
+ ;; causes the window to recenter on point, which pushes the
+ ;; newly-revealed docstring offscreen; which is annoying. -- cyd.
+ (set (make-local-variable 'widget-button-click-moves-point) t)
+
(set (make-local-variable 'widget-button-pressed-face) custom-button-pressed)
(set (make-local-variable 'widget-mouse-face) custom-button-mouse)
(put 'custom-mode 'mode-class 'special)
-(add-to-list
- 'debug-ignored-errors
- "^No user options have changed defaults in recent Emacs versions$")
+(dolist (regexp
+ '("^No user option defaults have been changed since Emacs "
+ "^Invalid face:? "
+ "^No \\(?:customized\\|rogue\\|saved\\) user options"
+ "^No customizable items matching "
+ "^There are unset changes"
+ "^Cannot set hidden variable"
+ "^No \\(?:saved\\|backup\\) value for "
+ "^No standard setting known for "
+ "^No standard setting for this face"
+ "^Saving settings from \"emacs -q\" would overwrite existing customizations"))
+ (add-to-list 'debug-ignored-errors regexp))
;;; The End.