emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/denote 2b91799ca3 2/4: Define denote-org-extras-extract


From: ELPA Syncer
Subject: [elpa] externals/denote 2b91799ca3 2/4: Define denote-org-extras-extract-org-subtree command and document it
Date: Sat, 20 Jan 2024 06:57:47 -0500 (EST)

branch: externals/denote
commit 2b91799ca36d7566fe61fe50996b4718315870e4
Author: Protesilaos Stavrou <info@protesilaos.com>
Commit: Protesilaos Stavrou <info@protesilaos.com>

    Define denote-org-extras-extract-org-subtree command and document it
---
 README.org           | 93 +++++++++++++++++++++-------------------------------
 denote-org-extras.el | 43 ++++++++++++++++++++++++
 2 files changed, 81 insertions(+), 55 deletions(-)

diff --git a/README.org b/README.org
index 2437590ae0..958fad489a 100644
--- a/README.org
+++ b/README.org
@@ -527,6 +527,44 @@ Similarly, the ~denote-keywords-remove~ removes one or 
more keywords
 from the list of existing keywords and then renames the file
 accordingly.
 
+** Create a note from the current Org subtree
+:PROPERTIES:
+:CUSTOM_ID: h:d0c7cb79-21e5-4176-a6af-f4f68578c8dd
+:END:
+
+[ Rewritten as part of {{{development-version}}}. ]
+
+With Org files in particular, it is common to have nested headings
+which could be split off into their own standalone notes. One such
+workflow is to collect lots of thoughts into a single file and create
+longer standalone notes out of them upon review. In Org parlance, an
+entry with all its subheadings is a "subtree". Denote can operate on
+the subtree to extract it from the current file and create a new file
+out of it.
+
+#+findex: denote-org-extras-extract-org-subtree
+The command ~denote-org-extras-extract-org-subtree~ (part of the
+optional =denote-org-extras.el= extension) is used for this purpose.
+It create a new Denote note using the current Org subtree. In doing
+so, it removes the subtree from its current file and moves its
+contents into the new Denote file.
+
+The text of the subtree's top level heading becomes the =#+title= of
+the new note.
+
+If the heading has any tags, those are turned into the keywords of the
+new note. Else the new note has no keywords 
([[#h:ad4dde4a-8e88-470a-97ae-e7b9d4b41fb4][Add or remove keywords 
interactively]]).
+
+If the subtree has a =PROPERTIES= drawer, it is retained so that the
+user can perform a further review. If the =PROPERTIES= drawer includes
+a =DATE= or =CREATED= property with a timestamp value, it is used to
+derive the date (or date and time) of the new note (if there is only a
+date, the time is taken as 00:00). If both =DATE= and =CREATED=
+properties are present, the former is used.
+
+The new note is an Org file regardless of the user option
+~denote-file-type~.
+
 ** Create note using Org capture
 :PROPERTIES:
 :CUSTOM_ID: h:656c70cd-cf9a-4471-a0b5-4f0aaf60f881
@@ -2874,61 +2912,6 @@ the following will prompt for a structure template as 
soon as
 Remember that ~denote-region-after-new-note-functions~ are not called
 if ~denote-region~ is used without an active region.
 
-** Split an Org subtree into its own note
-:PROPERTIES:
-:CUSTOM_ID: h:d0c7cb79-21e5-4176-a6af-f4f68578c8dd
-:END:
-
-With Org files in particular, it is common to have nested headings
-which could be split off into their own standalone notes.  In Org
-parlance, an entry with all its subheadings is a "subtree".  With the
-following code, the user places the point inside the heading they want
-to split off and invokes the command ~my-denote-org-extract-subtree~.
-It will create a note using the heading's text and tags for the new
-file.  The contents of the subtree become the contents of the new note
-and are removed from the old one.
-
-#+begin_src emacs-lisp
-(defun my-denote-org-extract-subtree (&optional silo)
-  "Create new Denote note using current Org subtree.
-Make the new note use the Org file type, regardless of the value
-of `denote-file-type'.
-
-With an optional SILO argument as a prefix (\\[universal-argument]),
-ask user to select a SILO from `my-denote-silo-directories'.
-
-Use the subtree title as the note's title.  If available, use the
-tags of the heading are used as note keywords.
-
-Delete the original subtree."
-  (interactive
-   (list (when current-prefix-arg
-           (completing-read "Select a silo: " my-denote-silo-directories nil 
t))))
-  (if-let ((text (org-get-entry))
-           (heading (org-get-heading :no-tags :no-todo :no-priority 
:no-comment)))
-      (let ((element (org-element-at-point))
-            (tags (org-get-tags))
-            (denote-user-enforced-denote-directory silo))
-        (delete-region (org-entry-beginning-position)
-                       (save-excursion (org-end-of-subtree t) (point)))
-        (denote heading
-                tags
-                'org
-                nil
-                (or
-                 ;; Check PROPERTIES drawer for :created: or :date:
-                 (org-element-property :CREATED element)
-                 (org-element-property :DATE element)
-                 ;; Check the subtree for CLOSED
-                 (org-element-property :raw-value
-                                       (org-element-property :closed 
element))))
-        (insert text))
-    (user-error "No subtree to extract; aborting")))
-#+end_src
-
-Have a different workflow?  Feel welcome to discuss it in any of our
-official channels ([[#h:1ebe4865-c001-4747-a6f2-0fe45aad71cd][Contributing]]).
-
 ** Narrow the list of files in Dired
 :PROPERTIES:
 :CUSTOM_ID: h:ea173a01-69ef-4574-89a7-6e60ede02f13
diff --git a/denote-org-extras.el b/denote-org-extras.el
index 9e29c70fb2..10523e9a77 100644
--- a/denote-org-extras.el
+++ b/denote-org-extras.el
@@ -121,5 +121,48 @@ To only link to a file, use the `denote-link' command."
              (description (denote-org-extras-format-link-get-description file 
heading-text)))
     (insert (denote-org-extras-format-link-with-heading file heading-id 
description))))
 
+;;;; Extract subtree into its own note
+
+(defun denote-org-extras--get-heading-date ()
+  "Try to return a timestamp for the current Org heading.
+This can be used as the value for the DATE argument of the
+`denote' command."
+  (when-let ((pos (point))
+             (timestamp (or (org-entry-get pos "DATE")
+                            (org-entry-get pos "CREATED"))))
+    (date-to-time timestamp)))
+
+;;;###autoload
+(defun denote-org-extras-extract-org-subtree ()
+  "Create new Denote note using the current Org subtree.
+Remove the subtree from its current file and move its contents
+into the new Denote file.
+
+Take the text of the subtree's top level heading and use it as
+the title of the new note.
+
+If the heading has any tags, use them as the keywords of the new
+note.  Else do not include any keywords.
+
+If the subtree has a PROPERTIES drawer, retain it for further
+review.  If the PROPERTIES drawer includes a DATE or CREATED
+property with a timestamp value, use that to derive the date (or
+date and time) of the new note (if there is only a date, the time
+is taken as 00:00).  If both DATE and CREATED properties are
+present, the former is used.
+
+Make the new note an Org file regardless of the value of
+`denote-file-type'."
+  (interactive)
+  (if-let ((text (org-get-entry))
+           (heading (denote-link-ol-get-heading)))
+      (let ((tags (org-get-tags))
+            (date (denote-org-extras--get-heading-date)))
+        (delete-region (org-entry-beginning-position)
+                       (save-excursion (org-end-of-subtree t) (point)))
+        (denote heading tags 'org nil date)
+        (insert text))
+    (user-error "No subtree to extract; aborting")))
+
 (provide 'denote-org-extras)
 ;;; denote-org-extras.el ends here



reply via email to

[Prev in Thread] Current Thread [Next in Thread]