summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJack Kamm <jackkamm@gmail.com>2020-10-28 17:29:04 -0700
committerJack Kamm <jackkamm@gmail.com>2020-11-11 17:00:25 -0800
commit5371b30fe546469064a33c21baafb2ffc1ccbf86 (patch)
treecbf0455ca37a5a177536f9ff7cfd84ec89d4f155
parente9c3993ee57985addd3e8e103e78b66b182a626f (diff)
downloadorg-mode-5371b30fe546469064a33c21baafb2ffc1ccbf86.tar.gz
ol.el: New option to set org-link-file-path-type to a function
* lisp/ol.el (org-link-file-path-type): Add new option. (org-insert-link): Handle function option for org-link-file-path-type.
-rw-r--r--etc/ORG-NEWS18
-rw-r--r--lisp/ol.el12
2 files changed, 28 insertions, 2 deletions
diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS
index 60bff52..66347fe 100644
--- a/etc/ORG-NEWS
+++ b/etc/ORG-NEWS
@@ -35,6 +35,24 @@ omit a file description was to omit the header argument entirely,
which made it difficult/impossible to provide a default value for
=file-desc=.
+*** New option to set ~org-link-file-path-type~ to a function
+
+~org-link-file-path-type~ can now be set to a function that takes the
+full filename as an argument and returns the path to link to.
+
+For example, if you use ~project.el~, you can set this function to use
+relative links within a project as follows:
+
+#+begin_src emacs-lisp
+(setq (org-link-file-path-type
+ (lambda (path)
+ (let* ((proj (project-current))
+ (root (if proj (project-root proj) default-directory)))
+ (if (string-prefix-p (expand-file-name root) path)
+ (file-relative-name path)
+ (abbreviate-file-name path))))))
+#+end_src
+
** New features
*** =ob-python= improvements to =:return= header argument
diff --git a/lisp/ol.el b/lisp/ol.el
index 951bb74..262a6c5 100644
--- a/lisp/ol.el
+++ b/lisp/ol.el
@@ -212,13 +212,18 @@ relative Relative to the current directory, i.e. the directory of the file
absolute Absolute path, if possible with ~ for home directory.
noabbrev Absolute path, no abbreviation of home directory.
adaptive Use relative path for files in the current directory and sub-
- directories of it. For other files, use an absolute path."
+ directories of it. For other files, use an absolute path.
+
+Alternatively, users may supply a custom function that takes the
+full filename as an argument and returns the path."
:group 'org-link
:type '(choice
(const relative)
(const absolute)
(const noabbrev)
- (const adaptive))
+ (const adaptive)
+ (function))
+ :package-version '(Org . "9.5")
:safe #'symbolp)
(defcustom org-link-abbrev-alist nil
@@ -1876,6 +1881,9 @@ Use TAB to complete link prefixes, then RET for type-specific completion support
(setq path (expand-file-name path)))
((eq org-link-file-path-type 'relative)
(setq path (file-relative-name path)))
+ ((functionp org-link-file-path-type)
+ (setq path (funcall org-link-file-path-type
+ (expand-file-name path))))
(t
(save-match-data
(if (string-match (concat "^" (regexp-quote