[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Orgmode] [babel] org-babel-load-file can't use properties drawers ?

From: Dan Davison
Subject: Re: [Orgmode] [babel] org-babel-load-file can't use properties drawers ?
Date: Sun, 28 Feb 2010 16:59:34 -0500
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/23.1 (gnu/linux)

Julien Fantin <address@hidden> writes:

> I've been using this init file to load my org-mode-contained emacs 
> configuration  :
> ;;; init.el --- Where all the magic begins
> ;;
> ;; This file loads both
> ;; - Org-mode : http://orgmode.org/ and
> ;; - Org-babel: 
> http://orgmode.org/worg/org-contrib/babel/org-babel.php#library-of-babel
> ;;
> ;; It then loads the rest of our Emacs initialization from Emacs lisp
> ;; embedded in literate Org-mode files.
> ;; Load up Org Mode and Org Babel for elisp embedded in Org Mode files
> (setq dotfiles-dir (file-name-directory (or (buffer-file-name) 
> load-file-name)))
> (let* ((org-dir (expand-file-name
>                  "lisp" (expand-file-name
>                          "org-mode" (expand-file-name
>                                 "elisp" dotfiles-dir))))
>        (org-contrib-dir (expand-file-name
>                          "lisp" (expand-file-name
>                                  "contrib" (expand-file-name
>                                             ".." org-dir))))
>        (load-path (append (list org-dir org-contrib-dir)
>                           (or load-path nil))))
>   ;; load up Org-mode and Org-babel
>   (require 'org-install)
>   (require 'org-babel-init)
>   (require 'org-babel-emacs-lisp))
> ;; load up all literate org-mode files in this directory
> (mapc 'org-babel-load-file (directory-files dotfiles-dir t "\\.org$"))
> ;;; init.el ends here
> It's been working nicely until I tried to clean things up by setting some 
> commonly used variables  in properties drawers,
> and access them from emacs-lisp src blocks.
> The following illustrates my intent, and will behave as expected with 
> org-babel-execute-buffer, but fails when it is loaded
> by org-babel-load-file :
> * Configuration
> :ELISP-DIR:~/emacs.d/elisp/
> :END:
> ** Load Path
> #+begin_src emacs-lisp 
> (add-to-list 'load-path (org-entry-get nil "ELISP-DIR" t))
> #+end_src
> From my understanding, orb-babel-load-file tangles then loads the file, 
> losing the variables in the process.

Yes. Initially when I read your email I thought "hang on, why didn't
Eric implement org-babel-load-file using org-babel-execute-buffer?" But
I think (of course) there are good reasons -- for example I believe that
C-h f will be able to link back to the file in which a function was
defined, if it is loaded with load-file.

> I've been using this function to get the expected behaviour, but the default 
> somewhat breaks expectations, don't you think
> ?
>  (defun
>         ba/org-babel-load-file (file) (with-temp-buffer (insert-file-contents
>         file) (org-mode) (org-babel-execute-buffer)))
> Or, is there a cleaner way to achieve this ?

Eric may have a better answer, but I think that your solution is
appropriate. In fact, perhaps you'd like to donate us your function to
become org-babel-execute-file? So that would lead towards a scheme of
emacs initialisation broken into two parts:

1. org files containing emacs-lisp blocks that you want to be load-file'd
2. org files that you want to be org-babel-execute-file'd 

Perhaps org philosophy suggests that it ought to be possible for those
to be subtrees rather than distinct files? In which case we'd need to be
able to refer to a particular subtree within a particular file.

Here's a half thought through idea which might be getting convoluted and
out of my depth, but I wonder whether there's an alternative involving
lisp evaluation tricks. Would it be possible to have a version of
org-babel-load-file that doesn't simply extract the elisp from the
blocks, but instead generates the elisp that *would* be evaluated if you
had done C-c C-c, and then instead of evaluating it, tangles it to a .el
file so that it can be load-file'd. In particular, :var references would
be resolved and their variables set in a let binding as they are
normally. And perhaps you could get that (org-entry-get nil "ELISP-DIR"
t) to be evaluated while in the org buffer using the comma operator


> Regards,
> julien
> _______________________________________________
> Emacs-orgmode mailing list
> Please use `Reply All' to send replies to the list.
> address@hidden
> http://lists.gnu.org/mailman/listinfo/emacs-orgmode

reply via email to

[Prev in Thread] Current Thread [Next in Thread]