emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: Jack Kamm <jackkamm@gmail.com>
To: Kyle Meyer <kyle@kyleam.com>
Cc: emacs-orgmode@gnu.org
Subject: Re: [PATCH] New "project" option for org-link-file-path-type
Date: Wed, 04 Nov 2020 10:11:27 -0800	[thread overview]
Message-ID: <87blgd6lgw.fsf@gmail.com> (raw)
In-Reply-To: <874km89uxu.fsf@kyleam.com>

[-- Attachment #1: Type: text/plain, Size: 1841 bytes --]

Hi Kyle,

> As a projectile user, I'm tempted to suggest that, instead of the adding
> the `project' value, org-insert-link could learn to call
> org-link-file-path-type if it is a function and, if that returns
> non-nil, do the prefix check.  Then projectile users could set it to
> projectile-project-root.  It seems project.el doesn't have a similar
> function that could be called without any arguments, but I guess we
> could add a simple ol- wrapper.  I'm not sure that's a good idea,
> though.

I like the idea of letting org-link-file-path-type be a function.

However, it struck me that it might be too limiting to just have the
function return the project root. There's a lot more potential for
customization here -- for example, a user might want to combine the
noabbrev option with the adaptive option. If we could instead pass a
function that takes the filename as an argument and returns the path to
insert, that would allow for greater flexibility.

Other benefits are that the implementation is much simpler, and
subjectively I think it's more intuitive to explain the meaning of this
option (as opposed to an option where the user passes a function that
returns the project root).

The downside of this is that the user has to do a bit more work and
write some elisp to take advantage of the option.

I've attached an updated patch in this direction. What do you think? I
think the simplicity and flexibility outweighs the downside, but I'm not
sure.

> The :package-version keyword should be added to signal the change in
> value.

Thanks for the tip, I've added this.

> Functionally I think your current patch would only support Emacs's
> unreleased master, unless the user installed a new project.el via ELPA.
> More on that below.

Good catch. I didn't realize I was using project.el from ELPA but it
turns out I was.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-ol.el-New-option-to-set-org-link-file-path-type-to-a.patch --]
[-- Type: text/x-patch, Size: 2887 bytes --]

From d156a9cfcdbfb9be72df39761111e2355f48cf10 Mon Sep 17 00:00:00 2001
From: Jack Kamm <jackkamm@gmail.com>
Date: Wed, 28 Oct 2020 17:29:04 -0700
Subject: [PATCH] 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.
---
 etc/ORG-NEWS | 19 +++++++++++++++++++
 lisp/ol.el   | 12 ++++++++++--
 2 files changed, 29 insertions(+), 2 deletions(-)

diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS
index 7f935bf52..891a680ae 100644
--- a/etc/ORG-NEWS
+++ b/etc/ORG-NEWS
@@ -35,6 +35,25 @@ 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
+
+If ~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)
+               (progn
+                 (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 951bb74e7..262a6c5ae 100644
--- a/lisp/ol.el
+++ b/lisp/ol.el
@@ -212,13 +212,18 @@ (defcustom org-link-file-path-type 'adaptive
 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 @@ (defun org-insert-link (&optional complete-file link-location description)
 	    (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
-- 
2.29.2


  reply	other threads:[~2020-11-04 18:13 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-10-29  0:46 [PATCH] New "project" option for org-link-file-path-type Jack Kamm
2020-11-02  5:41 ` Kyle Meyer
2020-11-04 18:11   ` Jack Kamm [this message]
2020-11-06  3:33     ` Kyle Meyer
2020-11-12  1:05       ` Jack Kamm
2021-04-25  3:29         ` Timothy

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=87blgd6lgw.fsf@gmail.com \
    --to=jackkamm@gmail.com \
    --cc=emacs-orgmode@gnu.org \
    --cc=kyle@kyleam.com \
    /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).