diff options
author | Nicolas Goaziou <n.goaziou@gmail.com> | 2010-07-12 10:48:17 +0200 |
---|---|---|
committer | Nicolas Goaziou <n.goaziou@gmail.com> | 2010-09-01 19:05:44 +0200 |
commit | f7f07198dd1331424cb02ca66e91b7d010152595 (patch) | |
tree | 1f6c5beb1afe2899bdfd105a3affeb89096204b3 | |
parent | 30fb7a570aa797506c1782bbd6d267c1fe6aba7b (diff) | |
download | org-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.el | 64 |
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. |