From mboxrd@z Thu Jan 1 00:00:00 1970 From: Max Mikhanosha Subject: [PATCH 2/2] Log yesterday item today, better org-extend-today-until Date: Thu, 21 Jul 2011 13:56:56 -0400 Message-ID: <87hb6f5xg7.wl%max@openchat.com> Mime-Version: 1.0 (generated by SEMI 1.14.6 - "Maruoka") Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable Return-path: Received: from eggs.gnu.org ([140.186.70.92]:49051) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Qjy5c-0007cE-Vd for emacs-orgmode@gnu.org; Thu, 21 Jul 2011 14:35:18 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Qjy5b-0001iC-OI for emacs-orgmode@gnu.org; Thu, 21 Jul 2011 14:35:16 -0400 Received: from p84-72.acedsl.com ([66.114.84.72]:36156 helo=momoland.openchat.com) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Qjy5b-0001hc-8u for emacs-orgmode@gnu.org; Thu, 21 Jul 2011 14:35:15 -0400 Received: from momoland.openchat.com (localhost [IPv6:::1]) by momoland.openchat.com (Postfix) with ESMTP id BC9F2E7EE9 for ; Thu, 21 Jul 2011 13:56:56 -0400 (EDT) List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: Org Mode List Started using habits, which are a great addition. My only problem with habits is that for some of them such as "workout" or "cardio", I just don't have the energy to get to the computer in the evening and mark them done. Instead I do most of my planning for the day in the first 20 minutes or so of the morning, catching up, refiling, etc. But there is no way to mark the habit DONE yesterday, and have the correct consistency graph shown, without manual editing of LOGGING drawer. There is already unfinished support for "backdating" stuff via org-extend-today-until variable, but it does not work in the log-note time-stamp. Following patch fixes that oversight, and adds two new commands: (org-done-yesterday) and (org-agenda-done-yesterday), which are exactly as their "today" counterparts, but all the timestamps and CLOSED line will be marked as of 23:59 yesterday. =46rom daebd6ca8f75ad3266075a8b3ec5d3a1f411ecfb Mon Sep 17 00:00:00 2001 From: Max Mikhanosha Date: Thu, 21 Jul 2011 13:20:01 -0400 Subject: [PATCH 2/2] Make `org-extend-today-until' variable affect log note= s, and CLOSED: line. (org-done-yesterday), (org-agenda-done-yesterday): new functions --- lisp/org.el | 42 +++++++++++++++++++++++++++++++++++++----- 1 files changed, 37 insertions(+), 5 deletions(-) diff --git a/lisp/org.el b/lisp/org.el index 611672b..b0f113a 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -10918,6 +10918,32 @@ nil or a string to be used for the todo mark." ) =20 (defvar org-agenda-headline-snapshot-before-repeat) =20 +(defun org-current-effective-time () + "Return current time adjusted for `org-extend-today-until' variable" + (let* ((ct (org-current-time)) + (dct (decode-time ct)) + (ct1 + (if (< (nth 2 dct) org-extend-today-until) + (encode-time 0 59 23 (1- (nth 3 dct)) (nth 4 dct) (nth 5 dct)) + ct))) + ct1)) + +(defun org-todo-yesterday (&optional arg) + "Like `org-todo' but the time of change will be 23:59 of yesterday" + (interactive "P") + (let* ((hour (third (decode-time + (org-current-time)))) + (org-extend-today-until (1+ hour))) + (org-todo arg))) + +(defun org-agenda-todo-yesterday (&optional arg) + "Like `org-agenda-todo' but the time of change will be 23:59 of yesterda= y" + (interactive "P") + (let* ((hour (third (decode-time + (org-current-time)))) + (org-extend-today-until (1+ hour))) + (org-agenda-todo arg))) + (defun org-todo (&optional arg) "Change the TODO state of an item. The state of an item is given by a keyword at the start of the heading, @@ -11097,7 +11123,7 @@ For calling through lisp, arg is also interpreted i= n the following way: (org-add-planning-info nil nil 'closed)) (when (and now-done-p org-log-done) ;; It is now done, and it was not done before - (org-add-planning-info 'closed (org-current-time)) + (org-add-planning-info 'closed (org-current-effective-time)) (if (and (not dolog) (eq 'note org-log-done)) (org-add-log-setup 'done state this 'findpos 'note))) (when (and state dolog) @@ -11638,7 +11664,7 @@ This function is run automatically after each state= change to a DONE state." ((equal (match-string 1 ts) ".") ;; Shift starting date to today (org-timestamp-change - (- (time-to-days (current-time)) (time-to-days time)) + (- (org-today) (time-to-days time)) 'day)) ((equal (match-string 1 ts) "+") (let ((nshiftmax 10) (nshift 0)) @@ -11909,6 +11935,11 @@ be removed." (defvar org-log-note-extra nil) (defvar org-log-note-window-configuration nil) (defvar org-log-note-return-to (make-marker)) +(defvar org-log-note-effective-time nil + "Remembered current time so that dynamically scoped +`org-extend-today-until' affects tha timestamps in state change +log") + (defvar org-log-post-message nil "Message to be displayed after a log note has been stored. The auto-repeater uses this.") @@ -11976,7 +12007,8 @@ EXTRA is additional text that will be inserted into= the notes buffer." org-log-note-state state org-log-note-previous-state prev-state org-log-note-how how - org-log-note-extra extra) + org-log-note-extra extra + org-log-note-effective-time (org-current-effective-time)) (add-hook 'post-command-hook 'org-add-log-note 'append))))) =20 (defun org-skip-over-state-notes () @@ -12047,10 +12079,10 @@ EXTRA is additional text that will be inserted in= to the notes buffer." (cons "%U" user-full-name) (cons "%t" (format-time-string (org-time-stamp-format 'long 'inactive) - (current-time))) + org-log-note-effective-time)) (cons "%T" (format-time-string (org-time-stamp-format 'long nil) - (current-time))) + org-log-note-effective-time)) (cons "%s" (if org-log-note-state (concat "\"" org-log-note-state "\"") "")) --=20 1.7.3.4