doomemacs/modules/lang/org/contrib/dragndrop.el
Henrik Lissner 659f7bfc71
refactor!: deprecate IS-* OS constants
BREAKING CHANGE: This deprecates the IS-(MAC|WINDOWS|LINUX|BSD) family
of global constants in favor of a native `featurep` check:

  IS-MAC      ->  (featurep :system 'macos)
  IS-WINDOWS  ->  (featurep :system 'windows)
  IS-LINUX    ->  (featurep :system 'linux)
  IS-BSD      ->  (featurep :system 'bsd)

The constants will stick around until the v3 release so folks can still
use it -- and there are still some modules that use it, but I'll phase
those uses out gradually.

Fix: #7479
2024-02-04 17:54:29 -05:00

88 lines
3.9 KiB
EmacsLisp

;;; lang/org/contrib/dragndrop.el -*- lexical-binding: t; -*-
;;;###if (modulep! +dragndrop)
(use-package! org-download
:commands
org-download-dnd
org-download-yank
org-download-screenshot
org-download-clipboard
org-download-dnd-base64
:init
;; HACK We add these manually so that org-download is truly lazy-loaded
(pushnew! dnd-protocol-alist
'("^\\(?:https?\\|ftp\\|file\\|nfs\\):" . org-download-dnd)
'("^data:" . org-download-dnd-base64))
(advice-add #'org-download-enable :override #'ignore)
(after! org
;; A shorter link to attachments
(+org-define-basic-link "download" (lambda () (or org-download-image-dir org-attach-id-dir "."))
:image-data-fun #'+org-image-file-data-fn
:requires 'org-download))
:config
(unless org-download-image-dir
(setq org-download-image-dir org-attach-id-dir))
(setq org-download-method 'attach
org-download-timestamp "_%Y%m%d_%H%M%S"
org-download-screenshot-method
(cond ((featurep :system 'macos) "screencapture -i %s")
((featurep :system 'linux)
(cond ((executable-find "maim") "maim -s %s")
((executable-find "scrot") "scrot -s %s")
((executable-find "gnome-screenshot") "gnome-screenshot -a -f %s"))))
org-download-heading-lvl nil
org-download-link-format "[[download:%s]]\n"
org-download-annotate-function (lambda (_link) "")
org-download-link-format-function
(lambda (filename)
(if (eq org-download-method 'attach)
(format "[[attachment:%s]]\n"
(org-link-escape
(file-relative-name filename (org-attach-dir))))
;; Handle non-image files a little differently. Images should be
;; inserted as normal with previews. Other files, like pdfs or zips,
;; should be linked to, with an icon indicating the type of file.
(format (concat (unless (image-type-from-file-name filename)
(concat (+org-attach-icon-for filename)
" "))
org-download-link-format)
(org-link-escape
(funcall org-download-abbreviate-filename-function filename)))))
org-download-abbreviate-filename-function
(lambda (path)
(if (file-in-directory-p path org-download-image-dir)
(file-relative-name path org-download-image-dir)
path)))
(defadvice! +org--fix-org-download-delete-a (fn beg end &optional times)
"Fix `org-download-delete' for a non-standard `org-download-link-format'."
:around #'org-download--delete
(save-excursion
(save-match-data
(goto-char beg)
(let ((times (or times most-positive-fixnum))
(linkname
(or (and (string-match "\\[\\[\\(\\w+\\):" org-download-link-format)
(match-string 1 org-download-link-format))
"file")))
(while (and (>= (cl-decf times) 0)
(re-search-forward (format "\\[\\[%s:\\([^]]*\\)\\]\\]"
(regexp-quote linkname))
end t))
(let ((str (match-string-no-properties 2)))
(delete-region beg (match-end 0))
(when (file-exists-p str)
(delete-file str))))))))
(defadvice! +org--dragndrop-then-display-inline-images-a (_link filename)
:after #'org-download-insert-link
(when (image-type-from-file-name filename)
(save-excursion
(org-display-inline-images
t t
(progn (org-back-to-heading-or-point-min t) (point))
(progn (org-end-of-subtree t t)
(when (and (org-at-heading-p) (not (eobp))) (backward-char 1))
(point)))))))