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: Helge Gudmundsen
Subject: Re: [Orgmode] [PATCH 3/3] Add clock persistence.
Date: Tue, 28 Oct 2008 11:10:57 +0000

For my (admittedly simple) test cases, so far it looks good. Thanks.

--
helge


On Tue, Oct 28, 2008 at 7:33 AM, Carsten Dominik <address@hidden> wrote:
> 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
>
>
> _______________________________________________
> 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]