summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Goaziou <n.goaziou@gmail.com>2010-07-12 10:48:17 +0200
committerNicolas Goaziou <n.goaziou@gmail.com>2010-09-01 19:05:44 +0200
commitf7f07198dd1331424cb02ca66e91b7d010152595 (patch)
tree1f6c5beb1afe2899bdfd105a3affeb89096204b3
parent30fb7a570aa797506c1782bbd6d267c1fe6aba7b (diff)
downloadorg-mode-f7f07198dd1331424cb02ca66e91b7d010152595.tar.gz
Fix for `org-search-forward-unenclosed' and `org-search-backward-unenclosed'.
* lisp/org-list.el (org-search-forward-unenclosed): fix behavior when last occurence was enclosed. * lisp/org-list.el (org-search-backward-unenclosed): fix behavior when last occurence was enclosed.
-rw-r--r--lisp/org-list.el64
1 files changed, 41 insertions, 23 deletions
diff --git a/lisp/org-list.el b/lisp/org-list.el
index 60927a8..0647a40 100644
--- a/lisp/org-list.el
+++ b/lisp/org-list.el
@@ -257,29 +257,47 @@ the end of the nearest terminator from max."
;; we want to be on the first line of the list ender
(match-beginning 0)))))
-(defun org-search-backward-unenclosed (regexp &optional bound noerror)
- "Like `re-search-backward' but don't stop inside blocks or throw errors."
- (ignore-errors
- (prog1
- (re-search-backward regexp bound noerror)
- (when (save-match-data
- (or (org-in-regexps-block-p "^[ \t]*#\\+begin_\\([a-zA-Z]+\\)"
- '(concat "^[ \t]*#\\+end_" (match-string 1)))
- (org-in-regexps-block-p "^[ \t]*\\\\begin{\\([a-zA-Z]+\\)}"
- '(concat "^[ \t]*\\\\end{" (match-string 1) "}"))))
- (org-search-backward-unenclosed regexp bound noerror)))))
-
-(defun org-search-forward-unenclosed (regexp &optional bound noerror)
- "Like `re-search-forward' but don't stop inside blocks or throw errors."
- (ignore-errors
- (prog1
- (re-search-forward regexp bound noerror)
- (when (save-match-data
- (or (org-in-regexps-block-p "^[ \t]*#\\+begin_\\([a-zA-Z]+\\)"
- '(concat "^[ \t]*#\\+end_" (match-string 1)))
- (org-in-regexps-block-p "^[ \t]*\\\\begin{\\([a-zA-Z]+\\)}"
- '(concat "^[ \t]*\\\\end{" (match-string 1) "}"))))
- (org-search-forward-unenclosed regexp bound noerror)))))
+(defun org-search-backward-unenclosed (regexp &optional bound noerror count)
+ "Like `re-search-backward' but don't stop inside blocks or throw errors.
+
+Optional fourth argument COUNT searches for that many occurrences,
+valid or not, then makes sure the last one is valid."
+ (let ((origin (point)))
+ (cond
+ ;; nothing found: return nil
+ ((not (re-search-backward regexp bound (or noerror t) count)) nil)
+ ;; match is not enclosed: return point.
+ ((not (save-match-data
+ (or (org-in-regexps-block-p "^[ \t]*#\\+begin_\\([a-zA-Z]+\\)"
+ '(concat "^[ \t]*#\\+end_" (match-string 1)))
+ (org-in-regexps-block-p "^[ \t]*\\\\begin{\\([a-zA-Z]+\\)}"
+ '(concat "^[ \t]*\\\\end{" (match-string 1) "}")))))
+ (point))
+ (t
+ ;; else: we start again, searching one more occurrence away.
+ (goto-char origin)
+ (org-search-backward-unenclosed regexp bound noerror (1+ (or count 1)))))))
+
+(defun org-search-forward-unenclosed (regexp &optional bound noerror count)
+ "Like `re-search-forward' but don't stop inside blocks or throw errors.
+
+Optional fourth argument COUNT searches for that many occurrences,
+valid or not, then makes sure the last one is valid."
+ (let ((origin (point)))
+ (cond
+ ;; nothing found: return nil
+ ((not (re-search-forward regexp bound (or noerror t) count)) nil)
+ ;; match is not enclosed: return point.
+ ((not (save-match-data
+ (or (org-in-regexps-block-p "^[ \t]*#\\+begin_\\([a-zA-Z]+\\)"
+ '(concat "^[ \t]*#\\+end_" (match-string 1)))
+ (org-in-regexps-block-p "^[ \t]*\\\\begin{\\([a-zA-Z]+\\)}"
+ '(concat "^[ \t]*\\\\end{" (match-string 1) "}")))))
+ (point))
+ ;; else: we start again, searching one more occurrence away.
+ (t
+ (goto-char origin)
+ (org-search-forward-unenclosed regexp bound noerror (1+ (or count 1)))))))
(defun org-get-item-same-level-internal (search-fun pos limit pre-move)
"Return point at the beginning of next item at the same level.