summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Goaziou <mail@nicolasgoaziou.fr>2016-05-05 10:18:21 +0200
committerNicolas Goaziou <mail@nicolasgoaziou.fr>2016-05-05 12:59:46 +0200
commit83e373f109e58900201e7cb3daa8bbebd7121b84 (patch)
treef807e43b438a2552b81f5b3b0807e3c96a89163f
parent1ca1d52e922ef63713ad25f39051e0f946dc11b7 (diff)
downloadorg-mode-83e373f109e58900201e7cb3daa8bbebd7121b84.tar.gz
Fix `org-occur' when regexp matches a single char
* lisp/org.el (org-occur): Fix infloop when regexp matches a single char. Improve docstring. (org-check-before-date): (org-check-after-date): (org-check-dates-range): Match correct object since point may be at the beginning of the next one. * testing/lisp/test-org.el (test-org/occur): New test.
-rw-r--r--lisp/org.el36
-rw-r--r--testing/lisp/test-org.el21
2 files changed, 45 insertions, 12 deletions
diff --git a/lisp/org.el b/lisp/org.el
index 351d024..324fc94 100644
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -13930,14 +13930,18 @@ as well.")
(defun org-occur (regexp &optional keep-previous callback)
"Make a compact tree which shows all matches of REGEXP.
-The tree will show the lines where the regexp matches, and all higher
-headlines above the match. It will also show the heading after the match,
-to make sure editing the matching entry is easy.
-If KEEP-PREVIOUS is non-nil, highlighting and exposing done by a previous
-call to `org-occur' will be kept, to allow stacking of calls to this
-command.
-If CALLBACK is non-nil, it is a function which is called to confirm
-that the match should indeed be shown."
+
+The tree will show the lines where the regexp matches, and any other context
+defined in `org-show-context-detail', which see.
+
+When optional argument KEEP-PREVIOUS is non-nil, highlighting and exposing
+done by a previous call to `org-occur' will be kept, to allow stacking of
+calls to this command.
+
+Optional argument CALLBACK can be a function of no argument. In this case,
+it is called with point at the end of the match, match data being set
+accordingly. Current match is shown only if the return value is non-nil.
+The function must neither move point nor alter narrowing."
(interactive "sRegexp: \nP")
(when (equal regexp "")
(user-error "Regexp cannot be empty"))
@@ -13952,7 +13956,6 @@ that the match should indeed be shown."
;; hide everything
(org-overview))
(while (re-search-forward regexp nil t)
- (backward-char) ;; FIXME: Match timestamps at the end of a headline
(when (or (not callback)
(save-match-data (funcall callback)))
(setq cnt (1+ cnt))
@@ -17549,7 +17552,10 @@ both scheduled and deadline timestamps."
`(lambda ()
(let ((match (match-string 1)))
(and ,(if (memq org-ts-type '(active inactive all))
- '(eq (org-element-type (org-element-context)) 'timestamp)
+ '(eq (org-element-type (save-excursion
+ (backward-char)
+ (org-element-context)))
+ 'timestamp)
'(org-at-planning-p))
(time-less-p
(org-time-string-to-time match)
@@ -17566,7 +17572,10 @@ both scheduled and deadline timestamps."
`(lambda ()
(let ((match (match-string 1)))
(and ,(if (memq org-ts-type '(active inactive all))
- '(eq (org-element-type (org-element-context)) 'timestamp)
+ '(eq (org-element-type (save-excursion
+ (backward-char)
+ (org-element-context)))
+ 'timestamp)
'(org-at-planning-p))
(not (time-less-p
(org-time-string-to-time match)
@@ -17585,7 +17594,10 @@ both scheduled and deadline timestamps."
(let ((match (match-string 1)))
(and
,(if (memq org-ts-type '(active inactive all))
- '(eq (org-element-type (org-element-context)) 'timestamp)
+ '(eq (org-element-type (save-excursion
+ (backward-char)
+ (org-element-context)))
+ 'timestamp)
'(org-at-planning-p))
(not (time-less-p
(org-time-string-to-time match)
diff --git a/testing/lisp/test-org.el b/testing/lisp/test-org.el
index 3707be1..73245b4 100644
--- a/testing/lisp/test-org.el
+++ b/testing/lisp/test-org.el
@@ -4015,6 +4015,27 @@ Paragraph<point>"
(search-forward "H2")
(org-invisible-p2))))
+(ert-deftest test-org/occur ()
+ "Test `org-occur' specifications."
+ ;; Count number of matches.
+ (should
+ (= 1
+ (org-test-with-temp-text "* H\nA\n* H2"
+ (org-occur "A"))))
+ (should
+ (= 2
+ (org-test-with-temp-text "* H\nA\n* H2\nA"
+ (org-occur "A"))))
+ ;; Test CALLBACK optional argument.
+ (should
+ (= 0
+ (org-test-with-temp-text "* H\nA\n* H2"
+ (org-occur "A" nil (lambda () (equal (org-get-heading) "H2"))))))
+ (should
+ (= 1
+ (org-test-with-temp-text "* H\nA\n* H2\nA"
+ (org-occur "A" nil (lambda () (equal (org-get-heading) "H2")))))))
+
;;; Timestamps API