> I don't have a real world scenario, just the one I made up below. I used > that to play around with the function.
I see. FYI: I do change default-directory during src block execution in my config. The following code makes src blocks execute inside attachment folder by default: (define-advice org-babel-execute-src-block (:filter-args (&optional args) set-detault-dir-to-org-attach-path) "Set working directory to the current entry's attach directory." (if (eq major-mode 'org-mode) (let* ((directory (file-name-as-directory (org-attach-dir 'create-if-none))) (arg (car args)) (info (cadr args)) (params (org-babel-merge-params (nth 2 info) (caddr args))) (dir-param (alist-get :dir params))) (unless (and dir-param (or (equal (f-full default-directory) (f-full dir-param)) (f-absolute-p dir-param))) (setf (alist-get :dir params) (if dir-param (f-join directory (alist-get :dir params)) directory))) (list arg info params)) (list arg info params))) That's actually how I found the reported bug. Best, Ihor John Herrlin <jherr...@gmail.com> writes: > Ihor Radchenko <yanta...@gmail.com> writes: > >>> It's intended to change directory and dont clone base buffer values. I >>> tried to accomplish "If the `default-directory' is different from the >>> containing file's directory then expand relative links." >> >> Not sure if I understand your use-case. Can you explain why you need to >> achieve such behaviour? There might be an easier way to get what you >> want. > > I don't have a real world scenario, just the one I made up below. I used > that to play around with the function. > > Best regards > John > >> >> Best, >> Ihor >> >> >> John Herrlin <jherr...@gmail.com> writes: >> >>> It's intended to change directory and dont clone base buffer values. I >>> tried to accomplish "If the `default-directory' is different from the >>> containing file's directory then expand relative links." As I >>> understands it that's when it inserts a relative link, otherwise it just >>> `result'. I was looking from the indirect buffers point of view and from >>> there the relative link is off in this case. But from the base buffers >>> point of view everything works fine. I guess that it was my use case >>> that is strange. >>> >>> Looks good! >>> >>> Best regards >>> John >>> >>>>> In my case the result is a relative link, but if I follow the link I end >>>>> up in the wrong place. >>>> >>>> Do you mean that the generated script.sh ends up in your home dir? >>>> It is expected since default-directory in your buffer is "~/": >>>> >>>>> (dired "~/") >>>>> (make-indirect-buffer "tmp.org" "tmp-indirect") >>>> >>>> Note that you called make-indirect-buffer without third argument. >>>> >>>> According to manual: >>>> >>>>> (make-indirect-buffer BASE-BUFFER NAME &optional CLONE) >>>>> CLONE nil means the indirect buffer's state is reset to default values. >>>> >>>>> Org first tries to generate the filename from the value of the >>>>> ‘file’ header argument and the directory specified using the >>>>> ‘output-dir’ header arguments. If ‘output-dir’ is not specified, >>>>> Org assumes it is the current directory. >>>> >>>> No surprise you got your file in the default-directory (~/). >>>> >>>> If you use (make-indirect-buffer "tmp.org" "tmp-indirect" t) instead, >>>> the script.sh link will be relative, as expected. >>>> >>>> Let me know if I miss something. >>>> >>>> Best, >>>> Ihor >>>> >>>> >>>>> Hey Ihor, >>>>> >>>>> Could not get the patch to work. >>>>> >>>>> I used this use case. >>>>> >>>>> (with-current-buffer >>>>> (find-file "/tmp/tmp.org") >>>>> (insert "* A\n** b\n** c\n\n some text") >>>>> (dired "~/") >>>>> (make-indirect-buffer "tmp.org" "tmp-indirect") >>>>> (switch-to-buffer "tmp-indirect") >>>>> (goto-char (point-max)) >>>>> (funcall 'org-mode) >>>>> (insert (concat "\n\n| default-directory | " default-directory " |\n" >>>>> "| org-link-file-path-type | " (symbol-name >>>>> org-link-file-path-type) " |\n" >>>>> "| (expand-file-name default-directory) | " >>>>> (expand-file-name default-directory) " |\n" >>>>> "| (buffer-file-name (buffer-base-buffer)) | " >>>>> (buffer-file-name (buffer-base-buffer)) " |\n")) >>>>> (org-table-align) >>>>> (insert "\n\n#+BEGIN_SRC shell :results file :file script.sh >>>>> echo \"#!/bin/bash\" >>>>> echo \"echo Hey\"\n#+END_SRC") >>>>> (org-babel-execute-src-block)) >>>>> >>>>> In my case the result is a relative link, but if I follow the link I end >>>>> up in the wrong place. >>>>> >>>>> src_emacs-lisp{emacs-version} {{{results(=26.3=)}}} >>>>> src_emacs-lisp{org-version} {{{results(=9.3.7=)}}} >>>>> >>>>> Best regards >>>>> John >>>>> >>>>> >>>>> Ihor Radchenko <yanta...@gmail.com> writes: >>>>> >>>>>> Remember to cover the basics, that is, what you expected to happen and >>>>>> what in fact did happen. You don't know how to make a good report? See >>>>>> >>>>>> https://orgmode.org/manual/Feedback.html#Feedback >>>>>> >>>>>> Your bug report will be posted to the Org mailing list. >>>>>> ------------------------------------------------------------------------ >>>>>> >>>>>> I noticed that org-babel-result-to-file never expands file: links in >>>>>> src block results when ran from indirect buffer and default-directory >>>>>> is not same with base buffer file's directory. This is against the >>>>>> docstring stating that >>>>>> >>>>>>> If the `default-directory' is different from the containing >>>>>>> file's directory then expand relative links. >>>>>> >>>>>> The misbehavior happens because buffer-file-name variable is always >>>>>> nil in indirect buffers. We need to call (file-name-directory >>>>>> (buffer-file-name (buffer-base-buffer))) instead. >>>>>> >>>>>> The patch is attached. >>>>>> >>>>>> Best, >>>>>> Ihor >>>>>> >>>>>> diff --git a/lisp/ob-core.el b/lisp/ob-core.el >>>>>> index f86282f0f..d37eef5f9 100644 >>>>>> --- a/lisp/ob-core.el >>>>>> +++ b/lisp/ob-core.el >>>>>> @@ -2561,16 +2561,16 @@ If the `default-directory' is different from the >>>>>> containing >>>>>> file's directory then expand relative links." >>>>>> (when (stringp result) >>>>>> (let ((same-directory? >>>>>> - (and buffer-file-name >>>>>> + (and (buffer-file-name (buffer-base-buffer)) >>>>>> (not (string= (expand-file-name default-directory) >>>>>> - (expand-file-name >>>>>> - (file-name-directory >>>>>> buffer-file-name))))))) >>>>>> + (expand-file-name >>>>>> + (file-name-directory (buffer-file-name >>>>>> (buffer-base-buffer))))))))) >>>>>> (format "[[file:%s]%s]" >>>>>> - (if (and default-directory buffer-file-name >>>>>> same-directory?) >>>>>> + (if (and default-directory (buffer-file-name >>>>>> (buffer-base-buffer)) same-directory?) >>>>>> (if (eq org-link-file-path-type 'adaptive) >>>>>> (file-relative-name >>>>>> (expand-file-name result default-directory) >>>>>> - (file-name-directory (buffer-file-name))) >>>>>> + (file-name-directory (buffer-file-name >>>>>> (buffer-base-buffer)))) >>>>>> (expand-file-name result default-directory)) >>>>>> result) >>>>>> (if description (concat "[" description "]") ""))))) >>>>>> >>>>>> Emacs : GNU Emacs 28.0.50 (build 4, x86_64-pc-linux-gnu, GTK+ Version >>>>>> 3.24.20, cairo version 1.16.0) >>>>>> of 2020-07-27 >>>>>> Package: Org mode version 9.3.7 (release_9.3.7-728-g1efc4e @ >>>>>> /home/yantar92/.emacs.d/straight/build/org/) -- Ihor Radchenko, PhD, Center for Advancing Materials Performance from the Nanoscale (CAMP-nano) State Key Laboratory for Mechanical Behavior of Materials, Xi'an Jiaotong University, Xi'an, China Email: yanta...@gmail.com, ihor_radche...@alumni.sutd.edu.sg