37 lines
1.5 KiB
EmacsLisp
37 lines
1.5 KiB
EmacsLisp
|
;;; lang/org/+protocol.el -*- lexical-binding: t; -*-
|
||
|
|
||
|
;; Brings lazy-loaded support for org-protocol, so external programs (like
|
||
|
;; browsers) can invoke specialized behavior from Emacs. Normally you'd simply
|
||
|
;; require `org-protocol' and use it, but the package loads all of org for no
|
||
|
;; compelling reason, so...
|
||
|
(defun +org*server-visit-files (args)
|
||
|
"Advise `server-visit-flist' to invoke `org-protocol' lazily."
|
||
|
(cl-destructuring-bind (files proc &optional nowait) args
|
||
|
(catch 'greedy
|
||
|
(let ((flist (reverse files)))
|
||
|
(dolist (var flist)
|
||
|
(when (string-match-p ":/+" (car var))
|
||
|
(require 'server)
|
||
|
(require 'org-protocol)
|
||
|
;; `\' to `/' on windows
|
||
|
(let ((fname (org-protocol-check-filename-for-protocol
|
||
|
(expand-file-name (car var))
|
||
|
(member var flist)
|
||
|
proc)))
|
||
|
(cond ((eq fname t) ; greedy? We need the t return value.
|
||
|
(setq files nil)
|
||
|
(throw 'greedy t))
|
||
|
((stringp fname) ; probably filename
|
||
|
(setcar var fname))
|
||
|
((setq files (delq var files)))))))))
|
||
|
(list files proc nowait)))
|
||
|
(advice-add #'server-visit-files :filter-args #'+org*server-visit-files)
|
||
|
|
||
|
;; Disable built-in, clumsy advice
|
||
|
(after! org-protocol
|
||
|
(ad-disable-advice 'server-visit-files 'before 'org-protocol-detect-protocol-server))
|
||
|
|
||
|
|
||
|
;; TODO org-board or better link grabbing support
|
||
|
;; TODO org-capture + org-protocol instead of bin/org-capture
|