org-protocol: Simplifactions

This commit is contained in:
Carsten Dominik 2009-04-03 17:36:44 +02:00
parent c27fe63388
commit 981cefb034

View file

@ -147,7 +147,7 @@ for `org-protocol-the-protocol' and sub-procols defined in
;;; Variables:
(defconst org-protocol-protocol-alist-default
'(("org-remember" :protocol "remember" :function org-protocol-remember)
'(("org-remember" :protocol "remember" :function org-protocol-remember :kill-client t)
("org-store-link" :protocol "store-link" :function org-protocol-store-link)
("org-open-source" :protocol "open-source" :function org-protocol-open-source))
"Default protocols to use.
@ -216,7 +216,7 @@ Consider using the interactive functions `org-protocol-create' and
Each element of this list must be of the form:
(module-name :protocol protocol :function func)
(module-name :protocol protocol :function func :kill-client nil)
protocol - protocol to detect in a filename without trailing colon and slashes.
See rfc1738 section 2.1 for more on this.
@ -235,6 +235,12 @@ function - function that handles requests with protocol and takes exactly one
if you stay with the conventions used for the standard handlers in
`org-protocol-protocol-alist-default'. See `org-protocol-split-data'.
kill-client - If t, kill the client immediately, once the sub-protocol is
detected. This is neccessary for actions that can be interupted by
`C-g' to avoid dangeling emacsclients. Note, that all other command
line arguments but the this one will be discarded, greedy handlers
still receive the whole list of arguments though.
Here is an example:
(setq org-protocol-protocol-alist
@ -326,31 +332,26 @@ URL with a character and a slash like so:
Now template ?b will be used."
(if (and (boundp 'org-stored-links)
(fboundp 'org-remember))
(let* ((b (generate-new-buffer "*org-protocol*"))
(parts (org-protocol-split-data info t))
(template (or (and (= 1 (length (car parts))) (pop parts)) "w"))
(url (org-protocol-sanitize-uri (car parts)))
(type (if (string-match "^\\([a-z]+\\):" url)
(match-string 1 url)))
(title (cadr parts))
(region (caddr parts))
orglink)
(setq orglink (org-make-link-string url title))
(org-store-link-props :type type
:link url
:region region
:description title)
(setq org-stored-links
(cons (list url title) org-stored-links))
;; FIXME can't access %a in the template -- how to set annotation?
(raise-frame)
(kill-new orglink)
(set-buffer b)
(insert region)
(mark-whole-buffer)
(org-remember nil (string-to-char template))
(kill-buffer b))
(fboundp 'org-remember))
(let* ((parts (org-protocol-split-data info t))
(template (or (and (= 1 (length (car parts))) (pop parts)) "w"))
(url (org-protocol-sanitize-uri (car parts)))
(type (if (string-match "^\\([a-z]+\\):" url)
(match-string 1 url)))
(title (cadr parts))
(region (caddr parts))
(orglink (org-make-link-string url title))
remember-annotation-functions)
(setq org-stored-links
(cons (list url title) org-stored-links))
(kill-new orglink)
(org-store-link-props :type type
:link url
:description title
:initial region)
(raise-frame)
(org-remember nil (string-to-char template)))
(message "Org-mode not loaded."))
nil)
@ -393,7 +394,7 @@ The location for a browser's bookmark should look like this:
;;; Core functions:
(defun org-protocol-check-filename-for-protocol (fname restoffiles)
(defun org-protocol-check-filename-for-protocol (fname restoffiles client)
"Detect if `org-protocol-the-protocol' and a known sub-protocol is used in fname.
Sub-protocols are registered in `org-protocol-protocol-alist' and
`org-protocol-protocol-alist-default'.
@ -420,6 +421,8 @@ as filename."
(greedy (plist-get (cdr prolist) :greedy))
(splitted (split-string fname proto))
(result (if greedy restoffiles (cadr splitted))))
(if (plist-get (cdr prolist) :kill-client)
(server-delete-client client t))
(when (fboundp func)
(unless greedy
(throw 'fname (funcall func result)))
@ -433,11 +436,12 @@ as filename."
"Advice server-visit-flist to call `org-protocol-modify-filename-for-protocol'."
(let ((flist (if org-protocol-reverse-list-of-files
(reverse (ad-get-arg 0))
(ad-get-arg 0))))
(ad-get-arg 0)))
(client (ad-get-arg 1)))
(catch 'greedy
(dolist (var flist)
(let ((fname (expand-file-name (car var)))) ;; `\' to `/' on windows. FIXME: could this be done any better?
(setq fname (org-protocol-check-filename-for-protocol fname (member var flist)))
(setq fname (org-protocol-check-filename-for-protocol fname (member var flist) client))
(if (eq fname t) ;; greedy? We need the `t' return value.
(progn
(ad-set-arg 0 nil)
@ -447,7 +451,6 @@ as filename."
(ad-set-arg 0 (delq var (ad-get-arg 0))))))
))))
;;; Org specific functions:
(defun org-protocol-create-for-org ()