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 "-----------------------------") )))