summaryrefslogtreecommitdiff
path: root/modules/org-capture-config.el
blob: 55a12e2f87c41efa66205207b81944abd210b74a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
;;; org-capture-config.el --- Org Capture Configuration  -*- lexical-binding: t; -*-
;; author: Craig Jennings <c@cjennings.net>

;;; Commentary:
;; Customizations related to org-capture and org-refile is here.
;; This includes 'cj/org-webpage-clipper' functionality.

;; To ensure the code below is only loaded after org-mode, all code is wrapped in an
;; eval-after-load function.

;; bookmarklet code:
;; text
;; javascript:location.href='org-protocol://capture?template=L&url=%27+encodeURIComponent(location.href)+%27&title=%27+encodeURIComponent(document.title)+%27&body=%27+encodeURIComponent(window.getSelection())

;; text + selection
;; javascript:location.href='org-protocol://capture?template=p&url=%27+encodeURIComponent(location.href)+%27&title=%27+encodeURIComponent(document.title)+%27&body=%27+encodeURIComponent(window.getSelection())

;;; Code:

;; ---------------------------- Org Webpage Clipper ----------------------------
;; Allows saving a copy of the page eww is visiting for offline reading.
;; In other words, it's a "Pocket/Instapaper" that keeps the article in Emacs.
;; Used in conjuction with org-capture-template "w" "Web Page Clipper" below.


(defun cj/org-webpage-clipper ()
  "Capture a web page for later viewing in an org-file.
  and Returns the yanked content as a string."
  (interactive)
  (let* ((source-buffer (org-capture-get :original-buffer))
         (source-mode (with-current-buffer source-buffer major-mode)))
    (cond
     ((eq source-mode 'w3m-mode)
      (with-current-buffer source-buffer
        (org-w3m-copy-for-org-mode)))
     ((eq source-mode 'eww-mode)
      (with-current-buffer source-buffer
        (org-eww-copy-for-org-mode)))
     (t
      (error "Not valid -- must be in w3m or eww mode")))
    ;; extract the webpage content from the kill ring
    (car kill-ring)))


;; ----------------------- Org Capture PDF Active Region -----------------------
;; allows capturing the selected region from within a PDF file.

(defun cj/org-capture-pdf-active-region ()
  "Capture the active region of the pdf-view buffer.
Intended to be called within an org capture template."
  (let* ((pdf-buf-name (plist-get org-capture-plist :original-buffer))
         (pdf-buf (get-buffer pdf-buf-name)))
    (if (buffer-live-p pdf-buf)
        (with-current-buffer pdf-buf
          (car (pdf-view-active-region-text)))
      (user-error "Buffer %S not alive" pdf-buf-name))))

;; --------------------------- Org-Capture Templates ---------------------------
;; you can bring up the org capture menu with C-c c

(use-package org-protocol
  :ensure nil ;; built-in
  :defer .5
  :after org
  :config
  ;; ORG-CAPTURE TEMPLATES
  (setq org-protocol-default-template-key "L")
  (setq org-capture-templates
        '(("t" "Task" entry (file+headline inbox-file "Inbox")
           "* TODO %?" :prepend t)

          ("e" "Event" entry (file+headline schedule-file "Scheduled Events")
           "* %?\nWHEN: %^t" :prepend t)

          ("E" "Epub Text" entry (file+headline inbox-file "Inbox")
           "* %?
#+BEGIN_QUOTE\n %i\n#+END_QUOTE
Source: [[%:link][%(buffer-name (org-capture-get :original-buffer))]]
Captured On: %U" :prepend t)

          ;; requires cj/org-capture-pdf-active-region function defined above
          ("P" "PDF Text" entry (file+headline inbox-file "Inbox")
           "* %?
#+BEGIN_QUOTE\n%(cj/org-capture-pdf-active-region)\n#+END_QUOTE
Source:[[%L][%(buffer-name (org-capture-get :original-buffer))]]
Captured On: %U" :prepend t)

          ("p" "Link with Selection" entry (file+headline inbox-file "Inbox")
           "* %?%:description
#+BEGIN_QUOTE\n%i\n#+END_QUOTE
[[%:link][%:description]]
Captured On: %U\n" :prepend t)

          ("L" "Link" entry (file+headline inbox-file "Inbox")
           "* %?%:description
[[%:link][%:description]]\nCaptured On: %U" :prepend t :immediate-finish t)

          ("m" "Mu4e Email" entry (file+headline inbox-file "Inbox")
           "* TODO %?
%(if (string= \"%i\" \"\") \"\" \"\n#+BEGIN_QUOTE\n%i\n#+END_QUOTE\")
[[%:link][%:description]]
Captured On: %U"
           :prepend t)

          ("g" "Grocery List Item" item
           (file+headline inbox-file "Grocery List") "%?")

          ("s" "Shopping List Entry" entry
           (file+headline inbox-file "Shopping List") "* %?")

          ;; requires cj/org-web-clipper function defined above
          ("w" "Web Page Clipper" plain
           (function cj/org-roam-capture-webclip)
           "" :immediate-finish t)
          )) ;; end setq
  ) ;; end use-package org-protocol

;; -------------------------- Org-Roam-Capture-Webclip -------------------------

(defun cj/org-roam-capture-webclip ()
  "Capture current webpage as an org-roam node with webclipped tag."
  (let* ((url (plist-get org-store-link-plist :link))
         (title (or (plist-get org-store-link-plist :description) ""))
         (body (cj/org-webpage-clipper)))
    (org-roam-capture- :node (org-roam-node-create :title title)
                       :templates '(("w" "webclip" plain "%?"
                                     :if-new (file+head "%<%Y%m%d%H%M%S>-${slug}.org"
                                                        "#+TITLE: ${title}
#+FILETAGS: webclipped
#+ROAM_KEY: ${url}
URL: ${url}
Captured On: %U

${body}")
                                     :unnarrowed t
                                     :immediate-finish t))
                       :props =(:url ,url
                                     :body ,body))))

;; ---------------------------- Simple Task Capture ----------------------------
;; the simplest way to capture a task. Also a simple way to write this function.

(define-key global-map (kbd "C-S-t") (kbd "C-c c t"))

(provide 'org-capture-config)
;;; org-capture-config.el ends here.