This package provides functions for creating reverse
date trees, which are similar to date trees created by built-in
functions of Org mode (e.g.
org-archive) but in a
reversed order. Since newer contents come first in reverse date trees,
they are more useful in situations where you want to find latest
activities on a particular subject using a search tool like
Table of contents
- Reverse date trees, where latest contents are shown first.
- You can customize the format of the date tree.
- Week trees are also supported. You can even create date trees with four levels (year-month-week-date) or any number of levels.
- Configurations of date trees are stored in file headers, so each file is ensured to have a single date tree with a consistent structure.
- Configuration is done interactively on first creation.
- Emacs 26.1
The following functions retrieve a configuration from the file header:
org-reverse-datetree-goto-date-in-fileto jump to a date in the date tree. If this function is called non-interactively and the time argument is nil, it jumps to the current date. This can be used for
org-reverse-datetree-goto-read-date-in-fileis similar as above, but it always prompts for a date even if the function is called non-interactively.
org-reverse-datetree-refile-to-fileis a function that refiles the current entry into a date tree. This can be used to build a custom command for refiling an entry to a particular file.
Configuring date formats
The format configuration is stored in the file header of each Org file, as shown in the following example:
#+REVERSE_DATETREE_DATE_FORMAT: %Y-%m-%d %A #+REVERSE_DATETREE_WEEK_FORMAT: %Y W%W #+REVERSE_DATETREE_YEAR_FORMAT: %Y #+REVERSE_DATETREE_USE_WEEK_TREE: t
These attributes are added by functions in this package on initial creation of the date tree, so you usually don’t have to manually edit them.
You can customize the default format by setting
Note that the formats should be basically numeric and zero-prefixed, since
date-tree headings are ordered lexicographically by their texts.
You should avoid a month format containing a string like “Feb” or “February”.
Another way to configure the structure is to set
org-reverse-datetree-level-formats variable as a file-local variable. Through the variable, you can define a structure with any number of levels.
Defining a capture template
You can define an
org-capture template which inserts an entry into a date tree with org-starter package as follows:
(org-starter-def-capture "p" "Commonplace book plain entry" entry (file+function "cpb.org" org-reverse-datetree-goto-date-in-file) "* %?" :clock-in t :clock-resume t :empty-lines 1)
Jumping to a particular date
org-reverse-datetree-goto-date-in-file command to jump to a particular date in the date tree of the current file.
Defining a refile function
org-reverse-datetree-refile-to-file, you can define a function which can be used to refile entries to the date tree in a particular file:
(defun akirak/org-refile-to-cpb (arg) (interactive "P") (org-reverse-datetree-refile-to-file (org-starter-locate-file "cpb.org" nil t) nil :ask-always arg :prefer '("CREATED_TIME" "CREATED_AT" "CLOSED")))
The heading properties given as
:prefer to the function are used to determine the date of an entry.
You can use this function both in
org-mode (either on a single entry or on multiple entries under selection) and in
org-agenda-mode (either on a single entry or on bulk entries). It retrieves a date for each entry if it operates on multiple entries.
org-starter-locate-file is a function from org-starter package, which locates the location of an Org file. If you don’t use the package, you should give an absolute path:
(defun akirak/org-refile-to-cpb (arg) (interactive "P") (org-reverse-datetree-refile-to-file "~/org/cpb.org" nil :ask-always arg :prefer '("CREATED_TIME" "CREATED_AT" "CLOSED")))
A recommended way to invoke this command is to add an entry to
org-starter-extra-refile-map in org-starter package:
(add-to-list 'org-starter-extra-refile-map '("p" akirak/org-refile-to-cpb "cpb"))
Then you can run
org-starter-refile-by-key and press
p key to refile the selected entries to
Defining an agenda command
With org-ql package, you can define a function for browsing entries in a reverse date tree:
(org-ql-agenda "~/org/cpb.org" (level 4) :sort priority)
You can also define a custom org-agenda command:
(setq org-agenda-custom-commands '(("c" "Browse entries in cpb.org" (lambda (_) (org-ql-agenda "~/org/cpb.org" (level 4) :sort priority)) "" ((org-super-agenda-groups '((:todo "DONE") (:todo t)))))))
org-super-agenda-groups is an option for org-super-agenda for grouping the contents. If you don’t activate
org-super-agenda-mode, that option is simply ignoerd.
Alternatively, you can define an equivalent agenda command with org-starter as follows:
(org-starter-add-agenda-custom-command "c" "Browse entries in cpb.org" (lambda (_) (org-ql-agenda (org-starter-locate-file "cpb.org" nil t) (level 4) :sort priority)) "" '((org-super-agenda-groups '((:todo "DONE") (:todo t)))))