From 3ec43f6de185cde341b80579ecf3a051239e5fef Mon Sep 17 00:00:00 2001 From: Mauro Aranda Date: Tue, 24 Sep 2019 18:01:58 -0300 Subject: [PATCH] Fix indentation of widgets (Bug#7851) * lisp/wid-edit.el (widget--should-indent-p): New function, to decide whether to indent or not. (widget-checklist-value-add-item, widget-radio-add-item) (widget-editable-list-format-handler) (widget-editable-list-entry-create) (widget-group-value-create): Use it. --- lisp/wid-edit.el | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/lisp/wid-edit.el b/lisp/wid-edit.el index 2978dc8..52b7532 100644 --- a/lisp/wid-edit.el +++ b/lisp/wid-edit.el @@ -412,6 +412,17 @@ widget-specify-doc (overlay-put overlay 'evaporate t) (widget-put widget :doc-overlay overlay))) +(defun widget--should-indent-p (&optional check-after) + "Non-nil if we should indent at the current position. +With CHECK-AFTER non-nil, considers also the content after point, if needed." + (save-restriction + (widen) + (and (eq (preceding-char) ?\n) + (or (not check-after) + ;; If there is a space character, then we probably already + ;; indented it. + (not (eq (following-char) ?\s)))))) + (defmacro widget-specify-insert (&rest form) "Execute FORM without inheriting any text properties." (declare (debug body)) @@ -2254,7 +2265,7 @@ widget-checklist-value-create (defun widget-checklist-add-item (widget type chosen) "Create checklist item in WIDGET of type TYPE. If the item is checked, CHOSEN is a cons whose cdr is the value." - (and (eq (preceding-char) ?\n) + (and (widget--should-indent-p) (widget-get widget :indent) (insert-char ?\s (widget-get widget :indent))) (widget-specify-insert @@ -2435,7 +2446,7 @@ widget-radio-value-create (defun widget-radio-add-item (widget type) "Add to radio widget WIDGET a new radio button item of type TYPE." ;; (setq type (widget-convert type)) - (and (eq (preceding-char) ?\n) + (and (widget--should-indent-p) (widget-get widget :indent) (insert-char ?\s (widget-get widget :indent))) (widget-specify-insert @@ -2614,7 +2625,8 @@ widget-editable-list-format-handler ;; We recognize the insert button. ;; (let ((widget-push-button-gui widget-editable-list-gui)) (cond ((eq escape ?i) - (and (widget-get widget :indent) + (and (widget--should-indent-p) + (widget-get widget :indent) (insert-char ?\s (widget-get widget :indent))) (apply 'widget-create-child-and-convert widget 'insert-button @@ -2723,8 +2735,9 @@ widget-editable-list-entry-create child delete insert) (widget-specify-insert (save-excursion - (and (widget-get widget :indent) - (insert-char ?\s (widget-get widget :indent))) + (and (widget--should-indent-p) + (widget-get widget :indent) + (insert-char ?\s (widget-get widget :indent))) (insert (widget-get widget :entry-format))) ;; Parse % escapes in format. (while (re-search-forward "%\\(.\\)" nil t) @@ -2752,6 +2765,12 @@ widget-editable-list-entry-create (if insert (push insert buttons)) (if delete (push delete buttons)) (widget-put widget :buttons buttons)) + ;; After creating the entry, we must check if we should indent the + ;; following entry. This is necessary, for example, to keep the correct + ;; indentation of editable lists inside group widgets. + (and (widget--should-indent-p t) + (widget-get widget :indent) + (insert-char ?\s (widget-get widget :indent))) (let ((entry-from (point-min-marker)) (entry-to (point-max-marker))) (set-marker-insertion-type entry-from t) @@ -2786,7 +2805,7 @@ widget-group-value-create args (cdr args) answer (widget-match-inline arg value) value (cdr answer)) - (and (eq (preceding-char) ?\n) + (and (widget--should-indent-p) (widget-get widget :indent) (insert-char ?\s (widget-get widget :indent))) (push (cond ((null answer) -- 2.7.4