Summarizing the last meeting dates in Org Contacts
| emacs, orgSteffan Heilmann wanted to be able to quickly see the last time he interacted with someone if he tracked interactions in org-contacts. That is, given something like this:
* John Smith ** DONE Conversation [2014-01-20] ** DONE E-mail [2014-01-15] * Jane Smith ** DONE Conversation [2014-01-07]
… we want to see the latest timestamps for each contact entry.
Here's the code that I came up with. It scans backward for timestamps or headings. Whenever it finds a timestamp, it compares the timestamp with the one that it has previously stored and keeps the later timestamp. Whenever it encounters a level-1 heading, it sets the property and clears the stored timestamp.
(defun sacha/org-update-with-last-meeting () "Update each level 1 heading with the LASTMEETING property." (interactive) (goto-char (point-max)) (let (last-meeting) (while (re-search-backward (concat "\\(" org-outline-regexp "\\)\\|\\(" org-maybe-keyword-time-regexp "\\)") nil t) (cond ((and (match-string 1) (= (nth 1 (save-match-data (org-heading-components))) 1) last-meeting) ;; heading (save-excursion (org-set-property "LASTMEETING" last-meeting)) (setq last-meeting nil)) ((and (match-string 2)) (if (or (null last-meeting) (string< last-meeting (match-string 2))) (setq last-meeting (match-string 2))))))))
Scanning backwards works well here because that makes it easy to add information to the top-level heading we're interested in. If we scanned it the other way around (say, with org-map-entries
), we might need to backtrack in order to set the property on the top-level heading.
The result is something like this:
* John Smith :PROPERTIES: :LASTMEETING: [2014-01-20] :END: ** DONE E-mail [2014-01-15] ** DONE Conversation [2014-01-20] * Someone without a meeting * Jane Smith :PROPERTIES: :LASTMEETING: [2014-01-07] :END: ** DONE Conversation [2014-01-07]
You can then use something like:
[2014-01-20] | | | | | * Someone without a meeting | | | | | | * Jane Smith | <2014-01-07> | | | || ITEM | LASTMEETING | TAGS | PRIORITY | TODO | |-----------------------------+--------------+------+----------+------| | * John Smith |
… or even use M-x org-sort to sort the entries by the LASTMEETING property (R will reverse-sort by property).