无法从组织表中调用Org babel代码块

时间:2013-11-22 18:03:39

标签: python emacs elisp org-mode org-babel

我在使用表格调用我的babel代码块时遇到问题 sbe。以下是一些对我不起作用的最小例子:

|   |    in: | in:    | out:     | out:     | out:      |
| ! | number | string | elispStr | elispNum | pythonStr |
|---+--------+--------+----------+----------+-----------|
| # |      5 | fd     | #ERROR   | #ERROR   | #ERROR    |
| # |      7 | fadsf  | #ERROR   | #ERROR   | #ERROR    |
#+TBLFM: $4='(sbe elispStrBlock (foo $string))::$5='(sbe elispNumBlock (a $number));N::$6='(sbe pythonStrBlock (foo $string))

#+name elispNumBlock
#+header: :var a=4
#+begin_src emacs-lisp :results value
(message (number-to-string a))
#+end_src

#+RESULTS:
: 4

#+name elispStrBlock
#+header: :var a="testing"
#+begin_src emacs-lisp :results value 
(message a)
#+end_src

#+RESULTS:
: testing

#+name pythonStrBlock
#+header: :var foo="testing"
#+begin_src python :results output
print foo
#+end_src

#+RESULTS:
: testing

当我使用C-c C-c评估代码时,代码块会起作用 块中的点(因此上面显示的#+RESULTS输出)。

我查看过邮件列表(example)并看过 有些人可以输出babel错误到*Org Babel Error Output*缓冲区,我想这有助于调试,但我看不到 在哪里开启(toggle-debug-on-error不起作用)

我正在使用org-version:8.2.3c。我也试过上面的一个 带有-q选项的全新emacs在启动时忽略我的配置。一世 已确保启用python进行评估:

(org-babel-do-load-languages 'org-babel-load-languages '((emacs-lisp . t) (python . t)))

1 个答案:

答案 0 :(得分:2)

显示调试:

中缺少冒号

#+name elispNumBlock

必须是:

#+name: elispNumBlock

以下建议将sbe的错误消息传递给消息缓冲区:

(defadvice sbe (around get-err-msg activate)
  "Issue messages at errors."
  (condition-case err
      (progn
    ad-do-it)
    ((error debug)
     (message "Error in sbe: %S" err)
     (signal (car err) (cdr err)))))

如果没有它,错误消息只会被转换为表格单元格内容#ERROR。没那么翔实。

正如我已经评论过的那样:N输出格式并没有按预期正常工作。结果字符串将替换为命令调用。所以你需要额外的字符串引用。

对我来说,以下是有效的:

|   |    in: | in:     | out:     |     out: | out:      |
| ! | number | string  | elispStr | elispNum | pythonStr |
|---+--------+---------+----------+----------+-----------|
| # |      5 | "fd"    | fd       |        5 | fd        |
| # |      7 | "fadsf" | fadsf    |        7 | fadsf     |
#+TBLFM: $4='(sbe elispStrBlock (foo $string))::$5='(sbe elispNumBlock (a $number))::$6='(sbe pythonStrBlock (foo $string))

#+name: elispNumBlock
#+header: :var a=4
#+begin_src emacs-lisp :results value
(message (number-to-string a))
#+end_src

#+RESULTS:
: 4

#+name: elispStrBlock
#+header: :var foo="testing"
#+begin_src emacs-lisp :results value 
(message foo)
#+end_src


#+name: pythonStrBlock
#+header: :var foo="testing"
#+begin_src python :results output
print foo
#+end_src

编辑:关于单元格引用“$ 2”。以下适用于我:

| ! | arg | res |
|---+-----+-----|
| # |   1 |   2 |
| # |   2 |   3 |
#+TBLFM: $3='(sbe myColFm (el $2))

#+name: myColFm
#+header: :var el=1
#+begin_src emacs-lisp
  (1+ el)
#+end_src

编辑:附加建议

(defadvice sbe (before escape-args activate)
  "Apply prin1 to argument values."
  (mapc '(lambda (var) (setcdr var (list (prin1-to-string (cadr var))))) variables))

命令sbe按预期工作:

| ! | arg | res |   |
|---+-----+-----+---|
| # |   1 |   3 | 5 |
| # |   2 |   4 | 6 |
#+TBLFM: $3='(sbe myStr (el $2))::$4='(sbe myColFm (el $2));N

#+name: myStr
#+header: :var el="1"
#+begin_src emacs-lisp
  (+ 2 (string-to-number el))
#+end_src

#+name: myColFm
#+header: :var el=1
#+begin_src emacs-lisp
  (+ 4 el)
#+end_src