From 7cdff7b1eb050880e943ef3215bbd60de312fa18 Mon Sep 17 00:00:00 2001 From: Bastien Guerry Date: Mon, 27 Jul 2009 02:54:17 +0800 Subject: [PATCH] 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 --- lisp/ChangeLog | 9 +++++++ lisp/org-agenda.el | 1 + lisp/org-timer.el | 67 ++++++++++++++++++++++++++++++++++++++++++++++ lisp/org.el | 1 + 4 files changed, 78 insertions(+) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 2bd0179aa..5699e9713 100755 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,5 +1,14 @@ 2009-07-26 Bastien Guerry + * 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 ba36bd563..5c56e0a10 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 0b3663987..fc268df5d 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 93fe11d90..da4e7fcb6 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)