From mboxrd@z Thu Jan 1 00:00:00 1970 From: Mark Cox Subject: [PATCH] Common Lisp source blocks are now wrapped in a LET form which binds the symbol *default-pathname-defaults* to the directory in which the org file resides. Date: Wed, 1 Jun 2011 15:17:59 +1000 Message-ID: Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Return-path: Received: from eggs.gnu.org ([140.186.70.92]:47222) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QRdoh-0000rc-Aw for emacs-orgmode@gnu.org; Wed, 01 Jun 2011 01:18:05 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QRdof-0000it-69 for emacs-orgmode@gnu.org; Wed, 01 Jun 2011 01:18:02 -0400 Received: from mail-vx0-f169.google.com ([209.85.220.169]:65467) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QRdoe-0000id-KL for emacs-orgmode@gnu.org; Wed, 01 Jun 2011 01:18:00 -0400 Received: by vxk20 with SMTP id 20so5046488vxk.0 for ; Tue, 31 May 2011 22:17:59 -0700 (PDT) List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: emacs-orgmode@gnu.org 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)))