summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBastien Guerry <bzg@altern.org>2009-07-27 02:54:17 +0800
committerBastien Guerry <bzg@altern.org>2009-07-27 02:54:17 +0800
commit7cdff7b1eb050880e943ef3215bbd60de312fa18 (patch)
treeb115bad05c04d3a84964e582a725eef5bf9a66c2
parent7a1a62d2f258e73e01df889295369696a76dc77e (diff)
downloadorg-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-xlisp/ChangeLog9
-rw-r--r--lisp/org-agenda.el1
-rw-r--r--lisp/org-timer.el67
-rw-r--r--lisp/org.el1
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)