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)))