summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Dunsmore <jasondunsmore@gmail.com>2019-11-06 21:49:43 -0600
committerNicolas Goaziou <mail@nicolasgoaziou.fr>2019-12-09 20:08:28 +0100
commita410413be82278df223322300b649d0a1ceb576d (patch)
tree03ed3b4c0b5b278db66126883426070eae45841a
parent5f2247f2fe8db94839590028d295c62b7438b77b (diff)
downloadorg-mode-a410413be82278df223322300b649d0a1ceb576d.tar.gz
org-capture: Add support for month trees
* doc/org-manual.org: Add `:tree-type month' option for capture templates. * lisp/org-capture.el (org-capture-set-target-location): Add `:tree-type month' option to capture templates to group entries by month. * lisp/org-datetree.el (org-datetree-find-month-create): Add `org-datetree-find-month-create' function to add datetree entries grouped by month. * testing/lisp/test-org-datetree.el (test-org-datetree/find-month-create): Add test for new function.
-rw-r--r--doc/org-manual.org7
-rw-r--r--etc/ORG-NEWS5
-rw-r--r--lisp/org-capture.el7
-rw-r--r--lisp/org-datetree.el27
-rw-r--r--testing/lisp/test-org-datetree.el11
5 files changed, 46 insertions, 11 deletions
diff --git a/doc/org-manual.org b/doc/org-manual.org
index 35f6013..cc3d95b 100644
--- a/doc/org-manual.org
+++ b/doc/org-manual.org
@@ -7601,9 +7601,10 @@ Now lets look at the elements of a template definition. Each entry in
- ~:tree-type~ ::
- When ~week~, make a week tree instead of the month tree, i.e.,
- place the headings for each day under a heading with the current
- ISO week.
+ Use ~week~ to make a week tree instead of the month-day tree,
+ i.e., place the headings for each day under a heading with the
+ current ISO week. Use @code{month} to group entries by month
+ only. Default is to group entries by day.
- ~:unnarrowed~ ::
diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS
index e61b97f..91a9783 100644
--- a/etc/ORG-NEWS
+++ b/etc/ORG-NEWS
@@ -392,7 +392,9 @@ the headline to use for making the table of contents.
,* Another section
,#+TOC: headlines 1 :target "#TargetSection"
#+end_example
-
+*** New option to group captured datetime entries by month
+A new `:tree-type month' option was added to org-capture-templates to
+group new datetime entries by month.
** New functions
*** ~org-dynamic-block-insert-dblock~
@@ -405,6 +407,7 @@ dynamic block in ~org-dynamic-block-alist~.
*** ~org-table-cell-left~
*** ~org-table-cell-right~
*** ~org-habit-toggle-display-in-agenda~
+*** ~org-datetree-find-month-create~
** Removed functions and variables
*** Removed Org Drill
diff --git a/lisp/org-capture.el b/lisp/org-capture.el
index 67343e0..39121d1 100644
--- a/lisp/org-capture.el
+++ b/lisp/org-capture.el
@@ -998,9 +998,10 @@ Store them in the capture property list."
;; Make a date/week tree entry, with the current date (or
;; yesterday, if we are extending dates for a couple of hours)
(funcall
- (if (eq (org-capture-get :tree-type) 'week)
- #'org-datetree-find-iso-week-create
- #'org-datetree-find-date-create)
+ (pcase (org-capture-get :tree-type)
+ ('week #'org-datetree-find-iso-week-create)
+ ('month #'org-datetree-find-month-create)
+ (t #'org-datetree-find-date-create))
(calendar-gregorian-from-absolute
(cond
(org-overriding-default-time
diff --git a/lisp/org-datetree.el b/lisp/org-datetree.el
index b4797de..ee8672d 100644
--- a/lisp/org-datetree.el
+++ b/lisp/org-datetree.el
@@ -51,11 +51,29 @@ Added time stamp is active unless value is `inactive'."
;;;###autoload
(defun org-datetree-find-date-create (d &optional keep-restriction)
- "Find or create an entry for date D.
+ "Find or create a day entry for date D.
If KEEP-RESTRICTION is non-nil, do not widen the buffer.
When it is nil, the buffer will be widened to make sure an existing date
tree can be found. If it is the symbol `subtree-at-point', then the tree
will be built under the headline at point."
+ (org-datetree--find-create-group d 'day keep-restriction))
+
+;;;###autoload
+(defun org-datetree-find-month-create (d &optional keep-restriction)
+ "Find or create a month entry for date D.
+Compared to `org-datetree-find-date-create' this function creates
+entries grouped by month instead of days.
+If KEEP-RESTRICTION is non-nil, do not widen the buffer.
+When it is nil, the buffer will be widened to make sure an existing date
+tree can be found. If it is the symbol `subtree-at-point', then the tree
+will be built under the headline at point."
+ (org-datetree--find-create-group d 'month keep-restriction))
+
+(defun org-datetree--find-create-group
+ (d time-grouping &optional keep-restriction)
+ "Find or create an entry for date D.
+If time-period is day, group entries by day. If time-period is
+month, then group entries by month."
(setq-local org-datetree-base-level 1)
(save-restriction
(if (eq keep-restriction 'subtree-at-point)
@@ -84,9 +102,10 @@ will be built under the headline at point."
(org-datetree--find-create
"^\\*+[ \t]+%d-\\([01][0-9]\\) \\w+$"
year month)
- (org-datetree--find-create
- "^\\*+[ \t]+%d-%02d-\\([0123][0-9]\\) \\w+$"
- year month day))))
+ (when (eq time-grouping 'day)
+ (org-datetree--find-create
+ "^\\*+[ \t]+%d-%02d-\\([0123][0-9]\\) \\w+$"
+ year month day)))))
;;;###autoload
(defun org-datetree-find-iso-week-create (d &optional keep-restriction)
diff --git a/testing/lisp/test-org-datetree.el b/testing/lisp/test-org-datetree.el
index 5d55f6f..5557d5e 100644
--- a/testing/lisp/test-org-datetree.el
+++ b/testing/lisp/test-org-datetree.el
@@ -113,6 +113,17 @@
(org-datetree-find-date-create '(3 29 2012)))
(buffer-substring (point) (line-end-position))))))
+(ert-deftest test-org-datetree/find-month-create ()
+ "Test `org-datetree-find-month-create' specifications."
+ ;; When date is missing, create it with the entry under month.
+ (should
+ (string-match
+ "\\`\\* 2012\n\\*\\* 2012-03 .*\\'"
+ (org-test-with-temp-text ""
+ (let ((org-datetree-add-timestamp nil))
+ (org-datetree-find-month-create '(3 29 2012)))
+ (org-trim (buffer-string))))))
+
(ert-deftest test-org-datetree/find-iso-week-create ()
"Test `org-datetree-find-iso-date-create' specificaiton."
;; When date is missing, create it.