emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: John Kitchin <jkitchin@andrew.cmu.edu>
To: Nicolas Goaziou <mail@nicolasgoaziou.fr>
Cc: "emacs-orgmode@gnu.org" <emacs-orgmode@gnu.org>
Subject: Re: Draft of links-9.0
Date: Tue, 05 Jul 2016 16:30:53 -0400	[thread overview]
Message-ID: <m2wpkzesjm.fsf@Johns-MacBook-Air.local> (raw)
In-Reply-To: <87a8hvgaqh.fsf@saiph.selenimh>


Nicolas Goaziou writes:

> Hello,
>
> John Kitchin <jkitchin@andrew.cmu.edu> writes:
>
>> I have completed a draft of links-9.0
>> (https://github.com/jkitchin/org-mode/tree/link-9.0). This centralizes
>> almost all link properties into a variable `org-link-parameters' and
>> makes it possible to customize almost everything in the link.
>
> Thank you.
No problem.

>
>> which also fail for me on master. There are about 27 commits from this
>> branch to master I think. I didn't make patches for all of them yet,
>> since that seemed like a bunch of them. This branch doesn't fix anything
>> in contrib yet (except the manual).
>
> I'm surprised there are so many of them. Anyway, it would be nice to
> display them here, for review.

I pasted the diffs at the end. There are a lot because it touched a lot of
files, and I committed each one separately, and forgot a few commits
that ended up as extras. Probably some could be combined and squashed if
that is desirable. I am not sure how to do it yet though.


> Please do not extend `org-add-link-type': you are conflating two ways to
> set the same thing. 
>
> It is better to create a new function, e.g., `org-link-add' with the
> following signature
>
>   (defun org-link-add (type &rest properties)
>    ...)
>
> used like
>
>   (org-link-add "red" :follow (lambda (path desc backend) ...) :export ....)
>
> and keep `org-add-link-type' as a _deprecated_ function basically
> calling the previous one:
>
>   (defun org-add-link-type (type &optional follow export)
>    (org-link-add type :follow follow :export export))

I did all of this in the commits that are listed below. There is no formal
deprecation on org-add-link-type, other than a note in the docstring.

I still haven't touched anything in contrib.


>
> Otherwise, it looks good.
>
>
> Regards,

commit 546031bb7b59a9deb6bce976f7f7496ea7b2ffc4
Author: John Kitchin <jkitchin@andrew.cmu.edu>
Date:   Tue Jul 5 16:16:29 2016 -0400

    add link-start and link-end variables

diff --git a/lisp/org.el b/lisp/org.el
index 872f861..684eae0 100644
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -5927,6 +5927,8 @@ prompted for."
 	   (link (match-string-no-properties 0))
 	   (type (match-string-no-properties 1))
 	   (path (match-string-no-properties 2))
+	   (link-start (match-beginning 0))
+	   (link-end (match-end 0))
 	   (link-face (org-link-get-parameter type :face))
 	   (help-echo (org-link-get-parameter type :help-echo))	   
 	   (htmlize-link (org-link-get-parameter type :htmlize-link))

commit d1799252a7e4bd255a5507d742e0b0a7c19983b1
Author: John Kitchin <jkitchin@andrew.cmu.edu>
Date:   Tue Jul 5 16:16:02 2016 -0400

    deprecate org-add-link-type
    
    It now calls org-link-add.

diff --git a/lisp/org.el b/lisp/org.el
index 4fb1cfb..872f861 100644
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -9852,10 +9852,10 @@ Special properties are:
 In addition to these, any additional properties can be specified
 and then used in capture templates.")
 
-(cl-defun org-add-link-type (type &optional follow export
-				  &key store complete face mouse-face display
-				  help-echo keymap htmlize-link activate-func)
+(defun org-add-link-type (type &optional follow export)
   "Add a new TYPE link.
+Deprecated. Use `org-link-add' instead.
+
 FOLLOW and EXPORT are two functions.
 
 FOLLOW should take the link path as the single argument and do whatever
@@ -9880,20 +9880,7 @@ type.  For a simple example of an export function, see `org-bbdb.el'.
 
 If TYPE already exists, update it with the arguments.
 See `org-link-parameters' for documentation on the other parameters."
-  (if (assoc type org-link-parameters)
-      (org-link-set-parameters
-       type :follow follow :export export :store store
-       :complete complete :face face :mouse-face mouse-face
-       :display display :help-echo help-echo :keymap keymap
-       :htmlize-link htmlize-link :activate-func activate-func)
-    ;; Add new link
-    (push (list type :follow follow :export export :store store
-		:complete complete :face face :mouse-face mouse-face
-		:display display :help-echo help-echo :keymap keymap
-		:htmlize-link htmlize-link :activate-func activate-func)
-	  org-link-parameters))
-  (org-make-link-regexps)
-  (org-element-update-syntax)
+  (org-link-add type :follow follow :export export) 
   (message "Created %s link." type))
 
   (defun org-store-link-functions ()

commit 4b2cc306d43c7b641690a2feb7f78881025bf3e8
Author: John Kitchin <jkitchin@andrew.cmu.edu>
Date:   Tue Jul 5 16:15:11 2016 -0400

    make set-parameters only set existing parameters.
    
    Create a new org-link-add function for making links.

diff --git a/lisp/org.el b/lisp/org.el
index 3e80243..4fb1cfb 100644
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -1796,20 +1796,24 @@ Subsequent optional elements make up a p-list of link properties.
 (defun org-link-set-parameters (type &rest parameters)
   "Set link TYPE properties to PARAMETERS.
 PARAMETERS should be :key val pairs."
-  (if (cdr (assoc type org-link-parameters))
-      ;; update old link
-      (cl-loop for (key val) on parameters by #'cddr
-	       do
-	       (setf (cl-getf
-		      (cdr (assoc type org-link-parameters))
-		      key)
-		     val))
-    ;; add new one.
-    (push `(,type ,@parameters) org-link-parameters)
-    (org-make-link-regexps)
-    (org-element-update-syntax))
+  (unless (cdr (assoc type org-link-parameters))
+    (error "No link of type %s defined." type))
+  (cl-loop for (key val) on parameters by #'cddr
+	   do
+	   (setf (cl-getf
+		  (cdr (assoc type org-link-parameters))
+		  key)
+		 val))
   org-link-parameters)
 
+(defun org-link-add (type &rest properties)
+  "Add a TYPE link with PROPERTIES defined as a plist.
+See `org-link-parameters' for details on the PROPERTIES." 
+  (push (append (list type) properties)
+	org-link-parameters)
+  (org-make-link-regexps)
+  (org-element-update-syntax))
+
 (defun org-link-types ()
   "Returns a list of known link types."
   (mapcar 'car org-link-parameters))

commit 1069d9bac0974f27abda2736fef883eb8334c761
Author: John Kitchin <jkitchin@andrew.cmu.edu>
Date:   Tue Jul 5 16:14:02 2016 -0400

    update comment for new variable.

diff --git a/lisp/ox.el b/lisp/ox.el
index 0b749e8..8472e9d 100644
--- a/lisp/ox.el
+++ b/lisp/ox.el
@@ -4073,7 +4073,7 @@ meant to be translated with `org-export-data' or alike."
 ;;;; For Links
 ;;
 ;; `org-export-custom-protocol-maybe' handles custom protocol defined
-;; with `org-add-link-type', which see.
+;; in `org-link-parameters'.
 ;;
 ;; `org-export-get-coderef-format' returns an appropriate format
 ;; string for coderefs.

commit 70ccc670145312907fa3a0c62a3a9dd9dc3ef38e
Author: John Kitchin <jkitchin@andrew.cmu.edu>
Date:   Tue Jul 5 16:12:36 2016 -0400

    change to org-link-add

diff --git a/lisp/org-rmail.el b/lisp/org-rmail.el
index 9eff516..a3a17df 100644
--- a/lisp/org-rmail.el
+++ b/lisp/org-rmail.el
@@ -43,7 +43,7 @@
 (defvar rmail-file-name)        ; From rmail.el
 
 ;; Install the link type
-(org-add-link-type "rmail" 'org-rmail-open nil :store 'org-rmail-store-link)
+(org-link-add "rmail" :follow 'org-rmail-open :store 'org-rmail-store-link)
 
 ;; Implementation
 (defun org-rmail-store-link ()

commit 7890d9b5dc5d08d8d8d9069d3caa72873d0eee14
Author: John Kitchin <jkitchin@andrew.cmu.edu>
Date:   Tue Jul 5 16:12:13 2016 -0400

    change to org-link-add

diff --git a/lisp/org-mhe.el b/lisp/org-mhe.el
index ca8b68d..3fb9e4b 100644
--- a/lisp/org-mhe.el
+++ b/lisp/org-mhe.el
@@ -74,7 +74,7 @@ supported by MH-E."
 (defvar mh-search-regexp-builder)
 
 ;; Install the link type
-(org-add-link-type "mhe" 'org-mhe-open nil :store 'org-mhe-store-link)
+(org-link-add "mhe" :follow 'org-mhe-open :store 'org-mhe-store-link)
 
 ;; Implementation
 (defun org-mhe-store-link ()

commit 3a9bfa47a89bcaef41aecedcaa4a044421a3b755
Author: John Kitchin <jkitchin@andrew.cmu.edu>
Date:   Tue Jul 5 16:11:44 2016 -0400

    add properties

diff --git a/lisp/org-irc.el b/lisp/org-irc.el
index 4996d60..3e97a5f 100644
--- a/lisp/org-irc.el
+++ b/lisp/org-irc.el
@@ -71,7 +71,7 @@
 
 ;; Generic functions/config (extend these for other clients)
 
-(org-add-link-type "irc" 'org-irc-visit nil :store 'org-irc-store-link)
+(org-link-add "irc" :follow 'org-irc-visit :store 'org-irc-store-link)
 
 (defun org-irc-visit (link)
   "Parse LINK and dispatch to the correct function based on the client found."

commit 87b51146f1496c746aed87b4b16a0c085dbb803d
Author: John Kitchin <jkitchin@andrew.cmu.edu>
Date:   Tue Jul 5 16:11:26 2016 -0400

    add properties

diff --git a/lisp/org-info.el b/lisp/org-info.el
index 156de34..45e63ac 100644
--- a/lisp/org-info.el
+++ b/lisp/org-info.el
@@ -40,7 +40,7 @@
 (defvar Info-current-node)
 
 ;; Install the link type
-(org-link-add "info" 'org-info-open 'org-info-export :store 'org-info-store-link)
+(org-link-add "info" :follow 'org-info-open :export 'org-info-export :store 'org-info-store-link)
 
 ;; Implementation
 (defun org-info-store-link ()

commit d7f9c45e39bc17850f7efd32208ce2fd57290cba
Author: John Kitchin <jkitchin@andrew.cmu.edu>
Date:   Tue Jul 5 16:11:08 2016 -0400

    change to org-link-add

diff --git a/lisp/org-id.el b/lisp/org-id.el
index 2646c80..30b3558 100644
--- a/lisp/org-id.el
+++ b/lisp/org-id.el
@@ -675,7 +675,7 @@ optional argument MARKERP, return the position as a new marker."
     (move-marker m nil)
     (org-show-context)))
 
-(org-add-link-type "id" 'org-id-open)
+(org-link-add "id" :follow 'org-id-open)
 
 (provide 'org-id)
 

commit 6c0db58062879bad1b0f6bf39e3f378eb65bbb4f
Author: John Kitchin <jkitchin@andrew.cmu.edu>
Date:   Tue Jul 5 16:10:42 2016 -0400

    add property

diff --git a/lisp/org-gnus.el b/lisp/org-gnus.el
index 47f5250..f1a557c 100644
--- a/lisp/org-gnus.el
+++ b/lisp/org-gnus.el
@@ -74,7 +74,7 @@ this variable to t."
   :type 'boolean)
 
 ;; Install the link type
-(org-link-add "gnus" 'org-gnus-open nil :store 'org-gnus-store-link)
+(org-link-add "gnus" :follow 'org-gnus-open :store 'org-gnus-store-link)
 
 ;; Implementation
 

commit 73f7803d8ee752fd22e3621a1197c114e4e7f635
Author: John Kitchin <jkitchin@andrew.cmu.edu>
Date:   Tue Jul 5 16:10:26 2016 -0400

    add property

diff --git a/lisp/org-eshell.el b/lisp/org-eshell.el
index 04cc600..358bf67 100644
--- a/lisp/org-eshell.el
+++ b/lisp/org-eshell.el
@@ -27,7 +27,8 @@
 (require 'eshell)
 (require 'esh-mode)
 
-(org-link-add "eshell" 'org-eshell-open nil
+(org-link-add "eshell"
+	      :follow 'org-eshell-open
 	      :store 'org-eshell-store-link)
 
 (defun org-eshell-open (link)

commit d5c31edc8a29829645a67657100997265a821708
Author: John Kitchin <jkitchin@andrew.cmu.edu>
Date:   Tue Jul 5 16:10:07 2016 -0400

    add properties

diff --git a/lisp/org-docview.el b/lisp/org-docview.el
index 6f3dcdd..04f7ec2 100644
--- a/lisp/org-docview.el
+++ b/lisp/org-docview.el
@@ -49,7 +49,10 @@
 (declare-function doc-view-goto-page "doc-view" (page))
 (declare-function image-mode-window-get "image-mode" (prop &optional winprops))
 
-(org-link-add "docview" 'org-docview-open 'org-docview-export :store 'org-docview-store-link)
+(org-link-add "docview"
+	      :follow 'org-docview-open
+	      :export 'org-docview-export
+	      :store 'org-docview-store-link)
 
 (defun org-docview-export (link description format)
   "Export a docview link from Org files."

commit b47d402b475ce89fcd765c579ee4f9320ba18723
Author: John Kitchin <jkitchin@andrew.cmu.edu>
Date:   Tue Jul 5 16:09:44 2016 -0400

    add property

diff --git a/lisp/org-bibtex.el b/lisp/org-bibtex.el
index 8fcbbca..900d570 100644
--- a/lisp/org-bibtex.el
+++ b/lisp/org-bibtex.el
@@ -452,7 +452,7 @@ With optional argument OPTIONAL, also prompt for optional fields."
 
 \f
 ;;; Bibtex link functions
-(org-link-add "bibtex" 'org-bibtex-open nil :store 'org-bibtex-store-link)
+(org-link-add "bibtex" :follow 'org-bibtex-open nil :store 'org-bibtex-store-link)
 
 (defun org-bibtex-open (path)
   "Visit the bibliography entry on PATH."

commit 349604076b8609f4e7fa612824a384fbe8bf7774
Author: John Kitchin <jkitchin@andrew.cmu.edu>
Date:   Tue Jul 5 16:09:28 2016 -0400

    add properties

diff --git a/lisp/org-bbdb.el b/lisp/org-bbdb.el
index 2241b15..748aa4b 100644
--- a/lisp/org-bbdb.el
+++ b/lisp/org-bbdb.el
@@ -196,7 +196,7 @@ date year)."
 
 
 ;; Install the link type
-(org-link-add "bbdb" 'org-bbdb-open 'org-bbdb-export
+(org-link-add "bbdb" :follow 'org-bbdb-open :export 'org-bbdb-export
 	      :complete 'org-bbdb-complete-link
 	      :store 'org-bbdb-store-link)
 

commit a9dcab24cce7826ff80c83ba278304badbc0bc8c
Author: John Kitchin <jkitchin@andrew.cmu.edu>
Date:   Tue Jul 5 16:08:23 2016 -0400

    change doc string to point to new variable.

diff --git a/lisp/org-info.el b/lisp/org-info.el
index 627caf7..156de34 100644
--- a/lisp/org-info.el
+++ b/lisp/org-info.el
@@ -112,7 +112,7 @@ emacs related documents. See `org-info-official-gnu-document' and
 
 (defun org-info-export (path desc format)
   "Export an info link.
-See `org-add-link-type' for details about PATH, DESC and FORMAT."
+See `org-link-parameters' for details about PATH, DESC and FORMAT."
   (when (eq format 'html)
     (or (string-match "\\(.*\\)[#:]:?\\(.*\\)" path)
 	(string-match "\\(.*\\)" path))

commit 73af2a5192d85752517505e34d297de9f7de8d2b
Author: John Kitchin <jkitchin@andrew.cmu.edu>
Date:   Tue Jul 5 16:07:40 2016 -0400

    change to org-link-add

diff --git a/lisp/org-info.el b/lisp/org-info.el
index d9e9b07..627caf7 100644
--- a/lisp/org-info.el
+++ b/lisp/org-info.el
@@ -40,7 +40,7 @@
 (defvar Info-current-node)
 
 ;; Install the link type
-(org-add-link-type "info" 'org-info-open 'org-info-export :store 'org-info-store-link)
+(org-link-add "info" 'org-info-open 'org-info-export :store 'org-info-store-link)
 
 ;; Implementation
 (defun org-info-store-link ()

commit 9010641c4b7736c1d194d4dc4d6fded2896520ff
Author: John Kitchin <jkitchin@andrew.cmu.edu>
Date:   Tue Jul 5 16:07:07 2016 -0400

    change to org-link-add

diff --git a/lisp/org-gnus.el b/lisp/org-gnus.el
index 271f480..47f5250 100644
--- a/lisp/org-gnus.el
+++ b/lisp/org-gnus.el
@@ -74,7 +74,7 @@ this variable to t."
   :type 'boolean)
 
 ;; Install the link type
-(org-add-link-type "gnus" 'org-gnus-open nil :store 'org-gnus-store-link)
+(org-link-add "gnus" 'org-gnus-open nil :store 'org-gnus-store-link)
 
 ;; Implementation
 

commit 2255bb886e2aa0026ad72a20a658ea682db47f8f
Author: John Kitchin <jkitchin@andrew.cmu.edu>
Date:   Tue Jul 5 16:06:48 2016 -0400

    change to org-link-add

diff --git a/lisp/org-eshell.el b/lisp/org-eshell.el
index 4782d94..04cc600 100644
--- a/lisp/org-eshell.el
+++ b/lisp/org-eshell.el
@@ -27,8 +27,8 @@
 (require 'eshell)
 (require 'esh-mode)
 
-(org-add-link-type "eshell" 'org-eshell-open nil
-		   :store 'org-eshell-store-link)
+(org-link-add "eshell" 'org-eshell-open nil
+	      :store 'org-eshell-store-link)
 
 (defun org-eshell-open (link)
   "Switch to am eshell buffer and execute a command line.

commit 376737075c6bbcbd3ba70bd93e83882d30e5da80
Author: John Kitchin <jkitchin@andrew.cmu.edu>
Date:   Tue Jul 5 16:06:27 2016 -0400

    change to org-link-add

diff --git a/lisp/org-docview.el b/lisp/org-docview.el
index 3e8f659..6f3dcdd 100644
--- a/lisp/org-docview.el
+++ b/lisp/org-docview.el
@@ -49,7 +49,7 @@
 (declare-function doc-view-goto-page "doc-view" (page))
 (declare-function image-mode-window-get "image-mode" (prop &optional winprops))
 
-(org-add-link-type "docview" 'org-docview-open 'org-docview-export :store 'org-docview-store-link)
+(org-link-add "docview" 'org-docview-open 'org-docview-export :store 'org-docview-store-link)
 
 (defun org-docview-export (link description format)
   "Export a docview link from Org files."

commit 3ad9203d9d944633b0779840057051b017b907c8
Author: John Kitchin <jkitchin@andrew.cmu.edu>
Date:   Tue Jul 5 16:06:04 2016 -0400

    change to org-link-add

diff --git a/lisp/org-bibtex.el b/lisp/org-bibtex.el
index db30510..8fcbbca 100644
--- a/lisp/org-bibtex.el
+++ b/lisp/org-bibtex.el
@@ -452,7 +452,7 @@ With optional argument OPTIONAL, also prompt for optional fields."
 
 \f
 ;;; Bibtex link functions
-(org-add-link-type "bibtex" 'org-bibtex-open nil :store 'org-bibtex-store-link)
+(org-link-add "bibtex" 'org-bibtex-open nil :store 'org-bibtex-store-link)
 
 (defun org-bibtex-open (path)
   "Visit the bibliography entry on PATH."

commit e929c0537fa2862aacc4012957133584bb24f5c7
Author: John Kitchin <jkitchin@andrew.cmu.edu>
Date:   Tue Jul 5 16:05:42 2016 -0400

    change to org-link-add

diff --git a/lisp/org-bbdb.el b/lisp/org-bbdb.el
index 0f90e1e..2241b15 100644
--- a/lisp/org-bbdb.el
+++ b/lisp/org-bbdb.el
@@ -196,9 +196,9 @@ date year)."
 
 
 ;; Install the link type
-(org-add-link-type "bbdb" 'org-bbdb-open 'org-bbdb-export
-		   :complete 'org-bbdb-complete-link
-		   :store 'org-bbdb-store-link)
+(org-link-add "bbdb" 'org-bbdb-open 'org-bbdb-export
+	      :complete 'org-bbdb-complete-link
+	      :store 'org-bbdb-store-link)
 
 ;; Implementation
 (defun org-bbdb-store-link ()

commit a883c04c1c9cd9ae7eeaac485eebebc49204f5d3
Author: John Kitchin <jkitchin@andrew.cmu.edu>
Date:   Tue Jul 5 10:42:49 2016 -0400

    remove copy-sequence
    
    Actually it seems like the let statement is no longer needed. I guess it
    was around to protect the list from extra links getting defined.

diff --git a/testing/lisp/test-ox.el b/testing/lisp/test-ox.el
index 8b07cca..f1acc54 100644
--- a/testing/lisp/test-ox.el
+++ b/testing/lisp/test-ox.el
@@ -2571,7 +2571,7 @@ Para2"
   (should
    (string-match
     "success"
-    (let ((org-link-types (copy-sequence org-link-types)))
+    (let ((org-link-types (org-link-types)))
       (org-add-link-type "foo" nil (lambda (p d f) "success"))
       (org-export-string-as
        "[[foo:path]]"
@@ -2586,7 +2586,7 @@ Para2"
   (should-not
    (string-match
     "success"
-    (let ((org-link-types (copy-sequence org-link-types)))
+    (let ((org-link-types (org-link-types)))
       (org-add-link-type
        "foo" nil (lambda (p d f) (and (eq f 'test) "success")))
       (org-export-string-as
@@ -2603,7 +2603,7 @@ Para2"
   (should-not
    (string-match
     "success"
-    (let ((org-link-types (copy-sequence org-link-types)))
+    (let ((org-link-types (org-link-types)))
       (org-add-link-type
        "foo" nil (lambda (p d f) (and (eq f 'test) "success")))
       (org-export-string-as

commit a863a4b00d72c17c8134eb3670bfea41abb9e21e
Author: John Kitchin <jkitchin@andrew.cmu.edu>
Date:   Tue Jul 5 10:38:42 2016 -0400

    update the contrib manual

diff --git a/contrib/orgmanual.org b/contrib/orgmanual.org
index e48ae97..4346083 100644
--- a/contrib/orgmanual.org
+++ b/contrib/orgmanual.org
@@ -3300,12 +3300,16 @@ can define them in the file with
   ,#+LINK: google    http://www.google.com/search?q=%s
 #+end_src
 
-{{{noindent}}} In-buffer completion (see [[Completion]]) can be used after
-{{{samp([)}}} to complete link abbreviations.  You may also define a
-function ~org-PREFIX-complete-link~ that implements special (e.g.,
-completion) support for inserting such a link with {{{kbd(C-c C-l)}}}.
-Such a function should not accept any arguments, and return the full
-link with prefix.
+{{{noindent}}} In-buffer completion (see [[Completion]]) can be used
+after {{{samp([)}}} to complete link abbreviations.  You may also
+define a function that implements special (e.g., completion) support
+for inserting such a link with {{{kbd(C-c C-l)}}}.  Such a function
+should not accept any arguments, and return the full link with
+prefix. You can set the link completion function like this:
+
+#+BEGIN_SRC emacs-lisp
+(org-link-set-parameter "type" :complete 'some-completion-function)
+#+END_SRC
 
 ** Search options
    :PROPERTIES:
@@ -16998,10 +17002,9 @@ description when the link is later inserted into an Org buffer with
 {{{kbd(C-c C-l)}}}.
 
 When it makes sense for your new link type, you may also define a
-function ~org-PREFIX-complete-link~ that implements special (e.g.,
-completion) support for inserting such a link with {{{kbd(C-c C-l)}}}.
-Such a function should not accept any arguments, and return the full
-link with prefix.
+function that implements special (e.g., completion) support for
+inserting such a link with {{{kbd(C-c C-l)}}}.  Such a function should
+not accept any arguments, and return the full link with prefix.
 
 ** Context-sensitive commands
    :PROPERTIES:
@@ -19181,8 +19184,8 @@ from the list of stored links.  To keep it in the list later use, use a
 triple {{{kbd(C-u)}}} prefix argument to {{{kbd(C-c C-l)}}}, or
 configure the option ~org-keep-stored-link-after-insertion~.
 
-[fn:37] This works by calling a special function
-~org-PREFIX-complete-link~.
+[fn:37] This works if a function has been defined in the :complete
+property of a link in org-link-parameters.
 
 [fn:38] See the variable ~org-display-internal-link-with-indirect-buffer~.
 

commit 160c24daf99ef33b71cc0ef22604d1063f3617e0
Author: John Kitchin <jkitchin@andrew.cmu.edu>
Date:   Tue Jul 5 10:31:30 2016 -0400

    update NEWS with link announcement

diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS
index 9909910..6ff7442 100644
--- a/etc/ORG-NEWS
+++ b/etc/ORG-NEWS
@@ -353,6 +353,8 @@ first footnote.
 *** The ~org-block~ face is inherited by ~src-blocks~
 This works also when =org-src-fontify-natively= is non-nil.  It is also
 possible to specify per-languages faces.  See the manual for details.
+*** Links are now customizable
+Links can now have custom colors, tooltips, keymaps, display behavior, etc... Links are now centralized in ~org-link-parameters~.
 ** New functions
 *** ~org-next-line-empty-p~
 It replaces the deprecated ~next~ argument to ~org-previous-line-empty-p~.

commit c922ab8b2d19d265f8183a5b0d36adb9b61087ce
Author: John Kitchin <jkitchin@andrew.cmu.edu>
Date:   Tue Jul 5 10:30:48 2016 -0400

    replace an org-link-types variable with function

diff --git a/lisp/org-element.el b/lisp/org-element.el
index 21a7e86..9452641 100644
--- a/lisp/org-element.el
+++ b/lisp/org-element.el
@@ -185,7 +185,7 @@ specially in `org-element--object-lex'.")
 		"\\)\\)")
 	org-element--object-regexp
 	(mapconcat #'identity
-		   (let ((link-types (regexp-opt org-link-types)))
+		   (let ((link-types (regexp-opt (org-link-types))))
 		     (list
 		      ;; Sub/superscript.
 		      "\\(?:[_^][-{(*+.,[:alnum:]]\\)"

commit 34eece2527c5fa3e5864d037a3f5df07a44b0f33
Author: John Kitchin <jkitchin@andrew.cmu.edu>
Date:   Tue Jul 5 10:29:07 2016 -0400

    update the texinfo for link parameters documentation.

diff --git a/doc/org.texi b/doc/org.texi
index e92788f..aa552fc 100644
--- a/doc/org.texi
+++ b/doc/org.texi
@@ -3711,11 +3711,11 @@ them with @key{up} and @key{down} (or @kbd{M-p/n}).
 valid link prefixes like @samp{http:} or @samp{ftp:}, including the prefixes
 defined through link abbreviations (@pxref{Link abbreviations}).  If you
 press @key{RET} after inserting only the @var{prefix}, Org will offer
-specific completion support for some link types@footnote{This works by
-calling a special function @code{org-PREFIX-complete-link}.}  For
-example, if you type @kbd{file @key{RET}}, file name completion (alternative
-access: @kbd{C-u C-c C-l}, see below) will be offered, and after @kbd{bbdb
-@key{RET}} you can complete contact names.
+specific completion support for some link types@footnote{This works if a
+completion function is defined in the :complete property of a link in
+@var{org-link-parameters}.}  For example, if you type @kbd{file @key{RET}},
+file name completion (alternative access: @kbd{C-u C-c C-l}, see below) will
+be offered, and after @kbd{bbdb @key{RET}} you can complete contact names.
 @orgkey C-u C-c C-l
 @cindex file name completion
 @cindex completion, of file names
@@ -3887,10 +3887,13 @@ can define them in the file with
 
 @noindent
 In-buffer completion (@pxref{Completion}) can be used after @samp{[} to
-complete link abbreviations.  You may also define a function
-@code{org-PREFIX-complete-link} that implements special (e.g., completion)
-support for inserting such a link with @kbd{C-c C-l}.  Such a function should
-not accept any arguments, and return the full link with prefix.
+complete link abbreviations.  You may also define a function that implements
+special (e.g., completion) support for inserting such a link with @kbd{C-c
+C-l}.  Such a function should not accept any arguments, and return the full
+link with prefix. You can add a completion function to a link like this:
+
+@code{(org-link-set-parameters ``type'' :complete 'some-function)}
+
 
 @node Search options
 @section Search options in file links
@@ -18005,9 +18008,9 @@ the link description when the link is later inserted into an Org
 buffer with @kbd{C-c C-l}.
 
 When it makes sense for your new link type, you may also define a function
-@code{org-PREFIX-complete-link} that implements special (e.g., completion)
-support for inserting such a link with @kbd{C-c C-l}.  Such a function should
-not accept any arguments, and return the full link with prefix.
+that implements special (e.g., completion) support for inserting such a link
+with @kbd{C-c C-l}.  Such a function should not accept any arguments, and
+return the full link with prefix.
 
 @node Adding export back-ends
 @section Adding export back-ends

commit 75fa053296d8b4bbb8e7edeb9b7e077eb8ed37f1
Author: John Kitchin <jkitchin@andrew.cmu.edu>
Date:   Tue Jul 5 10:28:38 2016 -0400

    update w3m link

diff --git a/lisp/org-w3m.el b/lisp/org-w3m.el
index 57ecafe..97b9841 100644
--- a/lisp/org-w3m.el
+++ b/lisp/org-w3m.el
@@ -46,7 +46,7 @@
 (defvar w3m-current-url)
 (defvar w3m-current-title)
 
-(add-hook 'org-store-link-functions 'org-w3m-store-link)
+(org-link-set-parameters "w3m" :store 'org-w3m-store-link)
 (defun org-w3m-store-link ()
   "Store a link to a w3m buffer."
   (when (eq major-mode 'w3m-mode)

commit c41dcddfa8ba848d4e911282bc5760a4e4b953ff
Author: John Kitchin <jkitchin@andrew.cmu.edu>
Date:   Tue Jul 5 10:28:09 2016 -0400

    update rmail link definition

diff --git a/lisp/org-rmail.el b/lisp/org-rmail.el
index 0bf44b8..9eff516 100644
--- a/lisp/org-rmail.el
+++ b/lisp/org-rmail.el
@@ -43,8 +43,7 @@
 (defvar rmail-file-name)        ; From rmail.el
 
 ;; Install the link type
-(org-add-link-type "rmail" 'org-rmail-open)
-(add-hook 'org-store-link-functions 'org-rmail-store-link)
+(org-add-link-type "rmail" 'org-rmail-open nil :store 'org-rmail-store-link)
 
 ;; Implementation
 (defun org-rmail-store-link ()

commit 86221a71daa897d94cb8ca7aa4f63f0b4e897477
Author: John Kitchin <jkitchin@andrew.cmu.edu>
Date:   Tue Jul 5 10:27:55 2016 -0400

    update mhe link definition.

diff --git a/lisp/org-mhe.el b/lisp/org-mhe.el
index 2ee21de..ca8b68d 100644
--- a/lisp/org-mhe.el
+++ b/lisp/org-mhe.el
@@ -74,8 +74,7 @@ supported by MH-E."
 (defvar mh-search-regexp-builder)
 
 ;; Install the link type
-(org-add-link-type "mhe" 'org-mhe-open)
-(add-hook 'org-store-link-functions 'org-mhe-store-link)
+(org-add-link-type "mhe" 'org-mhe-open nil :store 'org-mhe-store-link)
 
 ;; Implementation
 (defun org-mhe-store-link ()

commit fc6accee74dd61dc58cab3e5d70fbf411faedb74
Author: John Kitchin <jkitchin@andrew.cmu.edu>
Date:   Tue Jul 5 10:27:45 2016 -0400

    update irc link definition

diff --git a/lisp/org-irc.el b/lisp/org-irc.el
index 81d0296..4996d60 100644
--- a/lisp/org-irc.el
+++ b/lisp/org-irc.el
@@ -71,9 +71,7 @@
 
 ;; Generic functions/config (extend these for other clients)
 
-(add-to-list 'org-store-link-functions 'org-irc-store-link)
-
-(org-add-link-type "irc" 'org-irc-visit nil)
+(org-add-link-type "irc" 'org-irc-visit nil :store 'org-irc-store-link)
 
 (defun org-irc-visit (link)
   "Parse LINK and dispatch to the correct function based on the client found."

commit 6e7d024b316fb8c9f1ebf37421a50917ac69aa15
Author: John Kitchin <jkitchin@andrew.cmu.edu>
Date:   Tue Jul 5 10:27:32 2016 -0400

    update info link definition

diff --git a/lisp/org-info.el b/lisp/org-info.el
index 9e8fde0..d9e9b07 100644
--- a/lisp/org-info.el
+++ b/lisp/org-info.el
@@ -40,8 +40,7 @@
 (defvar Info-current-node)
 
 ;; Install the link type
-(org-add-link-type "info" 'org-info-open 'org-info-export)
-(add-hook 'org-store-link-functions 'org-info-store-link)
+(org-add-link-type "info" 'org-info-open 'org-info-export :store 'org-info-store-link)
 
 ;; Implementation
 (defun org-info-store-link ()

commit 898abadf1decbf730a679ba34f5b26a37f52bcf5
Author: John Kitchin <jkitchin@andrew.cmu.edu>
Date:   Tue Jul 5 10:27:14 2016 -0400

    update gnus link definition

diff --git a/lisp/org-gnus.el b/lisp/org-gnus.el
index 386d6dc..271f480 100644
--- a/lisp/org-gnus.el
+++ b/lisp/org-gnus.el
@@ -74,8 +74,7 @@ this variable to t."
   :type 'boolean)
 
 ;; Install the link type
-(org-add-link-type "gnus" 'org-gnus-open)
-(add-hook 'org-store-link-functions 'org-gnus-store-link)
+(org-add-link-type "gnus" 'org-gnus-open nil :store 'org-gnus-store-link)
 
 ;; Implementation
 

commit 917114bd4968f7ff8e653950af194a70d625c849
Author: John Kitchin <jkitchin@andrew.cmu.edu>
Date:   Tue Jul 5 10:27:03 2016 -0400

    update eshell link definition

diff --git a/lisp/org-eshell.el b/lisp/org-eshell.el
index 1919f6d..4782d94 100644
--- a/lisp/org-eshell.el
+++ b/lisp/org-eshell.el
@@ -27,8 +27,8 @@
 (require 'eshell)
 (require 'esh-mode)
 
-(org-add-link-type "eshell" 'org-eshell-open)
-(add-hook 'org-store-link-functions 'org-eshell-store-link)
+(org-add-link-type "eshell" 'org-eshell-open nil
+		   :store 'org-eshell-store-link)
 
 (defun org-eshell-open (link)
   "Switch to am eshell buffer and execute a command line.

commit 626682724311ca54292a34f2b9a4b8aa519c6fe8
Author: John Kitchin <jkitchin@andrew.cmu.edu>
Date:   Tue Jul 5 10:26:28 2016 -0400

    Update docview link definition

diff --git a/lisp/org-docview.el b/lisp/org-docview.el
index fbc5551..3e8f659 100644
--- a/lisp/org-docview.el
+++ b/lisp/org-docview.el
@@ -49,8 +49,7 @@
 (declare-function doc-view-goto-page "doc-view" (page))
 (declare-function image-mode-window-get "image-mode" (prop &optional winprops))
 
-(org-add-link-type "docview" 'org-docview-open 'org-docview-export)
-(add-hook 'org-store-link-functions 'org-docview-store-link)
+(org-add-link-type "docview" 'org-docview-open 'org-docview-export :store 'org-docview-store-link)
 
 (defun org-docview-export (link description format)
   "Export a docview link from Org files."

commit 2f32ebf222c6d1e391358d6146ebc6f21a4bf095
Author: John Kitchin <jkitchin@andrew.cmu.edu>
Date:   Tue Jul 5 10:26:04 2016 -0400

    update bibtex link definition.
    
    * lisp/org-bibtex.el ("bibtex"):

diff --git a/lisp/org-bibtex.el b/lisp/org-bibtex.el
index 74e32f7..db30510 100644
--- a/lisp/org-bibtex.el
+++ b/lisp/org-bibtex.el
@@ -452,8 +452,7 @@ With optional argument OPTIONAL, also prompt for optional fields."
 
 \f
 ;;; Bibtex link functions
-(org-add-link-type "bibtex" 'org-bibtex-open)
-(add-hook 'org-store-link-functions 'org-bibtex-store-link)
+(org-add-link-type "bibtex" 'org-bibtex-open nil :store 'org-bibtex-store-link)
 
 (defun org-bibtex-open (path)
   "Visit the bibliography entry on PATH."

commit 776f20bfc5afd744c6318f9d66ced055c02a88c5
Author: John Kitchin <jkitchin@andrew.cmu.edu>
Date:   Tue Jul 5 10:25:39 2016 -0400

    update bbdb link definition.
    
    * lisp/org-bbdb.el ("bbdb"):

diff --git a/lisp/org-bbdb.el b/lisp/org-bbdb.el
index 8d886cd..0f90e1e 100644
--- a/lisp/org-bbdb.el
+++ b/lisp/org-bbdb.el
@@ -196,8 +196,9 @@ date year)."
 
 
 ;; Install the link type
-(org-add-link-type "bbdb" 'org-bbdb-open 'org-bbdb-export)
-(add-hook 'org-store-link-functions 'org-bbdb-store-link)
+(org-add-link-type "bbdb" 'org-bbdb-open 'org-bbdb-export
+		   :complete 'org-bbdb-complete-link
+		   :store 'org-bbdb-store-link)
 
 ;; Implementation
 (defun org-bbdb-store-link ()

commit 5a296333a30e3880e5f551eb82c8b0219447e793
Author: John Kitchin <jkitchin@andrew.cmu.edu>
Date:   Tue Jul 5 10:24:01 2016 -0400

    add activate-func
    
    * lisp/org.el (org-activate-bracket-links):
    This should have been in the previous commit on this function.

diff --git a/lisp/org.el b/lisp/org.el
index 0f345a8..3e80243 100644
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -6251,6 +6251,8 @@ by a #."
 	(org-rear-nonsticky-at (match-end 1))
 	(add-text-properties (match-end 1) (match-end 0) ip)
 	(org-rear-nonsticky-at (match-end 0)))
+      (when activate-func
+	(funcall activate-func link-start link-end path bracketp))
       t)))
 
 (defun org-activate-dates (limit)

commit c306e89aa41b8f84107dc60957540e3eaa85d009
Author: John Kitchin <jkitchin@andrew.cmu.edu>
Date:   Tue Jul 5 10:23:27 2016 -0400

    replace org-link-protocols with the link export parameter.

diff --git a/lisp/ox.el b/lisp/ox.el
index da985f3..0b749e8 100644
--- a/lisp/ox.el
+++ b/lisp/ox.el
@@ -4116,7 +4116,7 @@ The function ignores links with an implicit type (e.g.,
   (let ((type (org-element-property :type link)))
     (unless (or (member type '("coderef" "custom-id" "fuzzy" "radio"))
 		(not backend))
-      (let ((protocol (nth 2 (assoc type org-link-protocols))))
+      (let ((protocol (org-link-get-parameter type :export)))
 	(and (functionp protocol)
 	     (funcall protocol
 		      (org-link-unescape (org-element-property :path link))

commit 50d93f950f68587bad239b8fa26741f8b44675d8
Author: John Kitchin <jkitchin@andrew.cmu.edu>
Date:   Tue Jul 5 10:22:24 2016 -0400

    Make plain and bracketed link properties stick
    
    * lisp/org.el (org-set-font-lock-defaults): If t is after the face, than
      org-link clobbers everything from the activation functions.

diff --git a/lisp/org.el b/lisp/org.el
index d6699ff..0f345a8 100644
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -6522,8 +6522,8 @@ needs to be inserted at a specific position in the font-lock sequence.")
 	   ;; Links
 	   (when (memq 'tag lk) '(org-activate-tags (1 'org-tag prepend)))
 	   (when (memq 'angle lk) '(org-activate-angle-links (0 'org-link t)))
-	   (when (memq 'plain lk) '(org-activate-plain-links (0 'org-link t)))
-	   (when (memq 'bracket lk) '(org-activate-bracket-links (0 'org-link t)))
+	   (when (memq 'plain lk) '(org-activate-plain-links (0 'org-link)))
+	   (when (memq 'bracket lk) '(org-activate-bracket-links (0 'org-link)))
 	   (when (memq 'radio lk) '(org-activate-target-links (1 'org-link t)))
 	   (when (memq 'date lk) '(org-activate-dates (0 'org-date t)))
 	   (when (memq 'footnote lk) '(org-activate-footnote-links))

commit 70cd41305abdce2f5deb458cea6b493d6c850e3c
Author: John Kitchin <jkitchin@andrew.cmu.edu>
Date:   Tue Jul 5 10:21:50 2016 -0400

    Update org-activate-bracket-links
    
    * lisp/org.el (org-activate-bracket-links): Use org-link-parameters to
      build link properties.

diff --git a/lisp/org.el b/lisp/org.el
index 21122b7..d6699ff 100644
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -6155,14 +6155,83 @@ by a #."
   (when (and (re-search-forward org-bracket-link-regexp limit t)
 	     (not (org-in-src-block-p)))
     (let* ((hl (match-string-no-properties 1))
-	   (help (concat "LINK: " (save-match-data (org-link-unescape hl))))
-	   (ip (list 'invisible 'org-link
-		     'keymap org-mouse-map 'mouse-face 'highlight
-		     'font-lock-multiline t 'help-echo help
-		     'htmlize-link `(:uri ,hl)))
-	   (vp (list 'keymap org-mouse-map 'mouse-face 'highlight
-		     'font-lock-multiline t 'help-echo help
-		     'htmlize-link `(:uri ,hl))))
+	   (type (save-match-data
+		   (if (string-match org-plain-link-re hl)
+		       (match-string-no-properties 1 hl)
+		     nil)))
+	   (path (save-match-data
+		   (if (string-match org-plain-link-re hl)
+		       (match-string-no-properties 2 hl)
+		     nil)))
+	   (link-start (match-beginning 0))
+	   (link-end (match-end 0))
+	   (bracketp t)
+	   (help-echo (org-link-get-parameter type :help-echo))
+	   (help (cond
+		  ((stringp help-echo)
+		   help-echo)
+		  ((functionp help-echo)
+		   help-echo)
+		  (t
+		   (concat "LINK: "
+			   (save-match-data
+			     (org-link-unescape hl))))))
+	   (link-face (org-link-get-parameter type :face))
+	   (htmlize-link (org-link-get-parameter type :htmlize-link))
+	   (activate-func (org-link-get-parameter type :activate-func))
+	   ;; invisible part
+	   (ip (list 'invisible (or
+				 (org-link-get-parameter type :display)
+				 'org-link)
+		     'face (cond
+			    ;; A function that returns a face
+			    ((functionp link-face)
+			     (funcall link-face path))
+			    ;; a face
+			    ((facep link-face)
+			     link-face)
+			    ;; An anonymous face
+			    ((listp link-face)
+			     link-face)
+			    ;; default
+			    (t
+			     'org-link))
+		     'keymap (or (org-link-get-parameter type :keymap)
+				 org-mouse-map)
+		     'mouse-face (or (org-link-get-parameter type :mouse-face)
+				     'highlight)
+		     'font-lock-multiline t
+		     'help-echo help
+		     'htmlize-link (cond
+				    ((functionp htmlize-link)
+				     (funcall htmlize-link))
+				    (t
+				     `(:uri ,(format "%s:%s" type path))))))
+	   ;; visible part
+	   (vp (list 'keymap (or (org-link-get-parameter type :keymap)
+				 org-mouse-map)
+		     'face (cond
+			    ;; A function that returns a face
+			    ((functionp link-face)
+			     (funcall link-face path))
+			    ;; a face
+			    ((facep link-face)
+			     link-face)
+			    ;; An anonymous face
+			    ((listp link-face)
+			     link-face)
+			    ;; default
+			    (t
+			     'org-link))
+		     'mouse-face (or (org-link-get-parameter type :mouse-face)
+				     'highlight)
+		     'font-lock-multiline t
+		     'help-echo help
+		     'htmlize-link (cond
+				    ((functionp htmlize-link)
+				     (funcall htmlize-link))
+				    (t
+				     `(:uri ,(format "%s:%s" type path)))))))
       ;; We need to remove the invisible property here.  Table narrowing
       ;; may have made some of this invisible.
       (org-remove-flyspell-overlays-in (match-beginning 0) (match-end 0))

commit d2d39fc4ea24e17dd24c0bc78b4ef1cc14ef8258
Author: John Kitchin <jkitchin@andrew.cmu.edu>
Date:   Tue Jul 5 10:21:08 2016 -0400

    update org-activate-plain-links
    
    * lisp/org.el (org-activate-plain-links): Use org-link-parameters to
      create the link properties.

diff --git a/lisp/org.el b/lisp/org.el
index 6dfd089..21122b7 100644
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -5917,17 +5917,55 @@ prompted for."
   "Add link properties for plain links."
   (when (and (re-search-forward org-plain-link-re limit t)
 	     (not (org-in-src-block-p)))
-    (let ((face (get-text-property (max (1- (match-beginning 0)) (point-min))
-				   'face))
-	  (link (match-string-no-properties 0)))
+
+    (let* ((face (get-text-property (max (1- (match-beginning 0)) (point-min))
+				    'face))
+	   (link (match-string-no-properties 0))
+	   (type (match-string-no-properties 1))
+	   (path (match-string-no-properties 2))
+	   (link-face (org-link-get-parameter type :face))
+	   (help-echo (org-link-get-parameter type :help-echo))	   
+	   (htmlize-link (org-link-get-parameter type :htmlize-link))
+	   (activate-func (org-link-get-parameter type :activate-func)))
       (unless (if (consp face) (memq 'org-tag face) (eq 'org-tag face))
 	(org-remove-flyspell-overlays-in (match-beginning 0) (match-end 0))
 	(add-text-properties (match-beginning 0) (match-end 0)
-			     (list 'mouse-face 'highlight
-				   'face 'org-link
-				   'htmlize-link `(:uri ,link)
-				   'keymap org-mouse-map))
+			     (list
+			      'mouse-face (or (org-link-get-parameter type :mouse-face)
+					      'highlight)
+			      'face (cond
+				     ;; A function that returns a face
+				     ((functionp link-face)
+				      (funcall link-face path))
+				     ;; a face
+				     ((facep link-face)
+				      link-face)
+				     ;; An anonymous face
+				     ((listp link-face)
+				      link-face)
+				     ;; default
+				     (t
+				      'org-link))
+			      'help-echo (cond
+					  ((stringp help-echo)
+					   help-echo)
+					  ((functionp help-echo)
+					   help-echo)
+					  (t
+					   (concat "LINK: "
+						   (save-match-data
+						     (org-link-unescape link)))))
+			      'htmlize-link (cond
+					     ((functionp htmlize-link)
+					      (funcall htmlize-link path))
+					     (t
+					      `(:uri ,link)))
+			      'keymap (or (org-link-get-parameter type :keymap)
+					  org-mouse-map)
+			      'org-link-start (match-beginning 0)))
 	(org-rear-nonsticky-at (match-end 0))
+	(when activate-func
+	  (funcall activate-func link-start link-end path nil))
 	t))))
 
 (defun org-activate-code (limit)

commit 66ad0a6d2c79ac0424f8424b875d707e36fe11d2
Author: John Kitchin <jkitchin@andrew.cmu.edu>
Date:   Tue Jul 5 10:20:23 2016 -0400

    get complete function from org-link-parameters.

diff --git a/lisp/org.el b/lisp/org.el
index f9e5487..6dfd089 100644
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -10522,7 +10522,12 @@ Use TAB to complete link prefixes, then RET for type-specific completion support
 
 (defun org-link-try-special-completion (type)
   "If there is completion support for link type TYPE, offer it."
-  (let ((fun (intern (concat "org-" type "-complete-link"))))
+  (let ((fun (or (org-link-get-parameter type :complete)
+		 ;; We still honor the "org-type-complete-link
+		 ;; form. There are some built in links like
+		 ;; org-file-complete-link that don't fit nicely into
+		 ;; org-link-parameters.
+		 (intern (concat "org-" type "-complete-link")))))
     (if (functionp fun)
 	(funcall fun)
       (read-string "Link (no completion support): " (concat type ":")))))

commit 251b574b8669d3ed685542eec03c89336c0c91c5
Author: John Kitchin <jkitchin@andrew.cmu.edu>
Date:   Tue Jul 5 10:19:52 2016 -0400

    Replace org-store-link-functions variable with function

diff --git a/lisp/org.el b/lisp/org.el
index 59d6c63..f9e5487 100644
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -9857,7 +9857,7 @@ active region."
 		    (delq
 		     nil (mapcar (lambda (f)
 				   (let (fs) (if (funcall f) (push f fs))))
-				 org-store-link-functions))
+				 (org-store-link-functions)))
 		    sfunsn (mapcar (lambda (fu) (symbol-name (car fu))) sfuns))
 	      (or (and (cdr sfuns)
 		       (funcall (intern

commit c8580dd27d0f71649a938c56357b471f58b2aa97
Author: John Kitchin <jkitchin@andrew.cmu.edu>
Date:   Tue Jul 5 10:18:57 2016 -0400

    Update org-add-link-type
    
    * lisp/org.el org-add-link-type: Now accepts keyword arguments for link parameters.

diff --git a/lisp/org.el b/lisp/org.el
index 0aa29d2..59d6c63 100644
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -9739,10 +9739,10 @@ Special properties are:
 In addition to these, any additional properties can be specified
 and then used in capture templates.")
 
-(defun org-add-link-type (type &optional follow export)
-  "Add TYPE to the list of `org-link-types'.
-Re-compute all regular expressions depending on `org-link-types'
-
+(cl-defun org-add-link-type (type &optional follow export
+				  &key store complete face mouse-face display
+				  help-echo keymap htmlize-link activate-func)
+  "Add a new TYPE link.
 FOLLOW and EXPORT are two functions.
 
 FOLLOW should take the link path as the single argument and do whatever
@@ -9763,13 +9763,56 @@ do what it normally does with links which do not have EXPORT defined.
 
 Org mode has a built-in default for exporting links.  If you are happy with
 this default, there is no need to define an export function for the link
-type.  For a simple example of an export function, see `org-bbdb.el'."
-  (add-to-list 'org-link-types type t)
+type.  For a simple example of an export function, see `org-bbdb.el'.
+
+If TYPE already exists, update it with the arguments.
+See `org-link-parameters' for documentation on the other parameters."
+  (if (assoc type org-link-parameters)
+      (org-link-set-parameters
+       type :follow follow :export export :store store
+       :complete complete :face face :mouse-face mouse-face
+       :display display :help-echo help-echo :keymap keymap
+       :htmlize-link htmlize-link :activate-func activate-func)
+    ;; Add new link
+    (push (list type :follow follow :export export :store store
+		:complete complete :face face :mouse-face mouse-face
+		:display display :help-echo help-echo :keymap keymap
+		:htmlize-link htmlize-link :activate-func activate-func)
+	  org-link-parameters))
   (org-make-link-regexps)
   (org-element-update-syntax)
-  (if (assoc type org-link-protocols)
-      (setcdr (assoc type org-link-protocols) (list follow export))
-    (push (list type follow export) org-link-protocols)))
+  (message "Created %s link." type))
+
+  (defun org-store-link-functions ()
+    "Returns a list of functions that are called to create and store a link.
+The functions in the variable `org-store-link-functions' come
+first. These may be user-defined for different contexts. Then
+comes the functions defined in the :store property of
+org-link-parameters.
+
+Each function will be called in turn until one returns a non-nil
+value. Each function should check if it is responsible for
+creating this link (for example by looking at the major mode). If
+not, it must exit and return nil. If yes, it should return a
+non-nil value after a calling `org-store-link-props' with a list
+of properties and values. Special properties are:
+
+:type         The link prefix, like \"http\".  This must be given.
+:link         The link, like \"http://www.astro.uva.nl/~dominik\".
+              This is obligatory as well.
+:description  Optional default description for the second pair
+              of brackets in an Org-mode link.  The user can still change
+              this when inserting this link into an Org-mode buffer.
+
+In addition to these, any additional properties can be specified
+and then used in capture templates."
+    (append
+     org-store-link-functions
+     (cl-loop for link in org-link-parameters
+	      with store-func
+	      do (setq store-func (org-link-get-parameter (car link) :store))
+	      if store-func
+	      collect store-func)))
 
 (defvar org-agenda-buffer-name) ; Defined in org-agenda.el
 (defvar org-id-link-to-org-use-id) ; Defined in org-id.el

commit 763a0a8cb636bccf6a0211447d287296cd624ccb
Author: John Kitchin <jkitchin@andrew.cmu.edu>
Date:   Tue Jul 5 10:16:38 2016 -0400

    Remove org-link-protocols
    
    The data in this variable is now retrieved with org-link-get-parameter.

diff --git a/lisp/org.el b/lisp/org.el
index 55c9b01..0aa29d2 100644
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -9719,9 +9719,6 @@ The refresh happens only for the current tree (not subtree)."
 (defvar org-store-link-plist nil
   "Plist with info about the most recently link created with `org-store-link'.")
 
-(defvar org-link-protocols nil
-  "Link protocols added to Org-mode using `org-add-link-type'.")
-
 (defvar org-store-link-functions nil
   "List of functions that are called to create and store a link.
 Each function will be called in turn until one returns a non-nil
@@ -10760,7 +10757,7 @@ link in a property drawer line."
 	       ((equal type "file")
 		(if (string-match "[*?{]" (file-name-nondirectory path))
 		    (dired path)
-		  ;; Look into `org-link-protocols' in order to find
+		  ;; Look into `org-link-parameters' in order to find
 		  ;; a DEDICATED-FUNCTION to open file.  The function
 		  ;; will be applied on raw link instead of parsed
 		  ;; link due to the limitation in `org-add-link-type'
@@ -10774,7 +10771,7 @@ link in a property drawer line."
 		  (let* ((option (org-element-property :search-option link))
 			 (app (org-element-property :application link))
 			 (dedicated-function
-			  (nth 1 (assoc app org-link-protocols))))
+			  (org-link-get-parameter type :follow)))
 		    (if dedicated-function
 			(funcall dedicated-function
 				 (concat path
@@ -10789,8 +10786,8 @@ link in a property drawer line."
 				    (list (string-to-number option)))
 				   (t (list nil
 					    (org-link-unescape option)))))))))
-	       ((assoc type org-link-protocols)
-		(funcall (nth 1 (assoc type org-link-protocols)) path))
+	       ((assoc type org-link-parameters)
+		(funcall (org-link-get-parameter type :follow) path))
 	       ((equal type "help")
 		(let ((f-or-v (intern path)))
 		  (cond ((fboundp f-or-v) (describe-function f-or-v))
@@ -10839,7 +10836,7 @@ link in a property drawer line."
 		    (user-error "Abort"))))
 	       ((equal type "id")
 		(require 'org-id)
-		(funcall (nth 1 (assoc "id" org-link-protocols)) path))
+		(funcall (org-link-get-parameter type :follow) path))
 	       ((member type '("coderef" "custom-id" "fuzzy" "radio"))
 		(unless (run-hook-with-args-until-success
 			 'org-open-link-functions path)

commit 91d90b6bef8fac0a94efdf915561a03e75526b11
Author: John Kitchin <jkitchin@andrew.cmu.edu>
Date:   Tue Jul 5 10:13:17 2016 -0400

    Replace org-link-types with function
    
    * lisp/org.el: The variable was replaced with the function everywhere.

diff --git a/lisp/org-element.el b/lisp/org-element.el
index 269bc7d..21a7e86 100644
--- a/lisp/org-element.el
+++ b/lisp/org-element.el
@@ -3108,7 +3108,7 @@ Assume point is at the beginning of the link."
 	      (string-match "\\`\\.\\.?/" raw-link))
 	  (setq type "file")
 	  (setq path raw-link))
-	 ;; Explicit type (http, irc, bbdb...).  See `org-link-types'.
+	 ;; Explicit type (http, irc, bbdb...).  
 	 ((string-match org-link-types-re raw-link)
 	  (setq type (match-string 1 raw-link))
 	  (setq path (substring raw-link (match-end 0))))
diff --git a/lisp/org.el b/lisp/org.el
index 8300f8f..55c9b01 100644
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -5780,8 +5780,8 @@ stacked delimiters is N.  Escaping delimiters is not possible."
 
 (defun org-make-link-regexps ()
   "Update the link regular expressions.
-This should be called after the variable `org-link-types' has changed."
-  (let ((types-re (regexp-opt org-link-types t)))
+This should be called after the variable `org-link-parameters' has changed."
+  (let ((types-re (regexp-opt (org-link-types) t)))
     (setq org-link-types-re
 	  (concat "\\`" types-re ":")
 	  org-link-re-with-space
@@ -5819,7 +5819,7 @@ This should be called after the variable `org-link-types' has changed."
 	  org-bracket-link-analytic-regexp++
 	  (concat
 	   "\\[\\["
-	   "\\(" (regexp-opt (cons "coderef" org-link-types) t) ":\\)?"
+	   "\\(" (regexp-opt (cons "coderef" (org-link-types)) t) ":\\)?"
 	   "\\([^]]+\\)"
 	   "\\]"
 	   "\\(\\[" "\\([^]]+\\)" "\\]\\)?"
@@ -10378,7 +10378,7 @@ Use TAB to complete link prefixes, then RET for type-specific completion support
 	(and (window-live-p cw) (select-window cw)))
       (setq all-prefixes (append (mapcar 'car abbrevs)
 				 (mapcar 'car org-link-abbrev-alist)
-				 org-link-types))
+				 (org-link-types)))
       (unwind-protect
 	  ;; Fake a link history, containing the stored links.
 	  (let ((org--links-history

commit 31f6309dd86344b03f3e58263d05ee2ec688c995
Author: John Kitchin <jkitchin@andrew.cmu.edu>
Date:   Tue Jul 5 10:08:14 2016 -0400

    Add org-link-parameters
    
    * lisp/org.el (org-link-parameters): Add new centralized link variable.
    
    (org-link-get-parameter): A getter function to get link parameters
    
    (org-link-set-parameters): A setter function to set link parameters
    
    (org-link-types): A function to return a list of link types.

diff --git a/lisp/org.el b/lisp/org.el
index 6dd7f91..8300f8f 100644
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -1758,6 +1758,62 @@ calls `table-recognize-table'."
   "Buffer-local version of `org-link-abbrev-alist', which see.
 The value of this is taken from the #+LINK lines.")
 
+(defcustom org-link-parameters
+  '(("http") ("https") ("ftp") ("mailto")
+    ("file") ("file+emacs") ("file+sys")
+    ("news") ("shell") ("elisp")
+    ("doi") ("message") ("help"))
+  "An alist of properties that defines all the links in org-mode.
+The first key in each list is a string of the link type.
+Subsequent optional elements make up a p-list of link properties.
+  :follow - a function that takes the link path as an argument
+  :export - a function that takes the link path, description and
+     export-backend as arguments
+  :store - a function responsible for storing the link. See the variable `org-store-link-functions'.
+  :complete - a function that inserts a link with completion. The function takes one optional
+    prefix arg.
+  :face - a face for the link, or a function that returns a face. The function takes one argument which is the link path. The default face is `org-link'.
+  :mouse-face - The mouse-face. The default is `highlight'.
+  :display - `full' will not fold the link in descriptive display. Default is `org-link'.
+  :help-echo - A string or function that takes (window object position) as args and
+    returns a string.
+  :keymap - A keymap that is active on the link. The default is `org-mouse-map'.
+  :htmlize-link - a function for the htmlize-link. Defaults to (list :uri \"type:path\")
+  :activate-func - a function to run at the end of font-lock activation. The function must accept 
+(link-start link-end path bracketp) as arguments."
+  :group 'org-link
+  :type '(alist :tag "Link display paramters"
+		:type string
+		:follow :export :store :completion :face :mouse-face
+		:display :help-echo :keymap :htmlize-link :activate-func))
+
+(defun org-link-get-parameter (type key)
+  "Get TYPE link property for KEY."
+  (cl-getf
+   (cdr (assoc type org-link-parameters))
+   key))
+
+(defun org-link-set-parameters (type &rest parameters)
+  "Set link TYPE properties to PARAMETERS.
+PARAMETERS should be :key val pairs."
+  (if (cdr (assoc type org-link-parameters))
+      ;; update old link
+      (cl-loop for (key val) on parameters by #'cddr
+	       do
+	       (setf (cl-getf
+		      (cdr (assoc type org-link-parameters))
+		      key)
+		     val))
+    ;; add new one.
+    (push `(,type ,@parameters) org-link-parameters)
+    (org-make-link-regexps)
+    (org-element-update-syntax))
+  org-link-parameters)
+
+(defun org-link-types ()
+  "Returns a list of known link types."
+  (mapcar 'car org-link-parameters))
+
 (defcustom org-link-abbrev-alist nil
   "Alist of link abbreviations.
 The car of each element is a string, to be replaced at the start of a link.

commit 8b8f65f4314fa9eb08bc5bd7c23dcf32f456f57d
Author: John Kitchin <jkitchin@andrew.cmu.edu>
Date:   Tue Jul 5 10:07:10 2016 -0400

    Remove org-link-types
    
    * lisp/org.el (org-link-types): Remove this variable.

diff --git a/lisp/org.el b/lisp/org.el
index 2202d41..6dd7f91 100644
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -5658,9 +5658,6 @@ the rounding returns a past time."
 (require 'font-lock)
 
 (defconst org-non-link-chars "]\t\n\r<>")
-(defvar org-link-types '("http" "https" "ftp" "mailto" "file" "file+emacs"
-			 "file+sys" "news" "shell" "elisp" "doi" "message"
-			 "help"))
 (defvar org-link-types-re nil
   "Matches a link that has a url-like prefix like \"http:\"")
 (defvar org-link-re-with-space nil


-- 
Professor John Kitchin
Doherty Hall A207F
Department of Chemical Engineering
Carnegie Mellon University
Pittsburgh, PA 15213
412-268-7803
@johnkitchin
http://kitchingroup.cheme.cmu.edu

  parent reply	other threads:[~2016-07-05 20:31 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-07-05 14:50 Draft of links-9.0 John Kitchin
2016-07-05 19:12 ` Nicolas Goaziou
2016-07-05 19:42   ` Nicolas Goaziou
2016-07-05 20:30   ` John Kitchin [this message]
2016-07-05 21:56     ` Nicolas Goaziou
2016-07-06  1:49       ` John Kitchin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.orgmode.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=m2wpkzesjm.fsf@Johns-MacBook-Air.local \
    --to=jkitchin@andrew.cmu.edu \
    --cc=emacs-orgmode@gnu.org \
    --cc=mail@nicolasgoaziou.fr \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).