From: Dan Davison <davison@stats.ox.ac.uk>
To: Julien Fantin <julien.fantin@gmail.com>
Cc: emacs-orgmode@gnu.org
Subject: Re: [babel] org-babel-load-file can't use properties drawers ?
Date: Sun, 28 Feb 2010 16:59:34 -0500 [thread overview]
Message-ID: <87y6id3ttl.fsf@stats.ox.ac.uk> (raw)
In-Reply-To: <e86166cb1002281257u20d22d41u5365443ef1c5a358@mail.gmail.com> (Julien Fantin's message of "Sun, 28 Feb 2010 21:57:29 +0100")
Julien Fantin <julien.fantin@gmail.com> 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
> :PROPERTIES:
> :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
somehow?
Dan
>
> Regards,
> julien
>
> _______________________________________________
> Emacs-orgmode mailing list
> Please use `Reply All' to send replies to the list.
> Emacs-orgmode@gnu.org
> http://lists.gnu.org/mailman/listinfo/emacs-orgmode
next prev parent reply other threads:[~2010-02-28 21:59 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-02-28 20:57 org-babel-load-file can't use properties drawers ? Julien Fantin
2010-02-28 21:59 ` Dan Davison [this message]
2010-03-22 14:52 ` Eric Schulte
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.orgmode.org/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87y6id3ttl.fsf@stats.ox.ac.uk \
--to=davison@stats.ox.ac.uk \
--cc=emacs-orgmode@gnu.org \
--cc=julien.fantin@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).