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 |