]> git.eshelyaron.com Git - emacs.git/commitdiff
Don't indent unrelated widgets following widget of type 'other
authorMauro Aranda <maurooaranda@gmail.com>
Thu, 26 Sep 2019 15:16:28 +0000 (17:16 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Thu, 26 Sep 2019 15:16:28 +0000 (17:16 +0200)
* lisp/wid-edit.el (widget 'other): Use \n instead of the %n escape in the
:format property of this widget.  If %n is used at the end of the
format string, unrelated widgets get indented.  (Bug#12533)

* test/wid-edit-tests.el (widget-test-indentation-after-%n)
(widget-test-indentation-after-newline)
(widget-test-newline-and-indent-same-widget): New tests.

lisp/wid-edit.el
test/lisp/wid-edit-tests.el

index 52b75325673fa753575a07e6eaddf78a223a197c..916d41af252cb03ca9707590d3fe3ca8d78b4d6c 100644 (file)
@@ -3063,7 +3063,7 @@ as in (other DEFAULT) or (other :tag \"NAME\" DEFAULT).
 If the user selects this alternative, that specifies DEFAULT
 as the value."
   :tag "Other"
-  :format "%t%n"
+  :format "%t\n"
   :value 'other)
 
 (defvar widget-string-prompt-value-history nil
index a4350e715ed00175b2200bc24e22fb3db1fc2534..679a29af8ff06917520c5c0d8e552f08a6d1e1c3 100644 (file)
     (insert-button "overlay button")
     (should-not (widget-at (1- (point))))))
 
+;; The following three tests compare the effect of using either %n or \n at the
+;; end of a format string, as well as using %n at the end or in the middle of
+;; the format string.  (Bug#12533)
+
+(ert-deftest widget-test-indentation-after-%n ()
+  "Fail when %n is used at the end of a format string."
+  :expected-result :failed
+  (with-temp-buffer
+    (let (wid indented)
+      (widget-insert "Testing indentation.\n")
+      ;; If we use %n at the end of the format string of the widget `other', we
+      ;; screw up indentation of the following widgets.
+      (setq wid (widget-create
+                 '(repeat :indent 4
+                   (cons
+                    string (choice (other :tag "Other" :format "%t%n" c))))))
+      (goto-char (widget-get wid :value-pos))
+      ;; Since we indent the `repeat' widget, we skip the space characters
+      ;; inserted.
+      (skip-chars-forward " ")
+      (setq indented (current-column)) ; Save the column to which we indented.
+      (should (eq indented (or (widget-get wid :indent) 0)))
+      ;; Insert an entry.  This simulates a click or RET at the INS button.
+      (widget-apply (widget-at) :action)
+      (goto-char (widget-get wid :value-pos))
+      (skip-chars-forward " ")
+      ;; This fails, because the button is not at the right column.
+      (should (eq (current-column) indented)))))
+
+(ert-deftest widget-test-indentation-after-newline ()
+  "Pass when the newline is used at the end of a format string."
+  (with-temp-buffer
+    (let (wid indented)
+      (widget-insert "Testing indentation.\n")
+      (setq wid (widget-create
+                 '(repeat :indent 4
+                   (cons
+                    string
+                    (choice (other :tag "Other" :format "%t\n" c))))))
+      (goto-char (widget-get wid :value-pos))
+      (skip-chars-forward " ")
+      (setq indented (current-column))
+      (should (eq (current-column) (or (widget-get wid :indent) 0)))
+      (widget-apply (widget-at) :action)
+      (goto-char (widget-get wid :value-pos))
+      (skip-chars-forward " ")
+      ;; Because we used \n in the format string, this pass.
+      (should (eq (current-column) indented)))))
+
+(ert-deftest widget-test-newline-and-indent-same-widget ()
+  "It's OK to use the %n escape sequence in the middle of the format string."
+  (with-temp-buffer
+    (let (wid indented)
+      (widget-insert "Testing indentation.\n")
+      (setq wid (widget-create
+                 '(repeat :indent 4
+                          :format "%{%t%}:%n%v%i\n"
+                          (cons
+                           string
+                           (choice (other :tag "Other" :format "%t\n" c))))))
+      (goto-char (widget-get wid :value-pos))
+      (skip-chars-forward " ")
+      (setq indented (current-column))
+      (should (eq indented (or (widget-get wid :indent) 0)))
+      (widget-apply (widget-at) :action)
+      (goto-char (widget-get wid :value-pos))
+      (skip-chars-forward " ")
+      (should (eq (current-column) indented))
+
+      ;; Also, the children are indented correctly.
+      (let ((grandchild
+             ;; This gets the `string' widget.
+             (car (widget-get (car (widget-get wid :children)) :children))))
+        (goto-char (widget-get grandchild :from))
+        (should (eq (current-column)
+                    (widget-get grandchild :indent)))))))
+
 ;;; wid-edit-tests.el ends here