Hi Mark,

I agree that this would constitute more reasonable default behavior.
I've implemented your suggestion with a simpler version of the patch you
supplied which makes use of the `default-directory' variable.  This
version also uses the :dir header argument, which can be used to
override (or unset) the local directory.

#+begin_src lisp
  *default-pathname-defaults*
#+end_src

#+results:
: #P/home/eschulte/path/to/org/file/

#+begin_src lisp :dir /tmp/
  *default-pathname-defaults*
#+end_src

#+results:
: #P/tmp/

#+begin_src lisp :dir
  *default-pathname-defaults*
#+end_src

#+results:
: NIL

Thanks for these patches.  If you think you may continue to make
contributions it may be worth starting the FSF copyright assignment now
as it takes some time to complete and without it we can not apply
patches >10 lines long.  See http://orgmode.org/worg/org-contribute.html
for more information on copyright assignment and contributing to
Org-mode.

Many Thanks -- Eric

Mark Cox <markco...@gmail.com> writes:

> Hi,
>
> This may be contentious and break backward compatibility for some people.
>
> Currently, relative pathnames in Common Lisp source blocks are
> meaningless as the *default-pathname-defaults* symbol is set to
> whatever the value is when SLIME was invoked. This behaviour is
> contrary to the shell source block processor (I haven't checked the
> others).
>
> This is in /tmp/example1/test.org
> #+begin_src sh
> pwd
> #+end_src
>
> #+results:
> : #P"/tmp/example1/"
>
> This is in /tmp/example2/test.org
> #+begin_src sh
> pwd
> #+end_src
>
> #+results:
> : #P"/tmp/example2/"
>
> The attached patch brings this expected behaviour (well from my point
> of view) to lisp source blocks. Given the behaviour of Emacs commands
> like DIRED and COMPILE, I think the patch makes things more
> consistent.
>
> I couldn't figure out how the sh block processor determines the path
> to the org file so I hacked together something that works using some
> of the Org hooks.
>
> Thanks
> Mark
>
> lisp/ob-lisp.el: Added new variable ORG-BABEL-LISP-CURRENT-BUFFER
> which is used to store a reference to the currently being processed org file.
> This variable is setq'd in the hooks for
> ORG-BABEL-PRE-TANGLE-HOOK, ORG-CTRL-C-CTRL-C-HOOK and
> ORG-EXPORT-FIRST-HOOK.
>
> lisp/ob-lisp.el (org-babel-expand-body:lisp): The code sent to SLIME
> is now wrapped in a LET block which binds
> COMMON-LISP:*DEFAULT-PATHNAME-DEFAULTS* to the directory where the
> currently being processed org file resides.
>
> diff --git a/lisp/ob-lisp.el b/lisp/ob-lisp.el
> index a875d55..db06182 100644
> --- a/lisp/ob-lisp.el
> +++ b/lisp/ob-lisp.el
> @@ -40,6 +40,14 @@
>
>  (defvar org-babel-default-header-args:lisp '())
>  (defvar org-babel-header-arg-names:lisp '(package))
> +(defvar org-babel-lisp-current-buffer nil)
> +
> +(let ((fn (lambda ()
> +           (setq org-babel-lisp-current-buffer (current-buffer))
> +           nil)))
> +  (dolist (hook '(org-babel-pre-tangle-hook org-ctrl-c-ctrl-c-hook
> org-export-first-hook))
> +    (add-hook hook fn)))
> +
>
>  (defun org-babel-expand-body:lisp (body params)
>    "Expand BODY according to PARAMS, return the expanded body."
> @@ -73,8 +81,10 @@
>                 (read (org-bable-lisp-vector-to-list (cadr result)))
>               (error (cadr result)))))
>        (slime-eval `(swank:eval-and-grab-output
> -                   ,(format "(progn %s)" (buffer-substring-no-properties
> -                                          (point-min) (point-max))))
> +                   ,(format "(let
> ((common-lisp:*default-pathname-defaults* #P%S)) %s)"
> +                            (file-name-directory (buffer-file-name
> org-babel-lisp-current-buffer))
> +                            (buffer-substring-no-properties
> +                             (point-min) (point-max))))
>                   (cdr (assoc :package params)))))
>     (org-babel-pick-name (cdr (assoc :colname-names params))
>                         (cdr (assoc :colnames params)))
>

-- 
Eric Schulte
http://cs.unm.edu/~eschulte/

Reply via email to