Subject: bug#16265: 24.3.50; re-search-forward (error "Invalid search bound (wrong side of point)")

From: Keith David Bershatsky <[email-masked]>
Date: Sat, 28 Dec 2013 12:44:20 -0800

Nicolas:

This example demonstrates the problem caused when `org-capture` damages the line numbers in the `org-agenda-files`, making it impossible to go to the bottom of the buffer with (goto-char (point-max))  --  consequently, re-search-backward fails -- other functions fail also, e.g., `org-sort-entries`.

(defun example ()
(interactive)
   (let* (
      (org-todo-keywords '((sequence "Active(a)" "Next Action(n)" "Reference(r)"  "Someday(s)" "Delegated(d)" "|" "None(N)") ))
      (sample-todo (concat
        "* TASKS\n\n"
        "** Active [#A] smith @ drawer-one (fishing) | drawer-two (tennis). :lawlist:\n"
        "   DEADLINE: <2013-12-21 Sat 17:00>  SCHEDULED: <2013-12-21 Sat>\n"
        "   :PROPERTIES:\n"
        "   :DRAWER-ONE:  fishing\n"
        "   :DRAWER-TWO:  tennis\n"
        "   :END:\n\n"
        "** Next-Action [#B] doe @ drawer-one (football) | drawer-two (bowling). :fred:\n"
        "   DEADLINE: <2013-12-22 Sun 08:30>  SCHEDULED: <2013-12-22 Sun>\n"
        "   :PROPERTIES:\n"
        "   :DRAWER-ONE:  football\n"
        "   :DRAWER-TWO:  bowling\n"
        "   :END:\n\n"
        "* EVENTS\n\n"
        "** Reference [#C] john @ drawer-one (fishing) | drawer-two (sky-diving). :george:\n"
        "   DEADLINE: <2013-12-23 Mon 10:15>  SCHEDULED: <2013-12-23 Mon>\n"
        "   :PROPERTIES:\n"
        "   :DRAWER-ONE:  fishing\n"
        "   :DRAWER-TWO:  sky-diving\n"
        "   :END:\n\n"
        "* UNDATED\n\n"
        "** Someday [#D] jane @ drawer-one (basket-ball) | drawer-two (bowling). :sam:\n"
        "   DEADLINE: <2013-12-24 Tues 12:00>  SCHEDULED: <2013-12-24 Tues>\n"
        "   :PROPERTIES:\n"
        "   :DRAWER-ONE:  basket-ball\n"
        "   :DRAWER-TWO:  bowling\n"
        "   :END:")))
      (if (get-buffer "foo.org")
        (progn
          (switch-to-buffer "foo.org")
          (erase-buffer)
          (delete-other-windows))
        (switch-to-buffer (get-buffer-create "foo.org")))
      (org-mode)
      (linum-mode 1)
      (insert sample-todo)
      (goto-char (point-min))
      (or (y-or-n-p (format "For this example work, you must save this buffer as a file.  Proceed with example?"))
          (error "Canceled."))
      (write-file "~/Desktop/foo.org" t)
      (let* (
          (filename (buffer-file-name))
          (org-agenda-files (list filename))
          (org-capture-templates '(("n" "Next Action" entry (file+headline filename "TASKS")
      "** Next Action [#A] %?\n   DEADLINE: <%<%Y-%m-%d %a>>\n   :PROPERTIES:\n   :ToodledoID:\n   :ToodledoFolder: TASKS\n   :Hash:\n   :END:"
      :empty-lines 1))))
(search-backward-example)
(org-capture nil "n")
(message "-----------------------------")
(message "Here we can see that the line numbers in 'foo.org' got messed up.")
(sit-for 5)
(insert "Hello World! :lawlist:")
(org-capture-finalize)
(search-backward-example)
(message "-----------------------------")
(message "Here is where things really went wrong.  It's searching the WRONG todo.")
(message "-----------------------------")
(switch-to-buffer "*Messages*"))))

(defun search-backward-example ()
(require 'org-element)
  (let* (element todo-state title deadline scheduled day month year
        (org-todo-keywords '((sequence "Active(a)" "Next Action(n)" "Reference(r)"  "Someday(s)" "Delegated(d)" "|" "None(N)") )))
    (goto-char (point-max))
    (while (re-search-backward "^\*\* \\(Reference\\)" nil t)
      (setq element (org-element-at-point))
      (setq todo-state (org-element-property :todo-keyword element))
      (setq title (org-element-property :title element))
      (setq deadline (ignore-errors (org-element-property :deadline element) ))
      (setq scheduled (ignore-errors (org-element-property :scheduled element) ))
      (setq day (ignore-errors (org-element-property :day-start scheduled)))
      (setq month (ignore-errors (org-element-property :month-start scheduled)))
      (setq year (ignore-errors (org-element-property :year-start scheduled)))
      (message "-----------------------------")
      (message "todo-state:  %s" todo-state)
      (message "deadline:  %s" deadline)
      (message "scheduled:  %s" scheduled)
      (message "title:  %s" title)
      (message "day:  %s" day)
      (message "month:  %s" month)
      (message "year:  %s" year)
      (message "-----------------------------") )))