emacs-orgmode
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Orgmode] [PATCH 3/3] Add clock persistence.


From: Carsten Dominik
Subject: Re: [Orgmode] [PATCH 3/3] Add clock persistence.
Date: Tue, 28 Oct 2008 08:33:04 +0100

Hi,

I have now applied these patches and put some initial documentation into http://orgmode.org/Changes.html.

Since I have not yet tested this myself, I would he glad if some of you clocking people could test it and report.

Thanks.

- Carsten

On Oct 23, 2008, at 12:28 PM, James TD Smith wrote:

Clock-related data are saved when exiting emacs ands restored when emacs
is restarted. The data saved include the contents of `org-clock-history',
and the running clock, if there is one.

To use this, you will need to add

(require 'org-clock)
(org-clock-persistence-insinuate)

to your .emacs and either add

(setq org-clock-persist t)
(setq org-clock-in-resume t)

or set those options to t in custom.

This patch requires the clock resume patch.
---
lisp/ChangeLog    |   16 +++++++++
lisp/org-clock.el |   90 +++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 106 insertions(+), 0 deletions(-)

diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 438296d..063ae15 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -10,6 +10,22 @@
(org-clock-in): When clocking in to an entry, if
`org-clock-in-resume' is set, check if the first clock line is
open and if so, start the clock from the time in the clock line.
+ (org-clock-persist): Add a custom option to toggle clock
+ persistence.
+ (org-clock-persist-query-save): Add a custom option to toggle
+ asking the user if they want to save the running clock when
+ exiting.
+ (org-clock-persist-query-resume): Add a custom option to toggle
+ asking the user if they want to resume the saved clock when Emacs
+ is restarted.
+ (org-clock-save): Add a function to save clock data.
+ This includes the contents of `org-clock-history' and the buffer
+ and position of the currently clocked task, if any.
+ (org-clock-load): Add a function to load clock data.
+ This populates `org-clock-history', and resumes the saved clocked
+ task if there is one.
+ (org-clock-persistence-insinuate): Add a method to set up the
+ hooks for clock persistence.

2008-10-22  Carsten Dominik  <address@hidden>

diff --git a/lisp/org-clock.el b/lisp/org-clock.el
index 40272d4..90b2992 100644
--- a/lisp/org-clock.el
+++ b/lisp/org-clock.el
@@ -101,6 +101,28 @@ has not been closed, resume the clock from that point"
  :group 'org-clock
  :type 'boolean)

+(defcustom org-clock-persist nil
+  "When non-nil, save the running clock when emacs is closed, and
+  resume it next time emacs is started."
+  :group 'org-clock
+  :type 'boolean)
+
+(defcustom org-clock-persist-file "~/.emacs.d/org-clock-save.el"
+  "File to save clock data to"
+  :group 'org-clock
+  :type 'string)
+
+(defcustom org-clock-persist-query-save nil
+  "When non-nil, ask before saving the current clock on exit"
+  :group 'org-clock
+  :type 'boolean)
+
+(defcustom org-clock-persist-query-resume t
+  "When non-nil, ask before resuming any stored clock during
+load."
+  :group 'org-clock
+  :type 'boolean)
+
;;; The clock for measuring work time.

(defvar org-mode-line-string "")
@@ -989,6 +1011,74 @@ the currently selected interval size."
  lines)
  "\n"))))

+(defun org-clock-save ()
+  "Persist various clock-related data to disk"
+  (with-current-buffer (find-file (expand-file-name org-clock-persist-file))
+    (progn (delete-region (point-min) (point-max))
+   ;;Store clock
+   (insert (format ";; org-persist.el - %s at %s\n" system-name (time-stamp-string)))
+   (if (and org-clock-persist (marker-buffer org-clock-marker)
+    (or (not org-clock-persist-query-save)
+ (y-or-n-p (concat "Save current clock ("
+  (substring-no-properties org-clock-heading)
+  ")"))))
+       (insert "(setq resume-clock '(\""
+       (buffer-file-name (marker-buffer org-clock-marker))
+       "\" . " (int-to-string (marker-position org-clock-marker))
+       "))\n"))
+   ;;Store clocked task history. Tasks are stored reversed to make
+   ;;reading simpler
+   (if org-clock-history
+       (insert "(setq stored-clock-history '("
+       (mapconcat
+ (lambda (m)
+  (when (marker-buffer m)
+    (concat "(\"" (buffer-file-name (marker-buffer m))
+    "\" . " (int-to-string (marker-position m))
+ ")")))
+ (reverse org-clock-history) " ") "))\n"))
+   (save-buffer)
+   (kill-buffer (current-buffer)))))
+
+(defvar org-clock-loaded nil)
+
+(defun org-clock-load ()
+  "Load various clock-related data from disk, optionally resuming
+a stored clock"
+  (if (not org-clock-loaded)
+      (let ((filename (expand-file-name org-clock-persist-file))
+    (org-clock-in-resume t))
+ (if (file-readable-p filename)
+    (progn
+      (message "%s" "Restoring clock data")
+      (setq org-clock-loaded t)
+      (load-file filename)
+      ;; load history
+      (if (boundp 'stored-clock-history)
+  (save-window-excursion
+    (mapc (lambda (task)
+    (org-clock-history-push (cdr task)
+    (find-file (car task))))
+  stored-clock-history)))
+      ;; resume clock
+      (if (and (boundp 'resume-clock) org-clock-persist
+       (or (not org-clock-persist-query-resume)
+   (y-or-n-p "Resume clock ("
+     (with-current-buffer (find-file (car resume-clock))
+       (progn (goto-char (cdr resume-clock))
+      (looking-at org-complex-heading-regexp)
+      (match-string 4))) ")")))
+  (with-current-buffer (find-file (car resume-clock))
+    (progn (goto-char (cdr resume-clock))
+   (org-clock-in)))))
+  (message "Not restoring clock data; %s not found"
+   org-clock-persist-file)))))
+
+(defun org-clock-persistence-insinuate ()
+  "Set up hooks for clock persistence"
+  (add-hook 'org-mode-hook 'org-clock-load)
+  (add-hook 'kill-emacs-hook 'org-clock-save))
+
(provide 'org-clock)

;; arch-tag: 7b42c5d4-9b36-48be-97c0-66a869daed4c
--
1.5.6.5



_______________________________________________
Emacs-orgmode mailing list
Remember: use `Reply All' to send replies to the list.
address@hidden
http://lists.gnu.org/mailman/listinfo/emacs-orgmode


reply via email to

[Prev in Thread] Current Thread [Next in Thread]