changelog shortlog graph tags branches changeset files file revisions raw help

Mercurial > core / annotate emacs/lib/org-expiry.el

changeset 698: 96958d3eb5b0
parent: 74a55d5decce
author: Richard Westhaver <ellis@rwest.io>
date: Fri, 04 Oct 2024 22:04:59 -0400
permissions: -rw-r--r--
description: fixes
604
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
1
 ;;; org-expiry.el --- expiry mechanism for Org entries  -*- lexical-binding: t; -*-
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
2
 ;;
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
3
 ;; Copyright 2007-2021 Free Software Foundation, Inc.
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
4
 ;;
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
5
 ;; Author: Bastien Guerry <bzg@gnu.org>
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
6
 ;; Version: 0.2
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
7
 ;; Keywords: org, expiry
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
8
 ;; Homepage: https://git.sr.ht/~bzg/org-contrib
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
9
 
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
10
 ;; This file is not part of GNU Emacs.
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
11
 
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
12
 ;; This program is free software; you can redistribute it and/or modify
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
13
 ;; it under the terms of the GNU General Public License as published by
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
14
 ;; the Free Software Foundation; either version 3, or (at your option)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
15
 ;; any later version.
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
16
 ;;
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
17
 ;; This program is distributed in the hope that it will be useful,
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
18
 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
19
 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
20
 ;; GNU General Public License for more details.
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
21
 ;;
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
22
 ;; You should have received a copy of the GNU General Public License
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
23
 ;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
24
 ;;
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
25
 ;;; Commentary:
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
26
 ;;
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
27
 ;; This gives you a chance to get rid of old entries in your Org files
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
28
 ;; by expiring them.
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
29
 ;;
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
30
 ;; By default, entries that have no EXPIRY property are considered to be
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
31
 ;; new (i.e. 0 day old) and only entries older than one year go to the
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
32
 ;; expiry process, which consist in adding the ARCHIVE tag.  None of
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
33
 ;; your tasks will be deleted with the default settings.
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
34
 ;;
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
35
 ;; When does an entry expires?
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
36
 ;;
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
37
 ;; Consider this entry:
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
38
 ;;
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
39
 ;; * Stop watching TV
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
40
 ;;   :PROPERTIES:
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
41
 ;;   :CREATED:  <2008-01-07 lun 08:01>
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
42
 ;;   :EXPIRY:   <2008-01-09 08:01>
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
43
 ;;   :END:
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
44
 ;;
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
45
 ;; This entry will expire on the 9th, january 2008.
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
46
 
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
47
 ;; * Stop watching TV
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
48
 ;;   :PROPERTIES:
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
49
 ;;   :CREATED:  <2008-01-07 lun 08:01>
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
50
 ;;   :EXPIRY:   +1w
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
51
 ;;   :END:
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
52
 ;;
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
53
 ;; This entry will expire on the 14th, january 2008, one week after its
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
54
 ;; creation date.
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
55
 ;;
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
56
 ;; What happen when an entry is expired?  Nothing until you explicitly
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
57
 ;; M-x org-expiry-process-entries When doing this, org-expiry will check
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
58
 ;; for expired entries and request permission to process them.
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
59
 ;;
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
60
 ;; Processing an expired entries means calling the function associated
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
61
 ;; with `org-expiry-handler-function'; the default is to add the tag
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
62
 ;; :ARCHIVE:, but you can also add a EXPIRED keyword or even archive
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
63
 ;; the subtree.
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
64
 ;;
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
65
 ;; Is this useful?  Well, when you're in a brainstorming session, it
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
66
 ;; might be useful to know about the creation date of an entry, and be
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
67
 ;; able to archive those entries that are more than xxx days/weeks old.
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
68
 ;;
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
69
 ;; When you're in such a session, you can insinuate org-expiry like
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
70
 ;; this: M-x org-expiry-insinuate
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
71
 ;;
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
72
 ;; Then, each time you're pressing M-RET to insert an item, the CREATION
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
73
 ;; property will be automatically added.  Same when you're scheduling or
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
74
 ;; deadlining items.  You can deinsinuate: M-x org-expiry-deinsinuate
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
75
 
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
76
 ;;; Code:
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
77
 
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
78
 (require 'org)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
79
 
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
80
 ;;; User variables:
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
81
 
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
82
 (defgroup org-expiry nil
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
83
   "Org expiry process."
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
84
   :tag "Org Expiry"
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
85
   :group 'org)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
86
 
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
87
 (defcustom org-expiry-inactive-timestamps nil
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
88
   "Insert inactive timestamps for created/expired properties."
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
89
   :type 'boolean
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
90
   :group 'org-expiry)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
91
 
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
92
 (defcustom org-expiry-created-property-name "CREATED"
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
93
   "The name of the property for setting the creation date."
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
94
   :type 'string
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
95
   :group 'org-expiry)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
96
 
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
97
 (defcustom org-expiry-expiry-property-name "EXPIRY"
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
98
   "The name of the property for setting the expiry date/delay."
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
99
   :type 'string
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
100
   :group 'org-expiry)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
101
 
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
102
 (defcustom org-expiry-keyword "EXPIRED"
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
103
   "The default keyword for `org-expiry-add-keyword'."
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
104
   :type 'string
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
105
   :group 'org-expiry)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
106
 
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
107
 (defcustom org-expiry-wait "+1y"
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
108
   "Time span between the creation date and the expiry.
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
109
 The default value for this variable (\"+1y\") means that entries
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
110
 will expire if there are at least one year old.
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
111
 
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
112
 If the expiry delay cannot be retrieved from the entry or the
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
113
 subtree above, the expiry process compares the expiry delay with
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
114
 `org-expiry-wait'.  This can be either an ISO date or a relative
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
115
 time specification.  See `org-read-date' for details."
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
116
   :type 'string
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
117
   :group 'org-expiry)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
118
 
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
119
 (defcustom org-expiry-created-date "+0d"
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
120
   "The default creation date.
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
121
 The default value of this variable (\"+0d\") means that entries
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
122
 without a creation date will be handled as if they were created
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
123
 today.
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
124
 
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
125
 If the creation date cannot be retrieved from the entry or the
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
126
 subtree above, the expiry process will compare the expiry delay
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
127
 with this date.  This can be either an ISO date or a relative
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
128
 time specification.  See `org-read-date' for details on relative
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
129
 time specifications."
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
130
   :type 'string
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
131
   :group 'org-expiry)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
132
 
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
133
 (defcustom org-expiry-handler-function 'org-toggle-archive-tag
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
134
   "Function to process expired entries.
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
135
 Possible candidates for this function are:
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
136
 
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
137
 `org-toggle-archive-tag'
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
138
 `org-expiry-add-keyword'
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
139
 `org-expiry-archive-subtree'"
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
140
   :type 'function
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
141
   :group 'org-expiry)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
142
 
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
143
 (defcustom org-expiry-confirm-flag t
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
144
   "Non-nil means confirm expiration process."
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
145
   :type '(choice
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
146
 	  (const :tag "Always require confirmation" t)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
147
 	  (const :tag "Do not require confirmation" nil)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
148
 	  (const :tag "Require confirmation in interactive expiry process"
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
149
 		 interactive))
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
150
   :group 'org-expiry)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
151
 
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
152
 (defcustom org-expiry-advised-functions
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
153
   '(org-scheduled org-deadline org-time-stamp)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
154
   "A list of advised functions.
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
155
 `org-expiry-insinuate' will activate the expiry advice for these
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
156
 functions.  `org-expiry-deinsinuate' will deactivate them."
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
157
   :type 'boolean
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
158
   :group 'list)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
159
 
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
160
 ;;; Advices and insinuation:
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
161
 
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
162
 (define-advice org-schedule (:after (&rest _) org-schedule-update-created)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
163
   "Update the creation-date property when calling `org-schedule'."
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
164
   (org-expiry-insert-created))
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
165
 
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
166
 (define-advice org-deadline (:after (&rest _) org-deadline-update-created)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
167
   "Update the creation-date property when calling `org-deadline'."
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
168
   (org-expiry-insert-created))
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
169
 
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
170
 (define-advice org-time-stamp (:after (&rest _) org-time-stamp-update-created)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
171
   "Update the creation-date property when calling `org-time-stamp'."
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
172
   (org-expiry-insert-created))
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
173
 
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
174
 (defun org-expiry-insinuate (&optional arg)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
175
   "Add hooks and activate advices for org-expiry.
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
176
 If ARG, also add a hook to `before-save-hook' in `org-mode' and
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
177
 restart `org-mode' if necessary."
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
178
   (interactive "P")
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
179
   (ad-activate 'org-schedule)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
180
   (ad-activate 'org-time-stamp)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
181
   (ad-activate 'org-deadline)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
182
   (add-hook 'org-insert-heading-hook 'org-expiry-insert-created)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
183
   (add-hook 'org-after-todo-state-change-hook 'org-expiry-insert-created)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
184
   (add-hook 'org-after-tags-change-hook 'org-expiry-insert-created)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
185
   (when arg
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
186
     (add-hook 'org-mode-hook
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
187
 	      (lambda() (add-hook 'before-save-hook
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
188
 				  'org-expiry-process-entries t t)))
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
189
     ;; need this to refresh org-mode hooks
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
190
     (when (eq major-mode 'org-mode)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
191
       (org-mode)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
192
       (if (called-interactively-p 'any)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
193
 	  (message "Org-expiry insinuated, `org-mode' restarted.")))))
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
194
 
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
195
 (defun org-expiry-deinsinuate (&optional arg)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
196
   "Remove hooks and deactivate advices for org-expiry.
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
197
 If ARG, also remove org-expiry hook in Org's `before-save-hook'
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
198
 and restart `org-mode' if necessary."
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
199
   (interactive "P")
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
200
   (advice-remove 'org-schedule #'org-schedule@org-schedule-update-created)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
201
   (advice-remove 'org-time-stamp #'org-time-stamp@org-time-stamp-update-created)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
202
   (advice-remove 'org-deadline #'org-deadline@org-deadline-update-created)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
203
   (remove-hook 'org-insert-heading-hook 'org-expiry-insert-created)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
204
   (remove-hook 'org-after-todo-state-change-hook 'org-expiry-insert-created)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
205
   (remove-hook 'org-after-tags-change-hook 'org-expiry-insert-created)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
206
   (remove-hook 'org-mode-hook
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
207
 	       (lambda() (add-hook 'before-save-hook
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
208
 				   'org-expiry-process-entries t t)))
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
209
   (when arg
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
210
     ;; need this to refresh org-mode hooks
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
211
     (when (eq major-mode 'org-mode)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
212
       (org-mode)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
213
       (if (called-interactively-p 'any)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
214
 	  (message "Org-expiry de-insinuated, `org-mode' restarted.")))))
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
215
 
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
216
 ;;; org-expiry-expired-p:
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
217
 
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
218
 (defun org-expiry-expired-p ()
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
219
   "Check if the entry at point is expired.
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
220
 Return nil if the entry is not expired.  Otherwise return the
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
221
 amount of time between today and the expiry date.
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
222
 
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
223
 If there is no creation date, use `org-expiry-created-date'.
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
224
 If there is no expiry date, use `org-expiry-wait'."
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
225
   (let* ((ex-prop org-expiry-expiry-property-name)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
226
 	 (cr-prop org-expiry-created-property-name)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
227
 	 (ct (current-time))
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
228
 	 (cr (org-read-date nil t (or (org-entry-get (point) cr-prop t)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
229
 				      org-expiry-created-date)))
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
230
 	 (ex-field (or (org-entry-get (point) ex-prop t) org-expiry-wait))
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
231
 	 (ex (if (string-match "^[ \t]?[+-]" ex-field)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
232
 		 (time-add cr (time-subtract (org-read-date nil t ex-field) ct))
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
233
 	       (org-read-date nil t ex-field))))
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
234
     (if (time-less-p ex ct)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
235
 	(time-subtract ct ex))))
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
236
 
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
237
 ;;; Expire an entry or a region/buffer:
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
238
 
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
239
 (defun org-expiry-process-entry (&optional force)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
240
   "Call `org-expiry-handler-function' on entry.
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
241
 If FORCE is non-nil, don't require confirmation from the user.
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
242
 Otherwise rely on `org-expiry-confirm-flag' to decide."
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
243
   (interactive "P")
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
244
   (save-excursion
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
245
     (when (called-interactively-p 'interactive) (org-reveal))
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
246
     (when (org-expiry-expired-p)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
247
       (org-back-to-heading)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
248
       (looking-at org-complex-heading-regexp)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
249
       (let* ((ov (make-overlay (point) (match-end 0)))
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
250
 	     (e (org-expiry-expired-p))
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
251
 	     (d (time-to-number-of-days e)))
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
252
 	(overlay-put ov 'face 'secondary-selection)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
253
 	(if (or force
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
254
 		(null org-expiry-confirm-flag)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
255
 		(and (eq org-expiry-confirm-flag 'interactive)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
256
 		     (not (called-interactively-p 'interactive)))
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
257
 		(and org-expiry-confirm-flag
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
258
 		     (y-or-n-p (format "Entry expired by %d days.  Process? " d))))
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
259
 	    (funcall org-expiry-handler-function))
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
260
 	(delete-overlay ov)))))
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
261
 
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
262
 (defun org-expiry-process-entries (_ _)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
263
   "Process all expired entries between BEG and END.
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
264
 The expiry process will run the function defined by
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
265
 `org-expiry-handler-functions'."
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
266
   (interactive "r")
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
267
   (save-excursion
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
268
     (let ((beg (if (org-region-active-p)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
269
 		   (region-beginning) (point-min)))
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
270
 	  (end (if (org-region-active-p)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
271
 		   (region-end) (point-max))))
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
272
       (goto-char beg)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
273
       (let ((expired 0) (processed 0))
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
274
 	(while (and (outline-next-heading) (< (point) end))
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
275
 	  (when (org-expiry-expired-p)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
276
 	    (setq expired (1+ expired))
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
277
 	    (if (if (called-interactively-p 'any)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
278
 		    (call-interactively 'org-expiry-process-entry)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
279
 		  (org-expiry-process-entry))
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
280
 		(setq processed (1+ processed)))))
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
281
 	(if (equal expired 0)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
282
 	    (message "No expired entry")
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
283
 	  (message "Processed %d on %d expired entries"
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
284
 		   processed expired))))))
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
285
 
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
286
 ;;; Insert created/expiry property:
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
287
 (defun org-expiry-format-timestamp (timestr inactive)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
288
   "Properly format TIMESTR into an org (in)active timestamp"
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
289
   (format (if inactive "[%s]" "<%s>") timestr))
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
290
 
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
291
 (defun org-expiry-insert-created (&optional arg)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
292
   "Insert or update a property with the creation date.
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
293
 If ARG, always update it.  With one `C-u' prefix, silently update
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
294
 to today's date.  With two `C-u' prefixes, prompt the user for to
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
295
 update the date."
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
296
   (interactive "P")
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
297
   (let* ((d (org-entry-get (point) org-expiry-created-property-name))
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
298
 	 d-time d-hour timestr)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
299
     (when (or (null d) arg)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
300
       ;; update if no date or non-nil prefix argument
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
301
       ;; FIXME Use `org-time-string-to-time'
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
302
       (setq d-time (if d (org-time-string-to-time d)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
303
 		     (current-time)))
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
304
       (setq d-hour (format-time-string "%H:%M" d-time))
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
305
       (setq timestr
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
306
 	    ;; two C-u prefixes will call org-read-date
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
307
             (org-expiry-format-timestamp
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
308
              (if (equal arg '(16))
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
309
                  (org-read-date nil nil nil nil d-time d-hour)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
310
                (format-time-string
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
311
                 (replace-regexp-in-string "\\(^<\\|>$\\)" ""
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
312
                                           (cdr org-time-stamp-formats))))
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
313
              org-expiry-inactive-timestamps))
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
314
       (save-excursion
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
315
 	(org-entry-put
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
316
 	 (point) org-expiry-created-property-name timestr)))))
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
317
 
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
318
 (defun org-expiry-insert-expiry (&optional today)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
319
   "Insert a property with the expiry date.
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
320
 With one `C-u' prefix, don't prompt interactively for the date
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
321
 and insert today's date."
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
322
   (interactive "P")
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
323
   (let* ((d (org-entry-get (point) org-expiry-expiry-property-name))
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
324
 	 d-time d-hour timestr)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
325
     (setq d-time (if d (org-time-string-to-time d)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
326
 		   (current-time)))
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
327
     (setq d-hour (format-time-string "%H:%M" d-time))
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
328
     (setq timestr (org-expiry-format-timestamp
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
329
                    (if today
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
330
                        (format-time-string
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
331
                         (replace-regexp-in-string "\\(^<\\|>$\\)" ""
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
332
                                                   (cdr org-time-stamp-formats)))
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
333
                      (org-read-date nil nil nil nil d-time d-hour))
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
334
                    org-expiry-inactive-timestamps))
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
335
     ;; maybe transform to inactive timestamp
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
336
     (if org-expiry-inactive-timestamps
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
337
 	(setq timestr (concat "[" (substring timestr 1 -1) "]")))
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
338
 
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
339
     (save-excursion
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
340
       (org-entry-put
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
341
        (point) org-expiry-expiry-property-name timestr))))
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
342
 
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
343
 ;;; Functions to process expired entries:
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
344
 
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
345
 (defun org-expiry-archive-subtree ()
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
346
   "Archive the entry at point if it is expired."
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
347
   (interactive)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
348
   (save-excursion
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
349
     (if (org-expiry-expired-p)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
350
 	(org-archive-subtree)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
351
       (if (called-interactively-p 'any)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
352
 	  (message "Entry at point is not expired.")))))
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
353
 
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
354
 (defun org-expiry-add-keyword (&optional keyword)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
355
   "Add KEYWORD to the entry at point if it is expired."
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
356
   (interactive "sKeyword: ")
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
357
   (if (or (member keyword org-todo-keywords-1)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
358
 	  (setq keyword org-expiry-keyword))
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
359
       (save-excursion
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
360
 	(if (org-expiry-expired-p)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
361
 	    (org-todo keyword)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
362
 	  (if (called-interactively-p 'any)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
363
 	      (message "Entry at point is not expired."))))
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
364
     (error "\"%s\" is not a to-do keyword in this buffer" keyword)))
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
365
 
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
366
 ;; FIXME what about using org-refile ?
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
367
 
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
368
 (provide 'org-expiry)
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
369
 
74a55d5decce emacs org libraries and upgrades
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
370
 ;;; org-expiry.el ends here