在Org-mode中如何调用代码块来评估其他org文件?

时间:2017-11-01 15:32:19

标签: emacs org-mode spacemacs

OrgMode版本9 +

感兴趣

有没有办法从其他 org文件中引用和评估代码块,并在当前组织文件的主代码块中使用它的结果?

或者只是将其他组织文件中的代码块包含到当前代码块中以构成最后一个

#+BEGIN_SRS lang :noweb yes
<<reusable-part1>>
<<current-buffer-specific-part>>
<<reusable-part2>>
#+END_SRS

并且可以使用C-c C-c。

2 个答案:

答案 0 :(得分:3)

我认为Library of Babel是在组织模式文件中重用代码的最佳方式。

  

对于任何将代码添加到库的用户,请先将代码保存到   定期'src'的Org文件的代码块,然后加载Org文件   与org-babel-lob-ingest结合,与C-c C-v i结合

为了更明确,让我们说你有一个像这样的简单代码:

#+NAME: simpleShExample
#+BEGIN_SRC sh :var x="default X" :var y="default Y" :export none
  echo "Var: $x, $y"
#+END_SRC

此代码可以重复使用:

#+CALL: simpleShExample(y="My y")

打印:

Var: default X, My y

现在,如果您将代码保存在组织文件中,例如simpleShExample.org 然后,您可以通过使用此lisp命令加载它在任何其他组织文件中重用它:

(org-babel-lob-ingest "path/to/simpleShExample.org")

请注意,您可以在emacs init文件中执行此操作一次。

您可以通过检查org-babel-library-of-babel变量来检查您摄取的所有源代码块的列表。

答案 1 :(得分:2)

以下对我有用:将其放入文件one.org

#+name: the-content
#+begin_src emacs-lisp
(print "hello")
#+end_src

#+name: the-wrapper
#+begin_src org :noweb yes
<<the-content>>
#+end_src

,并将其保存在文件two.org中:

#+begin_src emacs-lisp :noweb yes
<<one.org:the-wrapper()>>
#+end_src

执行此阻止响应"hello"。 C-c C-v C-v确认来自the-content的源位于源块中。

此解决方案利用了

  • noweb块可以调用src-blocks
  • org-babel呼叫可以从其他文件呼叫
  • org src块以其内容响应呼叫

因此,org src块可以通过文件转发。我使用的是wrap-org-block(the-wrapper),在原始的src-block(the-content)中提供了我感兴趣的实际语言。

当原始src-block的元素在wrapper-block中解释为组织代码时,此解决方案可能会引起麻烦!