Standardized code block keywords

Nick Dokos <nicholas.dokos@hp.com> writes:

> Eric Schulte <schulte.eric@gmail.com> wrote:
>
>> The attached updated patch fixes a bug in the original.
>>
>
> Minor problem in applying:
>
> ,----
> | $ git apply ~/Mail/inbox/724
> | /home/nick/Mail/inbox/724:671: trailing whitespace.
> | #+name:
> | /home/nick/Mail/inbox/724:599: new blank line at EOF.
> | +
> | warning: 2 lines add whitespace errors.
> `----

The attached version fixes these issues, Thanks -- Eric

>From 0e43d59ee8d46a63f86780a502de726271bc39de Mon Sep 17 00:00:00 2001
From: Eric Schulte <schulte.eric@gmail.com>
Date: Fri, 28 Oct 2011 10:44:21 -0600
Subject: [PATCH] removing code block, results and call-line synonyms -- BREAKING CHANGE

Following a round of on-list discussion many code block synonyms have
been removed, moving forward the following syntax is valid.

- call lines are specified with #+call:
- code blocks are named with #+name:
- results are named with #+name:, however results generated by a code
  block may still be labeled with #+results:, and tables named with
  #+tblname: will be considered to be named results

The following function may be used to update an existing Org-mode
buffer to the new syntax.

  (defun update-org-buffer ()
    "Update an Org-mode buffer to the new data, code block and call line syntax."
    (interactive)
    (save-excursion
      (flet ((to-re (lst) (concat "^[ \t]*#\\+" (regexp-opt lst t)
                                  "\\(\\[\\([[:alnum:]]+\\)\\]\\)?\\:[ \t]*"))
             (update (re new)
                     (goto-char (point-min))
                     (while (re-search-forward re nil t)
                       (replace-match new nil nil nil 1))))
        (let ((old-re (to-re '("RESULTS" "DATA" "SRCNAME" "SOURCE")))
              (lob-re (to-re '("LOB")))
              (case-fold-search t))
          (update old-re "name")
          (update lob-re "call")))))

Note: If an old version of Org-mode (e.g., the one shipped with Emacs)
      is installed on your system many of the important variables will
      be pre-defined with a defvar and *will not* have their values
      automatically updated, these include the following.
      - org-babel-data-names
      - org-babel-result-regexp
      - org-babel-src-block-regexp
      - org-babel-src-name-regexp
      - org-babel-src-name-w-name-regexp
      It may be necessary to either remove the source code of older
      versions of Org-mode, or to explicitly evaluate the ob.el file.

* lisp/ob-exp.el (org-exp-res/src-name-cleanup): Updated
  Documentation.
* lisp/ob-lob.el (org-babel-block-lob-one-liner-regexp): Updated
  regular expression.
  (org-babel-inline-lob-one-liner-regexp): Updated regular expression.
* lisp/ob-ref.el (org-babel-ref-resolve): Notice when something that
  looks like a data results may actually be a code block.
* lisp/ob-table.el: Updated documentation.
* lisp/ob.el (org-babel-src-name-regexp): Simplified regexp.
  (org-babel-get-src-block-info): Updated match strings.
  (org-babel-data-names): Simplified acceptable names.
  (org-babel-find-named-block): Indentation.
  (org-babel-find-named-result): Updated to not return a code block as
  a result.
* lisp/org.el (org-fontify-meta-lines-and-blocks-1): Removing
  references to old syntactic elements.
  (org-additional-option-like-keywords): Removing references to old
  syntactic elements.
* contrib/babel/library-of-babel.org: Updated to make use of the new
  syntax.
* testing/examples/babel-dangerous.org: Updated to make use of the new
  syntax.
* testing/examples/babel.org: Updated to make use of the new syntax.
* testing/examples/ob-awk-test.org: Updated to make use of the new
  syntax.
* testing/examples/ob-fortran-test.org: Updated to make use of the new
  syntax.
* testing/lisp/test-ob.el: Removed two bad tests which tested the
  literal values of old regular expressions rather than their
  behavior.
This commit is contained in:
Eric Schulte 2011-10-28 23:52:48 +00:00
parent b43c1c621f
commit 7e93b90f88
12 changed files with 76 additions and 118 deletions

View File

@ -22,7 +22,7 @@
A collection of simple utility functions:
#+srcname: echo
#+name: echo
#+begin_src emacs-lisp :var input="echo'd"
input
#+end_src
@ -35,7 +35,7 @@ Read the contents of the file at =file=. The =:results vector= and
=:results scalar= header arguments can be used to read the contents of
file as either a table or a string.
#+srcname: read
#+name: read
#+begin_src emacs-lisp :var file="" :var format=""
(if (string= format "csv")
(with-temp-buffer
@ -49,7 +49,7 @@ file as either a table or a string.
Write =data= to a file at =file=. If =data= is a list, then write it
as a table in traditional Org-mode table syntax.
#+srcname: write
#+name: write
#+begin_src emacs-lisp :var data="" :var file="" :var ext='()
(flet ((echo (r) (if (stringp r) r (format "%S" r))))
(with-temp-file file
@ -67,7 +67,7 @@ as a table in traditional Org-mode table syntax.
Read local or remote file in [[http://www.json.org/][json]] format into emacs-lisp objects.
#+srcname: json
#+name: json
#+begin_src emacs-lisp :var file='() :var url='()
(require 'json)
(cond
@ -96,7 +96,7 @@ The =google= command seems to be throwing "Moved Temporarily" errors
when trying to download textual documents, but this is working fine
for spreadsheets.
#+source: gdoc-read
#+name: gdoc-read
#+begin_src emacs-lisp :var title="example" :var format="csv"
(let* ((file (concat title "." format))
(cmd (format "google docs get --format %S --title %S" format title)))
@ -126,7 +126,7 @@ Write =data= to a google document named =title=. If =data= is tabular
it will be saved to a spreadsheet, otherwise it will be saved as a
normal document.
#+source: gdoc-write
#+name: gdoc-write
#+begin_src emacs-lisp :var title="babel-upload" :var data=fibs(n=10) :results silent
(let* ((format (if (listp data) "csv" "txt"))
(tmp-file (make-temp-file "org-babel-google-doc" nil (concat "." format)))
@ -157,7 +157,7 @@ example usage
Plot column 2 (y axis) against column 1 (x axis). Columns 3 and
beyond, if present, are ignored.
#+srcname: R-plot(data=R-plot-example-data)
#+name: R-plot(data=R-plot-example-data)
#+begin_src R
plot(data)
#+end_src
@ -169,7 +169,7 @@ plot(data)
| 4 | 16 |
| 5 | 25 |
#+lob: R-plot(data=R-plot-example-data)
#+call: R-plot(data=R-plot-example-data)
#+resname: R-plot(data=R-plot-example-data)
: nil
@ -180,7 +180,7 @@ plot(data)
** Headline references
#+source: headline
#+name: headline
#+begin_src emacs-lisp :var headline=top :var file='()
(save-excursion
(when file (get-file-buffer file))
@ -217,7 +217,7 @@ optional.
| env | optional environment, default to "tabular" |
| width | optional width specification string |
#+srcname: booktabs
#+name: booktabs
#+begin_src emacs-lisp :var table='((:head) hline (:body)) :var align='() :var env="tabular" :var width='() :noweb yes :results latex
(flet ((to-tab (tab)
(orgtbl-to-generic
@ -266,7 +266,7 @@ are optional.
| foot | optional "foot" string |
| lastfoot | optional "lastfoot" string |
#+srcname: longtable
#+name: longtable
#+begin_src emacs-lisp :var table='((:table)) :var align='() :var width='() :var hline="\\hline" :var firsthead='() :var head='() :var foot='() :var lastfoot='() :noweb yes :results latex
(org-fill-template
"
@ -314,7 +314,7 @@ span. Note the use of LaTeX, rather than Org-mode, markup.
#+tblname: arguments-notes
| \multicolumn{2}{l}{This is a footnote to the \emph{arguments} table.} |
#+srcname: booktabs-notes
#+name: booktabs-notes
#+begin_src emacs-lisp :var table='((:head) hline (:body)) :var notes='() :var align='() :var env="tabular" :var width='() :var lspace='() :noweb yes :results latex
(flet ((to-tab (tab)
(orgtbl-to-generic
@ -356,7 +356,7 @@ span. Note the use of LaTeX, rather than Org-mode, markup.
| 1 | 2 | 3 |
| 4 | 5 | 6 |
#+srcname: transpose
#+name: transpose
#+begin_src emacs-lisp :var table=transpose-example
(apply #'mapcar* #'list table)
#+end_src
@ -372,7 +372,7 @@ span. Note the use of LaTeX, rather than Org-mode, markup.
| 1 | 2 | 3 |
| a | b | c |
#+source: all-to-string
#+name: all-to-string
#+begin_src emacs-lisp :var tbl='()
(defun all-to-string (tbl)
(if (listp tbl)
@ -387,7 +387,7 @@ span. Note the use of LaTeX, rather than Org-mode, markup.
(mapcar (lambda (row) (mapcar (lambda (cell) (stringp cell)) row)) tbl)
#+end_src
#+results:
#+name:
| nil | nil | nil |
| t | t | t |
@ -395,7 +395,7 @@ span. Note the use of LaTeX, rather than Org-mode, markup.
(mapcar (lambda (row) (mapcar (lambda (cell) (stringp cell)) row)) tbl)
#+end_src
#+results:
#+name:
| t | t | t |
| t | t | t |
@ -412,7 +412,7 @@ export. The function uses the Emacs VC commands to interface to the
local version control system, but has only been tested to work with
Git. 'limit' is currently unsupported.
#+source: vc-log
#+name: vc-log
#+headers: :var limit=-1
#+headers: :var buf=(buffer-name (current-buffer))
#+begin_src emacs-lisp
@ -440,34 +440,34 @@ Git. 'limit' is currently unsupported.
** Trivial python code blocks
#+srcname: python-identity(a=1)
#+name: python-identity(a=1)
#+begin_src python
a
#+end_src
#+srcname: python-add(a=1, b=2)
#+name: python-add(a=1, b=2)
#+begin_src python
a + b
#+end_src
** Arithmetic
#+source: lob-add
#+name: lob-add
#+begin_src emacs-lisp :var a=0 :var b=0
(+ a b)
#+end_src
#+source: lob-minus
#+name: lob-minus
#+begin_src emacs-lisp :var a=0 :var b=0
(- a b)
#+end_src
#+source: lob-times
#+name: lob-times
#+begin_src emacs-lisp :var a=0 :var b=0
(* a b)
#+end_src
#+source: lob-div
#+name: lob-div
#+begin_src emacs-lisp :var a=0 :var b=0
(/ a b)
#+end_src
@ -477,7 +477,7 @@ a + b
The =elispgantt= source block was sent to the mailing list by Eric
Fraga. It was modified slightly by Tom Dye.
#+source: elispgantt
#+name: elispgantt
#+begin_src emacs-lisp :var table=gantttest
(let ((dates "")
(entries (nthcdr 2 table))

View File

@ -147,7 +147,7 @@ options and are taken from `org-babel-default-inline-header-args'."
(forward-char 2)))))))))
(defun org-exp-res/src-name-cleanup ()
"Clean up #+results and #+srcname lines for export.
"Clean up #+results and #+name lines for export.
This function should only be called after all block processing
has taken place."
(interactive)

View File

@ -61,24 +61,15 @@ To add files to this list use the `org-babel-lob-ingest' command."
lob-ingest-count (if (> lob-ingest-count 1) "s" ""))
lob-ingest-count))
(defconst org-babel-lob-call-aliases '("lob" "call")
"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.")
(defconst org-babel-block-lob-one-liner-regexp
(concat
"^\\([ \t]*\\)#\\+\\(?:"
(mapconcat #'regexp-quote org-babel-lob-call-aliases "\\|")
"\\):[ \t]+\\([^\(\)\n]+?\\)\\(\\[\\(.*\\)\\]\\|\\(\\)\\)"
"^\\([ \t]*\\)#\\+call:[ \t]+\\([^\(\)\n]+?\\)\\(\\[\\(.*\\)\\]\\|\\(\\)\\)"
"\(\\([^\n]*\\)\)\\(\\[.+\\]\\|\\)[ \t]*\\(\\([^\n]*\\)\\)?")
"Regexp to match non-inline calls to predefined source block functions.")
(defconst org-babel-inline-lob-one-liner-regexp
(concat
"\\([^\n]*\\)\\(?:"
(mapconcat #'regexp-quote org-babel-lob-call-aliases "\\|")
"\\)_\\([^\(\)\n]+?\\)\\(\\[\\(.*\\)\\]\\|\\(\\)\\)"
"\\([^\n]*\\)call_\\([^\(\)\n]+?\\)\\(\\[\\(.*\\)\\]\\|\\(\\)\\)"
"\(\\([^\n]*\\)\)\\(\\[\\(.*?\\)\\]\\)?")
"Regexp to match inline calls to predefined source block functions.")

View File

@ -173,6 +173,11 @@ the variable."
(cond
(lob-info (setq type 'lob))
(id (setq type 'id))
((and (looking-at org-babel-src-name-regexp)
(progn (forward-line 1)
(or (looking-at org-babel-src-block-regexp)
(looking-at org-babel-multi-line-header-regexp))))
(setq type 'source-block))
(t (while (not (setq type (org-babel-ref-at-ref-p)))
(forward-line 1)
(beginning-of-line)

View File

@ -30,7 +30,7 @@
;; (defun fibbd (n) (if (< n 2) 1 (+ (fibbd (- n 1)) (fibbd (- n 2)))))
;; #+end_src
;; #+srcname: fibbd
;; #+name: fibbd
;; #+begin_src emacs-lisp :var n=2 :results silent
;; (fibbd n)
;; #+end_src

View File

@ -114,7 +114,7 @@ remove code block execution from the C-c C-c keybinding."
:type 'boolean)
(defvar org-babel-src-name-regexp
"^[ \t]*#\\+\\(srcname\\|source\\|function\\):[ \t]*"
"^[ \t]*#\\+name:[ \t]*"
"Regular expression used to match a source name line.")
(defvar org-babel-multi-line-header-regexp
@ -217,8 +217,8 @@ Returns a list
(nth 2 info)
(org-babel-parse-header-arguments (match-string 1)))))
(when (looking-at org-babel-src-name-w-name-regexp)
(setq name (org-babel-clean-text-properties (match-string 4)))
(when (match-string 6)
(setq name (org-babel-clean-text-properties (match-string 3)))
(when (match-string 5)
(setf (nth 2 info) ;; merge functional-syntax vars and header-args
(org-babel-merge-params
(mapcar
@ -230,7 +230,7 @@ Returns a list
(error
"variable \"%s\"%s must be assigned a default value"
var (if name (format " in block \"%s\"" name) ""))))
(org-babel-ref-split-args (match-string 6))))
(org-babel-ref-split-args (match-string 5))))
(nth 2 info))))))
;; inline source block
(when (org-babel-get-inline-src-block-matches)
@ -397,7 +397,7 @@ specific header arguments as well.")
'((:session . "none") (:results . "replace") (:exports . "results"))
"Default arguments to use when evaluating an inline source block.")
(defvar org-babel-data-names '("TBLNAME" "RESNAME" "RESULTS" "DATA"))
(defvar org-babel-data-names '("TBLNAME" "RESULTS" "NAME"))
(defvar org-babel-result-regexp
(concat "^[ \t]*#\\+"
@ -1367,7 +1367,7 @@ org-babel-named-src-block-regexp."
(regexp (org-babel-named-src-block-regexp-for-name name)) msg)
(goto-char (point-min))
(when (or (re-search-forward regexp nil t)
(re-search-backward regexp nil t))
(re-search-backward regexp nil t))
(match-beginning 0)))))
(defun org-babel-src-block-names (&optional file)
@ -1376,7 +1376,7 @@ org-babel-named-src-block-regexp."
(when file (find-file file)) (goto-char (point-min))
(let (names)
(while (re-search-forward org-babel-src-name-w-name-regexp nil t)
(setq names (cons (match-string 4) names)))
(setq names (cons (match-string 3) names)))
names)))
;;;###autoload
@ -1392,16 +1392,21 @@ org-babel-named-src-block-regexp."
(progn (goto-char point) (org-show-context))
(message "result '%s' not found in this buffer" name))))
(defun org-babel-find-named-result (name)
(defun org-babel-find-named-result (name &optional point)
"Find a named result.
Return the location of the result named NAME in the current
buffer or nil if no such result exists."
(save-excursion
(goto-char (point-min))
(when (re-search-forward
(concat org-babel-result-regexp
"[ \t]" (regexp-quote name) "[ \t\n\f\v\r]") nil t)
(beginning-of-line 0) (point))))
(goto-char (or point (point-min)))
(catch 'is-a-code-block
(when (re-search-forward
(concat org-babel-result-regexp
"[ \t]" (regexp-quote name) "[ \t\n\f\v\r]") nil t)
(when (and (string= "name" (match-string 1))
(or (looking-at org-babel-src-block-regexp)
(looking-at org-babel-multi-line-header-regexp)))
(throw 'is-a-code-block (org-babel-find-named-result name (point))))
(beginning-of-line 0) (point)))))
(defun org-babel-result-names (&optional file)
"Returns the names of results in FILE or the current buffer."

View File

@ -5425,9 +5425,8 @@ will be prompted for."
'(font-lock-fontified t face org-meta-line))
t)
((or (member dc1 '("begin:" "end:" "caption:" "label:"
"orgtbl:" "tblfm:" "tblname:" "result:"
"results:" "source:" "srcname:" "call:"
"data:" "header:" "headers:"))
"orgtbl:" "tblfm:" "tblname:" "results:"
"call:" "header:" "headers:"))
(and (match-end 4) (equal dc3 "attr")))
(add-text-properties
beg (match-end 0)
@ -10998,10 +10997,8 @@ This function can be used in a hook."
"BEGIN_CENTER" "END_CENTER"
"BEGIN_SRC" "END_SRC"
"BEGIN_RESULT" "END_RESULT"
"SOURCE:" "SRCNAME:" "FUNCTION:"
"RESULTS:" "DATA:"
"NAME:" "RESULTS:"
"HEADER:" "HEADERS:"
"BABEL:"
"CATEGORY:" "COLUMNS:" "PROPERTY:"
"CAPTION:" "LABEL:"
"SETUPFILE:"

View File

@ -9,7 +9,9 @@
There is no default value assigned to =x= variable. This is not permitted
anymore.
#+source: carre(x)
#+name: carre(x)
#+begin_src python
return x*x
#+end_src
#+name: carre

View File

@ -6,7 +6,7 @@
:ID: eb1f6498-5bd9-45e0-9c56-50717053e7b7
:END:
#+source: noweb-example
#+name: noweb-example
#+begin_src emacs-lisp
(message "expanded")
#+end_src
@ -39,7 +39,7 @@
prop
#+end_src
#+results:
#+name:
: 4
* excessive id links on tangling
@ -64,7 +64,7 @@
:ID: f68821bc-7f49-4389-85b5-914791ee3718
:END:
#+source: four
#+name: four
#+begin_src emacs-lisp
(list 1 2 3 4)
#+end_src
@ -73,7 +73,7 @@
(length four)
#+end_src
#+results:
#+name:
: 4
* multi-line header arguments
@ -86,7 +86,7 @@
(map 'list #'list numbers letters)
#+end_src
#+results:
#+name:
| 1 | a |
| 2 | b |
| 3 | c |
@ -100,15 +100,15 @@
:ID: 0d82b52d-1bb9-4916-816b-2c67c8108dbb
:END:
#+source: i-have-a-name
#+name: i-have-a-name
#+begin_src emacs-lisp
42
#+end_src
#+results:
#+name:
: 42
#+results: i-have-a-name
#+name: i-have-a-name
: 42
* Pascal's Triangle -- export test
@ -116,7 +116,7 @@
:ID: 92518f2a-a46a-4205-a3ab-bcce1008a4bb
:END:
#+source: pascals-triangle
#+name: pascals-triangle
#+begin_src emacs-lisp :var n=5 :exports both
(defun pascals-triangle (n)
(if (= n 0)
@ -136,7 +136,7 @@
:ID: 6d2ff4ce-4489-4e2a-9c65-e3f71f77d975
:END:
#+source: take-sqrt
#+name: take-sqrt
#+begin_src emacs-lisp :var n=9
(sqrt n)
#+end_src
@ -159,7 +159,7 @@ This is an inline call call_echo(input="testing")[:results vector] embedded in p
call_echo("testing")
call_concat(1,2,3)
#+source: concat
#+name: concat
#+begin_src emacs-lisp :var a=0 :var b=0 :var c=0
(format "%S%S%S" a b c)
#+end_src
@ -169,7 +169,7 @@ call_concat(1,2,3)
:ID: 72ddeed3-2d17-4c7f-8192-a575d535d3fc
:END:
#+source: double
#+name: double
#+begin_src emacs-lisp :var it=0
(* 2 it)
#+end_src
@ -214,7 +214,7 @@ src_sh{echo 3} Here is one at the beginning of a line.
:PROPERTIES:
:ID: 5daa4d03-e3ea-46b7-b093-62c1b7632df3
:END:
#+results: a-list
#+name: a-list
- a
- b
- c
@ -298,13 +298,13 @@ src_sh{echo 2} blocks on the src_emacs-lisp{"same"} line
echo "[[file:./cv.cls]]"
#+end_src
#+results:
#+name:
: [[file:./cv.cls]]
#+begin_src sh :results raw scalar
echo "[[file:./cv.cls]]"
#+end_src
#+results:
#+name:
[[file:./cv.cls]]

View File

@ -20,7 +20,7 @@ Use a code block ouput as an input
#+end_src
Use input file
#+srcname: genfile
#+name: genfile
#+begin_src awk :in-file ob-awk-test.in :results silent
$0~/[\t]*#/{
# skip comments
@ -33,7 +33,7 @@ Use input file
* Input data generators
A code block to generate input stream
#+srcname: genseq
#+name: genseq
#+begin_src emacs-lisp :results silent
(print "1")
#+end_src

View File

@ -5,12 +5,12 @@
:PROPERTIES:
:ID: 459384e8-1797-4f11-867e-dde0473ea7cc
:END:
#+source: hello
#+name: hello
#+begin_src fortran :results silent
print *, 'Hello world'
#+end_src
#+source: fortran_parameter
#+name: fortran_parameter
#+begin_src fortran :results silent
integer, parameter :: i = 10
write (*, '(i2)') i

View File

@ -13,36 +13,6 @@
(require 'org-test)
(require 'org-test-ob-consts))
(ert-deftest test-org-babel/src-name-regexp ()
(should(equal "^[ \t]*#\\+\\(srcname\\|source\\|function\\):[ \t]*"
org-babel-src-name-regexp))
(mapcar (lambda (name)
(should (org-test-string-exact-match
org-babel-src-name-regexp
(concat
" \t #+"
name
": \t src-name \t blah blah blah ")))
(should (string-match
org-babel-src-name-regexp
(concat
"#+" (upcase name)
": src-name")))
;;TODO This should fail no?
(should (org-test-string-exact-match
org-babel-src-name-regexp
(concat
"#+" name ":")))
;;TODO Check - should this pass?
(should (not (org-test-string-exact-match
org-babel-src-name-regexp
(concat
"#+" name " : src-name")))))
'("srcname" "source" "function"))
(should (not (org-test-string-exact-match
org-babel-src-name-regexp
"#+invalid-name: src-name"))))
(ert-deftest test-org-babel/multi-line-header-regexp ()
(should(equal "^[ \t]*#\\+headers?:[ \t]*\\([^\n]*\\)$"
org-babel-multi-line-header-regexp))
@ -63,18 +33,6 @@
org-babel-multi-line-header-regexp
" \t #+headers : blah1 blah2 blah3 \t\n\t\n blah4 blah5 blah6 \n"))))
(ert-deftest test-org-babel/src-name-w-name-regexp ()
(should(equal
(concat org-babel-src-name-regexp "\\("
org-babel-multi-line-header-regexp "\\)*"
"\\([^ ()\f\t\n\r\v]+\\)\\(\(\\(.*\\)\)\\|\\)")
org-babel-src-name-w-name-regexp))
(should (org-test-string-exact-match
org-babel-src-name-w-name-regexp
(concat
"#+srcname: src-name "
"#+headers: blah1 blah2 blah3 \t\n\t\n blah4 blah5 blah6 \n"))))
(ert-deftest test-org-babel/src-block-regexp ()
(let ((test-block
(concat