1
0
Fork 0

Add functions to create notes while reading ebooks

This commit is contained in:
Tom Willemse 2020-05-11 00:14:57 -07:00
parent cbaeffe3a1
commit 9b147ad6af

View file

@ -4,7 +4,7 @@
;; Author: Tom Willemse <tom@ryuslash.org>
;; Keywords: local
;; Version: 2020.0420.220918
;; Version: 2020.0511.001009
;; Package-Requires: (oni-yasnippet oni-alert oni-hydra org-plus-contrib org-bullets org-edna diminish all-the-icons)
;; This program is free software; you can redistribute it and/or modify
@ -231,8 +231,63 @@ _l_: Store link ^^ _j_: Journal entry
("documents/gtd/books.org" :maxlevel . 1)
("documents/gtd/bookmarks.org" :maxlevel . 2))))
(defun oni-org-find-heading-in-file (heading file &optional move)
"Try to find HEADING somewhere in FILE.
This function returns nil if HEADING couldnt be found, and the
position where the chapter starts otherwise. If MOVE is non-nil
also move point to the start of the heading."
(let ((buffer (find-file-noselect file)))
(with-current-buffer buffer
(save-excursion
(goto-char (point-min))
(org-find-exact-headline-in-buffer heading buffer (not move))))))
(defun oni-org-create-book-heading (book-title file)
"Create a new heading for BOOK-TITLE in FILE."
(let ((buffer (find-file file)))
(with-current-buffer buffer
(goto-char (point-max))
(insert "\n* " book-title "\n\n "))))
(defun oni-org-create-chapter-heading (book-title chapter-title file)
"Create a new heading under BOOK-TITLE for CHAPTER-TITLE in FILE."
(let ((buffer (find-file file)))
(with-current-buffer buffer
(goto-char (point-min))
(goto-char (oni-org-find-heading-in-file book-title file t))
(goto-char (org-element-property :end (org-element-at-point)))
(unless (= (point) (point-max))
(open-line 2))
(insert "\n** " chapter-title "\n\n "))))
(defun oni-org-create-chapter-section (chapter-title file)
"Create a new notes section under CHAPTER-TITLE in FILE."
(let ((buffer (find-file file)))
(with-current-buffer buffer
(goto-char (point-min))
(goto-char (oni-org-find-heading-in-file chapter-title file t))
(goto-char (org-element-property :contents-end (org-element-at-point)))
(insert "\n"))))
(defun oni-org-reading-note ()
"Find the org-header associated with the current chapter or page."
(let* ((headers (split-string (format-mode-line header-line-format) ":" t " "))
(book-name (car headers))
(chapter-name (cadr headers))
(notes-file (oni-org-expand-to-home "documents/gtd/reading-notes.org"))
(chapter-start (oni-org-find-heading-in-file chapter-name notes-file)))
(if (not chapter-start)
(let ((book-start (oni-org-find-heading-in-file book-name notes-file)))
(unless book-start
(oni-org-create-book-heading book-name notes-file))
(oni-org-create-chapter-heading book-name chapter-name notes-file))
(oni-org-create-chapter-section chapter-name notes-file))))
(setq org-capture-templates-contexts
'(("n" ((in-mode . "nov-mode")))))
(setq org-capture-templates
`(("t" "Note" entry
`(("t" "Task" entry
(file ,(oni-org-expand-to-home "documents/gtd/inbox.org"))
"* TODO %i%?\n :PROPERTIES:\n :CREATED: %U\n :END:")
("a" "Appointment" entry
@ -243,6 +298,9 @@ _l_: Store link ^^ _j_: Journal entry
(file+olp+datetree
,(oni-org-expand-to-home "documents/gtd/journal.org"))
"* %<%H:%M:%S>\n %?")
("n" "Reading note" item (function oni-org-reading-note)
"%?\n\n#+begin_quote\n%i\n#+end_quote"
:empty-lines 1)
("c" "Add to currently clocked item")
("ca" "Note" plain
(clock)