mirror of
https://git.savannah.gnu.org/git/emacs/org-mode.git
synced 2024-09-12 06:09:54 +00:00
A "functional-style" source block is one in which the name is followed immediately by a parenthesised argument. An example is the following "function", which generates n uniform random numbers: \#+srcname: rand(n) \#+begin_src R runif(n) \#+end_src With these changes, such source blocks are passed over to the export machinery in the following form: \#+begin_src org-babel-lob <function-def-keyword> rand(n): \#+end_src \#+begin_src R <switches> <indent>runif(n) \#+end_src where <function-def-keyword> is the value of org-babel-function-def-export-keyword, which defaults to "function", <switches> are the src block switches that belonged to the original block, and <indent> is the whitespace indent of the function body, the width of which is determined by org-babel-function-def-export-indent. org-babel-lob is a simple major mode responsible for fontification of the blocks corresponding to the function definition line (as opposed to the function body).
103 lines
3.8 KiB
EmacsLisp
103 lines
3.8 KiB
EmacsLisp
;;; org-babel-lob.el --- The Library of Babel: off-the-shelf functions for data analysis and plotting using org-babel
|
|
|
|
;; Copyright (C) 2009 Eric Schulte, Dan Davison
|
|
|
|
;; Author: Eric Schulte, Dan Davison
|
|
;; Keywords: literate programming, reproducible research
|
|
;; Homepage: http://orgmode.org
|
|
;; Version: 0.01
|
|
|
|
;;; License:
|
|
|
|
;; This program is free software; you can redistribute it and/or modify
|
|
;; it under the terms of the GNU General Public License as published by
|
|
;; the Free Software Foundation; either version 3, or (at your option)
|
|
;; any later version.
|
|
;;
|
|
;; This program is distributed in the hope that it will be useful,
|
|
;; 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.
|
|
;;
|
|
;; You should have received a copy of the GNU General Public License
|
|
;; along with GNU Emacs; see the file COPYING. If not, write to the
|
|
;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
|
;; Boston, MA 02110-1301, USA.
|
|
|
|
;;; Commentary:
|
|
|
|
;; See org-babel.org in the parent directory for more information
|
|
|
|
;;; Code:
|
|
(require 'org-babel)
|
|
(require 'org-babel-table)
|
|
(require 'org-babel-exp)
|
|
|
|
(defvar org-babel-library-of-babel nil
|
|
"Library of source-code blocks. This is an association list.
|
|
Populate the library by adding files to `org-babel-lob-files'.")
|
|
|
|
(defcustom org-babel-lob-files '()
|
|
"Files used to populate the `org-babel-library-of-babel'. To
|
|
add files to this list use the `org-babel-lob-ingest' command."
|
|
:group 'org-babel
|
|
:type 'list)
|
|
|
|
(defun org-babel-lob-ingest (&optional file)
|
|
"Add all source-blocks defined in FILE to `org-babel-library-of-babel'."
|
|
(interactive "f")
|
|
(org-babel-map-source-blocks file
|
|
(let* ((info (org-babel-get-src-block-info))
|
|
(source-name (intern (fifth info))))
|
|
(when source-name
|
|
(setq org-babel-library-of-babel
|
|
(cons (cons source-name info)
|
|
(assq-delete-all source-name org-babel-library-of-babel)))))))
|
|
|
|
;; functions for executing lob one-liners
|
|
|
|
(defvar org-babel-lob-one-liner-regexp "^[ \t]*#\\+lob:[ \t]+\\([^\(\)\n]+\\)\(\\([^\n]*\\)\)[ \t]*\\([^\n]*\\)")
|
|
|
|
(defun org-babel-lob-execute-maybe ()
|
|
"Detect if this is context for a org-babel Library Of Babel
|
|
src-block and if so then run the appropriate source block from
|
|
the Library."
|
|
(interactive)
|
|
(let ((info (org-babel-lob-get-info)))
|
|
(if (first info) (progn (org-babel-lob-execute info) t) nil)))
|
|
|
|
(add-hook 'org-ctrl-c-ctrl-c-hook 'org-babel-lob-execute-maybe)
|
|
|
|
(defun org-babel-lob-get-info ()
|
|
"Return the function call supplied on the current Library of
|
|
Babel line as a string.
|
|
|
|
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'."
|
|
(let ((case-fold-search t))
|
|
(save-excursion
|
|
(move-beginning-of-line 1)
|
|
(if (looking-at org-babel-lob-one-liner-regexp)
|
|
(mapcar #'org-babel-clean-text-properties
|
|
(list (format "%s(%s)" (match-string 1) (match-string 2))
|
|
(match-string 3)))))))
|
|
|
|
(defun org-babel-lob-execute (info)
|
|
(let ((params (org-babel-merge-params
|
|
org-babel-default-header-args
|
|
(org-babel-parse-header-arguments
|
|
(org-babel-clean-text-properties
|
|
(concat ":var results=" (mapconcat #'identity info " ")))))))
|
|
(org-babel-execute-src-block nil (list "emacs-lisp" "results" params))))
|
|
|
|
(define-generic-mode org-babel-lob-mode
|
|
'("#") (list org-babel-function-def-export-keyword) nil nil nil
|
|
"Major mode for fontification of library of babel lines on export")
|
|
|
|
(provide 'org-babel-lob)
|
|
;;; org-babel-lob.el ends here
|