summaryrefslogtreecommitdiff
path: root/lisp/cus-edit.el
diff options
context:
space:
mode:
Diffstat (limited to 'lisp/cus-edit.el')
-rw-r--r--lisp/cus-edit.el100
1 files changed, 94 insertions, 6 deletions
diff --git a/lisp/cus-edit.el b/lisp/cus-edit.el
index 0eeca7c2f31..f004002333b 100644
--- a/lisp/cus-edit.el
+++ b/lisp/cus-edit.el
@@ -1159,14 +1159,15 @@ argument or if the current major mode has no known group, prompt
for the MODE to customize."
(interactive
(list
- (let ((completion-regexp-list '("-mode\\'"))
- (group (custom-group-of-mode major-mode)))
+ (let ((group (custom-group-of-mode major-mode)))
(if (and group (not current-prefix-arg))
major-mode
(intern
(completing-read (format-prompt "Mode" (and group major-mode))
obarray
- 'custom-group-of-mode
+ (lambda (s)
+ (and (string-match "-mode\\'" (symbol-name s))
+ (custom-group-of-mode s)))
t nil nil (if group (symbol-name major-mode))))))))
(customize-group (custom-group-of-mode mode)))
@@ -1228,6 +1229,41 @@ If OTHER-WINDOW is non-nil, display in another window."
(message "`%s' is an alias for `%s'" symbol basevar))))
;;;###autoload
+(defun customize-toggle-option (symbol)
+ "Toggle the value of boolean option SYMBOL for this session."
+ (interactive (let ((prompt "Toggle boolean option: ") opts)
+ (mapatoms
+ (lambda (sym)
+ (when (eq (get sym 'custom-type) 'boolean)
+ (push sym opts))))
+ (list (intern (completing-read prompt opts nil nil nil nil
+ (symbol-at-point))))))
+ (let* ((setter (or (get symbol 'custom-set) #'set-default))
+ (getter (or (get symbol 'custom-get) #'symbol-value))
+ (value (condition-case nil
+ (funcall getter symbol)
+ (void-variable (error "`%s' is not bound" symbol))))
+ (type (get symbol 'custom-type)))
+ (cond
+ ((eq type 'boolean))
+ ((and (null type)
+ (yes-or-no-p
+ (format "`%s' doesn't have a type, and has the value %S. \
+Proceed to toggle?" symbol value))))
+ ((yes-or-no-p
+ (format "`%s' is of type %s, and has the value %S. \
+Proceed to toggle?"
+ symbol type value)))
+ ((error "Abort toggling of option `%s'" symbol)))
+ (message "%s user options `%s'."
+ (if (funcall setter symbol (not value))
+ "Enabled" "Disabled")
+ symbol)))
+
+;;;###autoload
+(defalias 'toggle-option #'customize-toggle-option)
+
+;;;###autoload
(defalias 'customize-variable-other-window 'customize-option-other-window)
;;;###autoload
@@ -5389,9 +5425,49 @@ The following properties have special meanings for this widget:
:hidden-states '(standard)
:action #'custom-icon-action
:custom-set #'custom-icon-set
- :custom-reset-current #'custom-redraw)
- ;; Not implemented yet.
- ;; :custom-reset-saved 'custom-icon-reset-saved)
+ :custom-mark-to-save #'custom-icon-mark-to-save
+ :custom-reset-current #'custom-redraw
+ :custom-reset-saved #'custom-icon-reset-saved
+ :custom-state-set-and-redraw #'custom-icon-state-set-and-redraw
+ :custom-reset-standard #'custom-icon-reset-standard
+ :custom-mark-to-reset-standard #'custom-icon-mark-to-reset-standard)
+
+(defun custom-icon-mark-to-save (widget)
+ "Mark user customization for icon edited by WIDGET to be saved later."
+ (let* ((icon (widget-value widget))
+ (value (custom--icons-widget-value
+ (car (widget-get widget :children)))))
+ (custom-push-theme 'theme-icon icon 'user 'set value)))
+
+(defun custom-icon-reset-saved (widget)
+ "Restore icon customized by WIDGET to the icon's default attributes.
+
+If there's a theme value for the icon, resets to that. Otherwise, resets to
+its standard value."
+ (let* ((icon (widget-value widget)))
+ (custom-push-theme 'theme-icon icon 'user 'reset)
+ (custom-icon-state-set widget)
+ (custom-redraw widget)))
+
+(defun custom-icon-state-set-and-redraw (widget)
+ "Set state of icon widget WIDGET and redraw it with up-to-date settings."
+ (custom-icon-state-set widget)
+ (custom-redraw-magic widget))
+
+(defun custom-icon-reset-standard (widget)
+ "Reset icon edited by WIDGET to its standard value."
+ (let* ((icon (widget-value widget))
+ (themes (get icon 'theme-icon)))
+ (dolist (theme themes)
+ (custom-push-theme 'theme-icon icon (car theme) 'reset))
+ (custom-save-all))
+ (widget-put widget :custom-state 'unknown)
+ (custom-redraw widget))
+
+(defun custom-icon-mark-to-reset-standard (widget)
+ "Reset icon edited by WIDGET to its standard value."
+ ;; Don't mark for now, there aren't that many icons.
+ (custom-icon-reset-standard widget))
(defvar custom-icon-extended-menu
(let ((map (make-sparse-keymap)))
@@ -5410,6 +5486,18 @@ The following properties have special meanings for this widget:
:enable (memq
(widget-get custom-actioned-widget :custom-state)
'(modified changed))))
+ (define-key-after map [custom-icon-reset-saved]
+ '(menu-item "Revert This Session's Customization"
+ custom-icon-reset-saved
+ :enable (memq
+ (widget-get custom-actioned-widget :custom-state)
+ '(modified set changed rogue))))
+ (when (or custom-file init-file-user)
+ (define-key-after map [custom-icon-reset-standard]
+ '(menu-item "Erase Customization" custom-icon-reset-standard
+ :enable (memq
+ (widget-get custom-actioned-widget :custom-state)
+ '(modified set changed saved rogue)))))
map)
"A menu for `custom-icon' widgets.
Used in `custom-icon-action' to show a menu to the user.")