From d77851ba8b434697a7e5a797e9115fe008b4ecf5 Mon Sep 17 00:00:00 2001 From: Mauro Aranda Date: Sat, 15 Jul 2023 18:54:14 -0300 Subject: [PATCH] Preserve comments when redrawing a widget (Bug#64649) * lisp/cus-edit.el (custom-comment-preserve): New function. (custom-redraw): Use it. (custom-comment-create): Make sure :comment-shown is set to t if the comment widget gets created. (custom-face-value-create, custom-variable-value-create): Recreate the custom-comment widget with the preserved value, if any. --- lisp/cus-edit.el | 45 ++++++++++++++++++++++++++++++++------------- 1 file changed, 32 insertions(+), 13 deletions(-) diff --git a/lisp/cus-edit.el b/lisp/cus-edit.el index dbef5f47cd6..1c4de92db12 100644 --- a/lisp/cus-edit.el +++ b/lisp/cus-edit.el @@ -2330,6 +2330,7 @@ custom-redraw (from (marker-position (widget-get widget :from))) (to (marker-position (widget-get widget :to)))) (save-excursion + (custom-comment-preserve widget) (widget-value-set widget (widget-value widget)) (custom-redraw-magic widget)) (when (and (>= pos from) (<= pos to)) @@ -2509,7 +2510,9 @@ custom-comment-create (let* ((null-comment (equal "" (widget-value widget)))) (if (or (widget-get (widget-get widget :parent) :comment-shown) (not null-comment)) - (widget-default-create widget) + (progn + (widget-default-create widget) + (widget-put (widget-get widget :parent) :comment-shown t)) ;; `widget-default-delete' expects markers in these slots -- ;; maybe it shouldn't. (widget-put widget :from (point-marker)) @@ -2542,6 +2545,14 @@ custom-comment-invisible-p (and (equal "" val) (not (widget-get widget :comment-shown))))) +;; This is useful when we want to redraw a widget, but we want to preserve +;; edits made by the user in the comment widget. (See Bug#64649) +(defun custom-comment-preserve (widget) + "Preserve the comment that belongs to WIDGET." + (when (widget-get widget :comment-shown) + (let ((comment-widget (widget-get widget :comment-widget))) + (widget-put comment-widget :value (widget-value comment-widget))))) + ;;; The `custom-variable' Widget. (defface custom-variable-obsolete @@ -2821,12 +2832,16 @@ custom-variable-value-create ;; The comment field (unless (eq state 'hidden) - (let* ((comment (get symbol 'variable-comment)) - (comment-widget - (widget-create-child-and-convert - widget 'custom-comment - :parent widget - :value (or comment "")))) + (let ((comment-widget + (widget-create-child-and-convert + widget 'custom-comment + :parent widget + :value (or + (and + (widget-get widget :comment-shown) + (widget-value (widget-get widget :comment-widget))) + (get symbol 'variable-comment) + "")))) (widget-put widget :comment-widget comment-widget) ;; Don't push it !!! Custom assumes that the first child is the ;; value one. @@ -3831,12 +3846,16 @@ custom-face-value-create widget :visibility-widget 'custom-visibility) ;; The comment field (unless hiddenp - (let* ((comment (get symbol 'face-comment)) - (comment-widget - (widget-create-child-and-convert - widget 'custom-comment - :parent widget - :value (or comment "")))) + (let ((comment-widget + (widget-create-child-and-convert + widget 'custom-comment + :parent widget + :value (or + (and + (widget-get widget :comment-shown) + (widget-value (widget-get widget :comment-widget))) + (get symbol 'face-comment) + "")))) (widget-put widget :comment-widget comment-widget) (push comment-widget children)))) -- 2.34.1