org-list: Fix infloop when inserting an item

* lisp/org-list.el (org-list-separating-blank-lines-number): When
  computing number of blank lines separating items, also count those
  in unparsed blocks, like example blocks.
* testing/lisp/test-org-list.el: Add tests.

In the following situation, with `org-blank-before-new-entry' set to
`auto' for `plain-list-item, a blank line should be inserted when
inserting the following item:

- item1
  #+BEGIN_EXAMPLE

  contents

  #+END_EXAMPLE
This commit is contained in:
Nicolas Goaziou 2012-11-13 15:45:09 +01:00
parent 2aeb28d2af
commit 5dbccdb432
2 changed files with 90 additions and 1 deletions

View File

@ -1230,7 +1230,9 @@ some heuristics to guess the result."
;; Are there blank lines inside the list so far?
((save-excursion
(goto-char (org-list-get-top-point struct))
(org-list-search-forward
;; Do not use `org-list-search-forward' so blank lines
;; in blocks can be counted in.
(re-search-forward
"^[ \t]*$" (org-list-get-item-end-before-blank item struct) t))
1)
;; Default choice: no blank line.

View File

@ -626,6 +626,93 @@
(search-forward "Text1")
(should (org-invisible-p2))))
(ert-deftest test-org-list/insert-item ()
"Test item insertion."
;; Blank lines specifications.
;;
;; Non-nil `org-blank-before-new-entry': insert a blank line, unless
;; `org-empty-line-terminates-plain-lists' is non-nil.
(should
(org-test-with-temp-text "- a"
(let ((org-empty-line-terminates-plain-lists nil)
(org-blank-before-new-entry '((plain-list-item . t))))
(end-of-line)
(org-insert-item)
(forward-line -1)
(looking-at "$"))))
(should-not
(org-test-with-temp-text "- a"
(let ((org-empty-line-terminates-plain-lists t)
(org-blank-before-new-entry '((plain-list-item . t))))
(end-of-line)
(org-insert-item)
(forward-line -1)
(looking-at "$"))))
;; Nil `org-blank-before-new-entry': do not insert a blank line.
(should-not
(org-test-with-temp-text "- a"
(let ((org-empty-line-terminates-plain-lists nil)
(org-blank-before-new-entry '((plain-list-item . nil))))
(end-of-line)
(org-insert-item)
(forward-line -1)
(looking-at "$"))))
;; `org-blank-before-new-entry' set to auto: if there's no blank
;; line already in the sole item, do not insert one.
(should-not
(org-test-with-temp-text "- a"
(let ((org-empty-line-terminates-plain-lists nil)
(org-blank-before-new-entry '((plain-list-item . auto))))
(end-of-line)
(org-insert-item)
(forward-line -1)
(looking-at "$"))))
;; `org-blank-before-new-entry' set to `auto': if there's a blank
;; line in the sole item, insert another one.
(should
(org-test-with-temp-text "- a\n\n b"
(let ((org-empty-line-terminates-plain-lists nil)
(org-blank-before-new-entry '((plain-list-item . auto))))
(goto-char (point-max))
(org-insert-item)
(forward-line -1)
(looking-at "$"))))
;; `org-blank-before-new-entry' set to `auto': if the user specified
;; a blank line, preserve it.
(should
(org-test-with-temp-text "- a\n\n"
(let ((org-empty-line-terminates-plain-lists nil)
(org-blank-before-new-entry '((plain-list-item . auto))))
(goto-char (point-max))
(org-insert-item)
(forward-line -1)
(looking-at "$"))))
;; `org-blank-before-new-entry' set to `auto': if some items in list
;; are already separated by blank lines, insert one.
(should
(org-test-with-temp-text "- a\n\n- b"
(let ((org-empty-line-terminates-plain-lists nil)
(org-blank-before-new-entry '((plain-list-item . auto))))
(goto-char (point-max))
(org-insert-item)
(forward-line -1)
(looking-at "$"))))
(should
(org-test-with-temp-text "- a\n\n- b"
(let ((org-empty-line-terminates-plain-lists nil)
(org-blank-before-new-entry '((plain-list-item . auto))))
(org-insert-item)
(forward-line)
(looking-at "$"))))
(should
(org-test-with-temp-text "- a\n #+BEGIN_EXAMPLE\n\n x\n #+END_EXAMPLE"
(let ((org-empty-line-terminates-plain-lists nil)
(org-blank-before-new-entry '((plain-list-item . auto))))
(goto-char (point-max))
(org-insert-item)
(forward-line -1)
(looking-at "$")))))
(provide 'test-org-list)
;;; test-org-list.el ends here