Fix unscheduling and un-daedlining so that it will work with

nonstandard locations of these timestamps.
Problem was reported by Pete Phillips.
This commit is contained in:
Carsten Dominik 2008-02-04 11:16:07 +01:00
parent bc69ea13dd
commit 65a32c2ab3
3 changed files with 104 additions and 23 deletions

15
.gitignore vendored
View File

@ -1,15 +0,0 @@
test
*~
*#
*.html
*.elc
org.pdf
org
orgcard.pdf
orgcard.ps
orgcard_letter.*
*.aux *.cp *.cps *.dvi *.fn *.fns *.ky *.kys *.pg *.pgs
*.toc *.tp *.tps *.vr *.vrs *.log *.html *.ps
org-install.el
manual
RELEASEDIR

View File

@ -1,3 +1,10 @@
2008-02-04 Carsten Dominik <dominik@science.uva.nl>
* org.el (org-remove-timestamp-with-keyword): New function.
(org-schedule, org-deadline): Use
`org-remove-timestamp-with-keyword' to make sure all such time
stamps are removed.
2008-02-03 Carsten Dominik <dominik@science.uva.nl>
* org.el (org-agenda-get-deadlines): Make sure priorities increase

105
org.el
View File

@ -14693,7 +14693,7 @@ With argument REMOVE, remove any deadline from the item."
(interactive "P")
(if remove
(progn
(org-add-planning-info nil nil 'deadline)
(org-remove-timestamp-with-keyword org-deadline-string)
(message "Item no longer has a deadline."))
(org-add-planning-info 'deadline nil 'closed)))
@ -14703,10 +14703,23 @@ With argument REMOVE, remove any scheduling date from the item."
(interactive "P")
(if remove
(progn
(org-add-planning-info nil nil 'scheduled)
(org-remove-timestamp-with-keyword org-scheduled-string)
(message "Item is no longer scheduled."))
(org-add-planning-info 'scheduled nil 'closed)))
(defun org-remove-timestamp-with-keyword (keyword)
"Remove all time stamps with KEYWORD in the current entry."
(let ((re (concat "\\<" (regexp-quote keyword) " +<[^>\n]+>[ \t]*"))
beg)
(save-excursion
(org-back-to-heading t)
(setq beg (point))
(org-end-of-subtree t t)
(while (re-search-backward re beg t)
(replace-match "")
(unless (string-match "\\S-" (buffer-substring (point-at-bol) (point)))
(delete-region (point-at-bol) (min (1+ (point)) (point-max))))))))
(defun org-add-planning-info (what &optional time &rest remove)
"Insert new timestamp with keyword in the line directly after the headline.
WHAT indicates what kind of time stamp to add. TIME indicated the time to use.
@ -28069,12 +28082,88 @@ Still experimental, may disappear in the future."
;(let ((org-refile-targets org-refile-targets)
; (org-refile-use-outline-path org-refile-use-outline-path))
; (when (equal just-goto '(16))
; (setq org-refile-targets '((nil . (:maxlevel . 10))))
; (setq org-refile-use-outline-path t))
; (setq org-refile-target-table (org-get-refile-targets default-buffer)))
(defun org-update-checkbox-count (&optional all)
"Update the checkbox statistics in the current section.
This will find all statistic cookies like [57%] and [6/12] and update them
with the current numbers. With optional prefix argument ALL, do this for
the whole buffer."
(interactive "P")
(save-excursion
(let* ((buffer-invisibility-spec (org-inhibit-invisibility)) ; Emacs 21
(beg (condition-case nil
(progn (outline-back-to-heading) (point))
(error (point-min))))
(end (move-marker (make-marker)
(progn (outline-next-heading) (point))))
(re "\\(\\[[0-9]*%\\]\\)\\|\\(\\[[0-9]*/[0-9]*\\]\\)")
(re-box "^[ \t]*\\([-+*]\\|[0-9]+[.)]\\) +\\(\\[[- X]\\]\\)")
beg-cookie end-cookie is-percent c-on c-off lim
eline curr-ind next-ind
(cstat 0)
)
(when all
(goto-char (point-min))
(outline-next-heading)
(setq beg (point) end (point-max)))
(goto-char end)
;; find each statistic cookie
(while (re-search-backward re beg t)
(setq cstat (1+ cstat)
beg-cookie (match-beginning 0)
end-cookie (match-end 0)
is-percent (match-beginning 1)
lim (cond
((org-on-heading-p) (outline-next-heading) (point))
((org-at-item-p) (org-end-of-item) (point))
(t nil))
c-on 0
c-off 0
)
(when lim
;; find first checkbox for this cookie and gather
;; statistics from all that are at this indentation level
(goto-char end-cookie)
(if (re-search-forward re-box lim t)
(progn
(org-beginning-of-item)
(setq curr-ind (org-get-indentation))
(setq next-ind curr-ind)
(while (= curr-ind next-ind)
(save-excursion (end-of-line) (setq eline (point)))
(if (re-search-forward re-box eline t)
(if (member (match-string 2) '("[ ]" "[-]"))
(setq c-off (1+ c-off))
(setq c-on (1+ c-on))
)
)
(org-end-of-item)
(setq next-ind (org-get-indentation))
)))
;; update cookie
(delete-region beg-cookie end-cookie)
(goto-char beg-cookie)
(insert
(if is-percent
(format "[%d%%]" (/ (* 100 c-on) (max 1 (+ c-on c-off))))
(format "[%d/%d]" c-on (+ c-on c-off))))
;; update items checkbox if it has one
(when (org-at-item-p)
(org-beginning-of-item)
(save-excursion (end-of-line) (setq eline (point)))
(when (re-search-forward re-box eline t)
(setq beg-cookie (match-beginning 2)
end-cookie (match-end 2))
(delete-region beg-cookie end-cookie)
(goto-char beg-cookie)
(cond ((= c-off 0) (insert "[X]"))
((= c-on 0) (insert "[ ]"))
(t (insert "[-]")))
)))
(goto-char beg-cookie)
)
(when (interactive-p)
(message "Checkbox satistics updated %s (%d places)"
(if all "in entire file" "in current outline entry") cstat)))))
;;;; Finish up