2017-12-08 22:59:42 -05:00
|
|
|
;;; lang/org/+attach.el -*- lexical-binding: t; -*-
|
2017-07-05 02:33:41 +02:00
|
|
|
|
|
|
|
;; I believe Org's native attachment system is over-complicated and litters
|
2017-09-07 17:25:38 +02:00
|
|
|
;; files with metadata I don't want. So I wrote my own, which:
|
2017-07-05 02:33:41 +02:00
|
|
|
;;
|
2017-09-07 17:25:38 +02:00
|
|
|
;; + Causes attachments to be placed in a centralized location,
|
|
|
|
;; + Adds drag-and-drop support for images (with inline image preview)
|
|
|
|
;; + Adds drag-and-drop support for media files (pdfs, zips, etc) with a
|
|
|
|
;; filetype icon and short link.
|
2017-07-05 02:33:41 +02:00
|
|
|
;; + TODO Offers an attachment management system.
|
|
|
|
|
2017-09-07 17:25:38 +02:00
|
|
|
;; Some commands of interest:
|
|
|
|
;; + `org-download-screenshot'
|
|
|
|
;; + `+org-attach/file'
|
|
|
|
;; + `+org-attach/url'
|
|
|
|
;; + :org [FILE/URL]
|
|
|
|
|
2017-12-24 15:13:36 -05:00
|
|
|
(defvar +org-attach-dir ".attach/"
|
2017-12-08 22:59:42 -05:00
|
|
|
"Where to store attachments (relative to current org file).")
|
|
|
|
|
|
|
|
|
2017-07-05 02:33:41 +02:00
|
|
|
(def-package! org-download
|
2017-09-07 17:25:38 +02:00
|
|
|
:commands (org-download-dnd org-download-dnd-base64)
|
|
|
|
:init
|
|
|
|
;; Add these myself, so that org-download is lazy-loaded...
|
|
|
|
(setq dnd-protocol-alist
|
|
|
|
`(("^\\(https?\\|ftp\\|file\\|nfs\\):" . +org-attach-download-dnd)
|
|
|
|
("^data:" . org-download-dnd-base64)
|
|
|
|
,@dnd-protocol-alist))
|
|
|
|
|
|
|
|
(advice-add #'org-download-enable :override #'ignore)
|
2017-07-05 02:33:41 +02:00
|
|
|
:config
|
2017-12-24 15:13:36 -05:00
|
|
|
(setq-default org-download-image-dir org-attach-directory
|
2017-07-05 02:33:41 +02:00
|
|
|
org-download-heading-lvl nil
|
|
|
|
org-download-timestamp "_%Y%m%d_%H%M%S")
|
2017-09-07 17:25:38 +02:00
|
|
|
|
2017-07-05 02:33:41 +02:00
|
|
|
(setq org-download-screenshot-method
|
2017-09-07 17:25:38 +02:00
|
|
|
(cond (IS-MAC "screencapture -i %s")
|
|
|
|
(IS-LINUX
|
2017-12-08 22:59:42 -05:00
|
|
|
(cond ((executable-find "maim") "maim -s %s")
|
|
|
|
((executable-find "scrot") "scrot -s %s")))))
|
2017-09-07 17:25:38 +02:00
|
|
|
|
2017-11-14 01:50:58 +01:00
|
|
|
;; Ensure that relative inline image paths are relative to the attachment folder.
|
|
|
|
(advice-add #'org-display-inline-images :around #'+org-attach*relative-to-attach-dir)
|
|
|
|
|
2017-09-07 17:25:38 +02:00
|
|
|
;; Handle non-image files a little differently. Images should be inserted
|
|
|
|
;; as-is, as image previews. Other files, like pdfs or zips, should be linked
|
|
|
|
;; to, with an icon indicating the type of file.
|
|
|
|
(advice-add #'org-download-insert-link :override #'+org-attach*insert-link)
|
|
|
|
|
|
|
|
(defun +org-attach*download-subdir ()
|
|
|
|
(when (file-in-directory-p buffer-file-name +org-dir)
|
|
|
|
(file-relative-name buffer-file-name +org-dir)))
|
2017-07-05 02:33:41 +02:00
|
|
|
|
|
|
|
;; Write download paths relative to current file
|
|
|
|
(defun +org-attach*download-fullname (path)
|
2017-09-07 17:25:38 +02:00
|
|
|
(file-relative-name path (file-name-directory buffer-file-name)))
|
2017-07-05 02:33:41 +02:00
|
|
|
(advice-add #'org-download--dir-2 :override #'ignore)
|
|
|
|
(advice-add #'org-download--fullname
|
|
|
|
:filter-return #'+org-attach*download-fullname))
|
|
|
|
|
|
|
|
;;
|
2017-12-09 14:42:42 -05:00
|
|
|
(after! org
|
2017-12-24 15:13:36 -05:00
|
|
|
(setq org-attach-directory (expand-file-name +org-attach-dir +org-dir))
|
2017-07-05 02:33:41 +02:00
|
|
|
|
2017-12-08 22:59:42 -05:00
|
|
|
(push (car (last (split-string +org-attach-dir "/" t)))
|
|
|
|
projectile-globally-ignored-directories)
|
2017-07-05 02:33:41 +02:00
|
|
|
|
2017-09-07 17:25:38 +02:00
|
|
|
(after! recentf
|
2017-12-24 15:13:36 -05:00
|
|
|
(push (format "%s.+$" (regexp-quote org-attach-directory))
|
2017-09-07 17:25:38 +02:00
|
|
|
recentf-exclude)))
|
2017-07-05 02:33:41 +02:00
|
|
|
|