From 42fb53de48e51639cfd6fc9cc5a24bde051f24e5 Mon Sep 17 00:00:00 2001
From: Tim Visher <tim.visher@gmail.com>
Date: Fri, 12 May 2023 11:32:21 -0400
Subject: [PATCH] org-capture.el: Allow `(here)' as a template target

* lisp/org-capture.el (org-capture-set-target-location): Allow
`(here)' as a template target in addition to `here'.

Templates had no user accessible way to target the current location
directly from a capture template. Attempting to directly utilize the
behavior accessible through a 0 prefix arg exposed the inconsistent
treatment of the `:target` property in
`org-capture`. `org-capture-set-target-location` understood that it
could be both a symbol and a list, while `org-capture` itself required
it to be a list through its use of `car`.

This change opts to make `org-capture-set-target-location` more
liberal in what it accepts rather than making `org-capture` agree that
targets can be lists. This is because the manual implies, especially
in the `(clock)' entry, that targets are expected to be lists even if
they are meant as specific points.
* doc/org-manual.org (Template elements): Add `(here)' target
documentation

TINYCHANGE
---
 doc/org-manual.org  | 4 ++++
 etc/ORG-NEWS        | 5 +++++
 lisp/org-capture.el | 6 +++++-
 3 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/doc/org-manual.org b/doc/org-manual.org
index 21582fe8e..76131f110 100644
--- a/doc/org-manual.org
+++ b/doc/org-manual.org
@@ -7946,6 +7946,10 @@ Now lets look at the elements of a template definition.  Each entry in
 
     File to the entry that is currently being clocked.
 
+  - =(here)= ::
+
+    The position of =point=.
+
   - =(function function-finding-location)= ::
 
     Most general way: write your own function which both visits the
diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS
index 94efa8fa8..01d2975d3 100644
--- a/etc/ORG-NEWS
+++ b/etc/ORG-NEWS
@@ -303,6 +303,11 @@ skipped (with a warning) if the ox-icalendar export encounters them:
 Also note that only vanilla repeaters are currently exported; the
 special repeaters ~++~ and ~.+~ are skipped.
 
+*** Capture templates now support ~(here)~ as a target
+
+A capture template can target ~(here)~ which is the equivalent of
+invoking a capture template with a zero prefix.
+
 ** Miscellaneous
 *** =org-crypt.el= now applies initial visibility settings to decrypted entries
 
diff --git a/lisp/org-capture.el b/lisp/org-capture.el
index d4311dd20..40a7f78f1 100644
--- a/lisp/org-capture.el
+++ b/lisp/org-capture.el
@@ -220,6 +220,9 @@ target       Specification of where the captured item should be placed.
              (clock)
                 File to the entry that is currently being clocked
 
+             (here)
+                The position of point
+
              (function function-finding-location)
                 Most general way: write your own function which both visits
                 the file and moves point to the right location
@@ -991,7 +994,8 @@ Store them in the capture property list."
   (let ((target-entry-p t))
     (save-excursion
       (pcase (or target (org-capture-get :target))
-	(`here
+	((or `here
+             `(here))
 	 (org-capture-put :exact-position (point) :insert-here t))
 	(`(file ,path)
 	 (set-buffer (org-capture-target-buffer path))
-- 
2.40.1

