diff options
author | Bastien Guerry <bzg@altern.org> | 2009-07-27 02:54:17 +0800 |
---|---|---|
committer | Bastien Guerry <bzg@altern.org> | 2009-07-27 02:54:17 +0800 |
commit | 7cdff7b1eb050880e943ef3215bbd60de312fa18 (patch) | |
tree | b115bad05c04d3a84964e582a725eef5bf9a66c2 | |
parent | 7a1a62d2f258e73e01df889295369696a76dc77e (diff) | |
download | org-mode-7cdff7b1eb050880e943ef3215bbd60de312fa18.tar.gz |
New timer functionality to set a timer from a headline.
This commit defines three new functions in org-timer.el:
- org-timer-set-timer, bound to `C-c C-x ;' in Org buffers
and to `;' in Org agenda buffers. This function sets a
timer for the headline the cursor is currently it. Up to
three timers can be set.
- org-timer-show-remaining-time: this shows the remaining
time for the last set timer.
- org-timer-reset-timers: this reset all timers.
This functionality was requested by Samuel Wales and emulates
that of tea-time.el -- see the emacswiki doc about tea-time.el:
http://www.emacswiki.org/emacs/tea-time
-rwxr-xr-x | lisp/ChangeLog | 9 | ||||
-rw-r--r-- | lisp/org-agenda.el | 1 | ||||
-rw-r--r-- | lisp/org-timer.el | 67 | ||||
-rw-r--r-- | lisp/org.el | 1 |
4 files changed, 78 insertions, 0 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 2bd0179..5699e97 100755 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,5 +1,14 @@ 2009-07-26 Bastien Guerry <bzg@altern.org> + * org-agenda.el (org-agenda-mode-map): New key for + org-timer-set-timer called from the agenda. + + * org.el (org-mode-map): New key for org-timer-set-timer. + + * org-timer.el (org-timer-reset-timers) + (org-timer-show-remaining-time, org-timer-set-timer): New + functions. + * org-clock.el (org-show-notification): Update the docstring. * org.el (org-provide-todo-statistics): Allow new value diff --git a/lisp/org-agenda.el b/lisp/org-agenda.el index ba36bd5..5c56e0a 100644 --- a/lisp/org-agenda.el +++ b/lisp/org-agenda.el @@ -1391,6 +1391,7 @@ The following commands are available: (org-defkey org-agenda-mode-map "}" 'org-agenda-manipulate-query-subtract-re) (org-defkey org-agenda-mode-map "/" 'org-agenda-filter-by-tag) (org-defkey org-agenda-mode-map "\\" 'org-agenda-filter-by-tag-refine) +(org-defkey org-agenda-mode-map ";" 'org-timer-set-timer) (defvar org-agenda-keymap (copy-keymap org-agenda-mode-map) "Local keymap for agenda entries from Org-mode.") diff --git a/lisp/org-timer.el b/lisp/org-timer.el index 0b36639..fc268df 100644 --- a/lisp/org-timer.el +++ b/lisp/org-timer.el @@ -253,6 +253,73 @@ VALUE can be `on', `off', or `pause'." (concat " <" (substring (org-timer-value-string) 0 -1) ">")) (force-mode-line-update))) +(defvar org-timer-timer1 nil) +(defvar org-timer-timer2 nil) +(defvar org-timer-timer3 nil) + +(defun org-timer-reset-timers () + "Reset all timers." + (interactive) + (mapcar (lambda(timer) + (when (eval timer) + (cancel-timer timer) + (setq timer nil))) + '(org-timer-timer1 + org-timer-timer2 + org-timer-timer3)) + (message "All timers reset")) + +(defun org-timer-show-remaining-time () + "Display the remaining time before the timer ends." + (interactive) + (require 'time) + (if (and (not org-timer-timer1) + (not org-timer-timer2) + (not org-timer-timer3)) + (message "No timer set") + (let* ((rtime (decode-time + (time-subtract (timer--time (or org-timer-timer3 + org-timer-timer2 + org-timer-timer1)) + (current-time)))) + (rsecs (nth 0 rtime)) + (rmins (nth 1 rtime))) + (message "%d minutes %d secondes left before next time out" + rmins rsecs)))) + +(defun org-timer-set-timer (minutes) + "Set a timer." + (interactive "sTime out in (min)? ") + (if (not (string-match "[0-9]+" minutes)) + (org-timer-show-remaining-time) + (let* ((mins (string-to-number (match-string 0 minutes))) + (secs (* mins 60)) + (hl (cond + ((string-match "Org Agenda" (buffer-name)) + (let* ((marker (or (get-text-property (point) 'org-marker) + (org-agenda-error))) + (hdmarker (or (get-text-property (point) 'org-hd-marker) + marker)) + (pos (marker-position marker))) + (with-current-buffer (marker-buffer marker) + (widen) + (goto-char pos) + (org-show-entry) + (setq heading (org-get-heading))))) + ((eq major-mode 'org-mode) + (org-get-heading)) + (t (error "Not in an Org buffer")))) + timer-set) + (mapcar (lambda(timer) + (if (not (or (eval timer) timer-set)) + (setq timer-set t + timer + (run-with-timer secs nil 'org-show-notification + (format "%s: time out" hl))))) + '(org-timer-timer1 + org-timer-timer2 + org-timer-timer3))))) + (provide 'org-timer) ;; arch-tag: 97538f8c-3871-4509-8f23-1e7b3ff3d107 diff --git a/lisp/org.el b/lisp/org.el index 93fe11d..da4e7fc 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -13998,6 +13998,7 @@ The images can be removed again with \\[org-ctrl-c-ctrl-c]." (org-defkey org-mode-map "\C-c\C-xp" 'org-set-property) (org-defkey org-mode-map "\C-c\C-xo" 'org-toggle-ordered-property) (org-defkey org-mode-map "\C-c\C-xi" 'org-insert-columns-dblock) +(org-defkey org-mode-map [(control ?c) (control ?x) (control ?\;)] 'org-timer-set-timer) (org-defkey org-mode-map "\C-c\C-x." 'org-timer) (org-defkey org-mode-map "\C-c\C-x-" 'org-timer-item) |