summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMauro Aranda <maurooaranda@gmail.com>2019-09-26 17:16:28 +0200
committerLars Ingebrigtsen <larsi@gnus.org>2019-09-26 17:16:28 +0200
commit45524b9702b4a6face2cf453eb02ddf10a496b45 (patch)
treebd97db6a79a4e364c7fb140a168bdab539feaaf3
parent08fbe91dfebf023bb45f1485fb432e9118ef5abb (diff)
downloademacs-45524b9702b4a6face2cf453eb02ddf10a496b45.tar.gz
Don't indent unrelated widgets following widget of type 'other
* 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.
-rw-r--r--lisp/wid-edit.el2
-rw-r--r--test/lisp/wid-edit-tests.el77
2 files changed, 78 insertions, 1 deletions
diff --git a/lisp/wid-edit.el b/lisp/wid-edit.el
index 52b75325673..916d41af252 100644
--- a/lisp/wid-edit.el
+++ b/lisp/wid-edit.el
@@ -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
diff --git a/test/lisp/wid-edit-tests.el b/test/lisp/wid-edit-tests.el
index a4350e715ed..679a29af8ff 100644
--- a/test/lisp/wid-edit-tests.el
+++ b/test/lisp/wid-edit-tests.el
@@ -36,4 +36,81 @@
(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