2010-06-25 12:20:39 -04:00
|
|
|
;;; ob-lob.el --- functions supporting the Library of Babel
|
2009-06-12 20:26:28 -04:00
|
|
|
|
2010-06-25 12:20:39 -04:00
|
|
|
;; Copyright (C) 2009, 2010 Free Software Foundation, Inc.
|
2009-06-12 20:26:28 -04:00
|
|
|
|
2009-10-29 19:03:43 -04:00
|
|
|
;; Author: Eric Schulte, Dan Davison
|
2009-06-12 20:26:28 -04:00
|
|
|
;; Keywords: literate programming, reproducible research
|
|
|
|
;; Homepage: http://orgmode.org
|
2010-07-19 02:33:24 -04:00
|
|
|
;; Version: 7.01trans
|
2009-06-12 20:26:28 -04:00
|
|
|
|
2010-06-25 12:20:39 -04:00
|
|
|
;; This file is part of GNU Emacs.
|
2009-06-12 20:26:28 -04:00
|
|
|
|
2010-06-25 12:20:39 -04:00
|
|
|
;; GNU Emacs is free software: you can redistribute it and/or modify
|
2009-06-12 20:26:28 -04:00
|
|
|
;; it under the terms of the GNU General Public License as published by
|
2010-06-25 12:20:39 -04:00
|
|
|
;; the Free Software Foundation, either version 3 of the License, or
|
|
|
|
;; (at your option) any later version.
|
|
|
|
|
|
|
|
;; GNU Emacs is distributed in the hope that it will be useful,
|
2009-06-12 20:26:28 -04:00
|
|
|
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
;; GNU General Public License for more details.
|
2010-06-25 12:20:39 -04:00
|
|
|
|
2009-06-12 20:26:28 -04:00
|
|
|
;; You should have received a copy of the GNU General Public License
|
2010-06-25 12:20:39 -04:00
|
|
|
;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
|
2009-06-12 20:26:28 -04:00
|
|
|
|
|
|
|
;;; Commentary:
|
|
|
|
|
2010-06-25 12:20:39 -04:00
|
|
|
;; See the online documentation for more information
|
|
|
|
;;
|
|
|
|
;; http://orgmode.org/worg/org-contrib/babel/
|
2009-06-12 20:26:28 -04:00
|
|
|
|
|
|
|
;;; Code:
|
2010-06-11 19:02:42 -04:00
|
|
|
(require 'ob)
|
|
|
|
(require 'ob-table)
|
2009-06-14 10:54:55 -04:00
|
|
|
|
2009-06-14 17:10:04 -04:00
|
|
|
(defvar org-babel-library-of-babel nil
|
2010-07-13 19:20:08 -04:00
|
|
|
"Library of source-code blocks.
|
|
|
|
This is an association list. Populate the library by adding
|
|
|
|
files to `org-babel-lob-files'.")
|
2009-06-14 17:10:04 -04:00
|
|
|
|
|
|
|
(defcustom org-babel-lob-files '()
|
2010-07-13 19:20:08 -04:00
|
|
|
"Files used to populate the `org-babel-library-of-babel'.
|
|
|
|
To add files to this list use the `org-babel-lob-ingest' command."
|
2009-06-14 17:10:04 -04:00
|
|
|
:group 'org-babel
|
|
|
|
:type 'list)
|
|
|
|
|
2010-06-23 14:24:33 -04:00
|
|
|
;;;###autoload
|
2009-06-14 17:10:04 -04:00
|
|
|
(defun org-babel-lob-ingest (&optional file)
|
|
|
|
"Add all source-blocks defined in FILE to `org-babel-library-of-babel'."
|
|
|
|
(interactive "f")
|
2010-07-12 00:35:58 -04:00
|
|
|
(org-babel-map-src-blocks file
|
2009-10-31 11:36:25 -04:00
|
|
|
(let* ((info (org-babel-get-src-block-info))
|
2010-06-12 21:26:08 -04:00
|
|
|
(source-name (intern (nth 4 info))))
|
2009-06-15 15:54:29 -04:00
|
|
|
(when source-name
|
|
|
|
(setq org-babel-library-of-babel
|
|
|
|
(cons (cons source-name info)
|
|
|
|
(assq-delete-all source-name org-babel-library-of-babel)))))))
|
2009-06-14 17:10:04 -04:00
|
|
|
|
2009-11-01 10:29:50 -05:00
|
|
|
(defconst org-babel-lob-call-aliases '("lob" "call")
|
2010-07-13 19:20:08 -04:00
|
|
|
"Aliases to call a source block function.
|
|
|
|
If you change the value of this variable then your files may
|
|
|
|
become unusable by other org-babel users, and vice versa.")
|
2010-06-10 17:36:08 -04:00
|
|
|
|
2009-11-01 10:29:50 -05:00
|
|
|
(defconst org-babel-lob-one-liner-regexp
|
2010-07-20 14:40:57 -04:00
|
|
|
(concat
|
|
|
|
"^\\([ \t]*\\)#\\+\\(?:"
|
|
|
|
(mapconcat #'regexp-quote org-babel-lob-call-aliases "\\|")
|
2010-07-22 19:20:08 -04:00
|
|
|
"\\):[ \t]+\\([^\(\)\n]+\\)\(\\([^\n]*\\)\)\\(\\[.+\\]\\|\\)[ \t]*\\([^\n]*\\)")
|
2010-07-13 19:20:08 -04:00
|
|
|
"Regexp to match calls to predefined source block functions.")
|
2009-06-14 17:10:04 -04:00
|
|
|
|
2009-11-01 10:29:50 -05:00
|
|
|
;; functions for executing lob one-liners
|
2010-06-23 14:24:33 -04:00
|
|
|
;;;###autoload
|
2009-06-14 10:54:55 -04:00
|
|
|
(defun org-babel-lob-execute-maybe ()
|
2010-07-13 19:20:08 -04:00
|
|
|
"Execute a Library of Babel source block, if appropriate.
|
|
|
|
Detect if this is context for a Library Of Babel source block and
|
|
|
|
if so then run the appropriate source block from the Library."
|
2009-06-14 10:54:55 -04:00
|
|
|
(interactive)
|
|
|
|
(let ((info (org-babel-lob-get-info)))
|
2010-06-12 21:26:08 -04:00
|
|
|
(if (nth 0 info) (progn (org-babel-lob-execute info) t) nil)))
|
2009-06-14 10:54:55 -04:00
|
|
|
|
2010-06-23 14:24:33 -04:00
|
|
|
;;;###autoload
|
2009-06-14 10:54:55 -04:00
|
|
|
(defun org-babel-lob-get-info ()
|
2010-07-13 19:20:08 -04:00
|
|
|
"Return a Library of Babel function call as a string.
|
Enabling LoB to put results in buffer, and slowly moving towards more
unified concept of function calls.
Previously LoB calls were not able to produce results in the
buffer. These changes go some way to allowing them to do that. [There
are still some bugs to deal with]. That meant changing org-babel.el so
that there is a notion of the `source block name' for a LoB line, in
order to construct a #+resname (currently I've made the name the same
as the function call).
I'm also slowly moving towards unifying the notion of `function calls'
a bit more: I've changed the org-babel-lob-one-liner-regexp so that
instead of a monolithic match it now matches first the function name,
and second the function arguments in
parentheses. org-babel-lob-get-info makes that match, and although it
still concatenates them and returns the string, the two elements can
be accessed immediately afterwards using match-string. So that
situation is very similar to org-babel-get-src-block-name, whose
job (in this branch) is also to parse the function *name* and the
function *arguments*. In a few places in the code (esp. function
names), I think the word `info' should be replaced with `call' or
`function call', which I believe more accurately indicates what the
`info' is: a function definition, together with bound
arguments/references.
The function call syntax, i.e. function-name(arg1=ref1), originally
introduced for references (and thereby in LoB), and which I'm
proposing we use throughout, raises the question of default arguments,
and those being over-ridden by supplied arguments, as in e.g. python,
and R.
2009-07-10 22:59:10 -04:00
|
|
|
|
|
|
|
This function is analogous to org-babel-get-src-block-name. For
|
|
|
|
both functions, after they are called, (match-string 1) matches
|
|
|
|
the function name, and (match-string 2) matches the function
|
|
|
|
arguments inside the parentheses. I think perhaps these functions
|
|
|
|
should be renamed to bring out this similarity, perhaps involving
|
|
|
|
the word 'call'."
|
2009-06-14 10:54:55 -04:00
|
|
|
(let ((case-fold-search t))
|
|
|
|
(save-excursion
|
Xemacs incompatibilities
Carsten Dominik <carsten.dominik@gmail.com> writes:
> On May 17, 2010, at 4:39 PM, Michael Sperber wrote:
>
>> In particular, fixing the require won't be enough: org-babel-python.el
>> uses `run-python' and interacts with the inferior Python, whereas
>> python-mode.el defines `py-shell'.
>>
>> Should I try to abstract over the differences?
>
> Yes, this would be much appreciated. (I think, Eric or Dan?)
OK, I've attached a patch that makes `org-babel-python' work on XEmacs.
Most of the issues are pure XEmacs issues. Notes:
- XEmacs doesn't have [[:digit:]] - I hope to rectify this in the
future, but it seems there's no downside in this particular case to
replacing by [0-9].
- XEmacs doesn't have `move-end-of-line', but does have `end-of-line'.
I don't understand the intent of having both of these, but the code
seems fine with `end-of-line'.
- It seems there are way too few `require's throughout org-babel. I
don't know if it's OK to add the ones I needed.
- `org-babel-python-evaluate' looked broken as-is: It doesn't use the
`body' argument properly, the result is (I think) processed in the
wrong order and not properly split into lines. I've fixed all these,
but a review is probably in order.
2010-05-24 15:22:50 -04:00
|
|
|
(beginning-of-line 1)
|
2009-06-14 10:54:55 -04:00
|
|
|
(if (looking-at org-babel-lob-one-liner-regexp)
|
2010-07-20 14:40:57 -04:00
|
|
|
(append
|
|
|
|
(mapcar #'org-babel-clean-text-properties
|
|
|
|
(list
|
|
|
|
(format "%s(%s)%s"
|
|
|
|
(match-string 2) (match-string 3) (match-string 4))
|
|
|
|
(match-string 5)))
|
|
|
|
(list (length (match-string 1))))))))
|
2009-09-26 21:40:06 -04:00
|
|
|
|
2009-06-14 10:54:55 -04:00
|
|
|
(defun org-babel-lob-execute (info)
|
2010-06-11 20:12:15 -04:00
|
|
|
"Execute the lob call specified by INFO."
|
Enabling LoB to put results in buffer, and slowly moving towards more
unified concept of function calls.
Previously LoB calls were not able to produce results in the
buffer. These changes go some way to allowing them to do that. [There
are still some bugs to deal with]. That meant changing org-babel.el so
that there is a notion of the `source block name' for a LoB line, in
order to construct a #+resname (currently I've made the name the same
as the function call).
I'm also slowly moving towards unifying the notion of `function calls'
a bit more: I've changed the org-babel-lob-one-liner-regexp so that
instead of a monolithic match it now matches first the function name,
and second the function arguments in
parentheses. org-babel-lob-get-info makes that match, and although it
still concatenates them and returns the string, the two elements can
be accessed immediately afterwards using match-string. So that
situation is very similar to org-babel-get-src-block-name, whose
job (in this branch) is also to parse the function *name* and the
function *arguments*. In a few places in the code (esp. function
names), I think the word `info' should be replaced with `call' or
`function call', which I believe more accurately indicates what the
`info' is: a function definition, together with bound
arguments/references.
The function call syntax, i.e. function-name(arg1=ref1), originally
introduced for references (and thereby in LoB), and which I'm
proposing we use throughout, raises the question of default arguments,
and those being over-ridden by supplied arguments, as in e.g. python,
and R.
2009-07-10 22:59:10 -04:00
|
|
|
(let ((params (org-babel-merge-params
|
|
|
|
org-babel-default-header-args
|
2010-06-14 14:55:37 -04:00
|
|
|
(org-babel-params-from-buffer)
|
2010-03-28 18:53:00 -04:00
|
|
|
(org-babel-params-from-properties)
|
2009-09-26 21:40:06 -04:00
|
|
|
(org-babel-parse-header-arguments
|
|
|
|
(org-babel-clean-text-properties
|
2010-07-20 14:40:57 -04:00
|
|
|
(concat ":var results="
|
|
|
|
(mapconcat #'identity (butlast info) " ")))))))
|
2010-06-10 17:36:08 -04:00
|
|
|
(org-babel-execute-src-block
|
2010-06-12 21:26:08 -04:00
|
|
|
nil (list "emacs-lisp" "results" params nil nil (nth 2 info)))))
|
2009-06-14 10:54:55 -04:00
|
|
|
|
2010-06-11 19:02:42 -04:00
|
|
|
(provide 'ob-lob)
|
2010-06-25 12:20:39 -04:00
|
|
|
|
|
|
|
;; arch-tag: ce0712c9-2147-4019-ba3f-42341b8b474b
|
|
|
|
|
2010-06-11 19:02:42 -04:00
|
|
|
;;; ob-lob.el ends here
|