我在使用表格调用我的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)))
答案 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