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

7

有兴趣了解 OrgMode 9+ 版本

是否有一种方式可以从其他 org 文件引用和评估代码块,并在当前 org 文件的主要代码块中使用其结果?

或者只需将其他 org 文件中的代码块包含到当前代码块中,以组合最后一个代码块?

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

并且可以使用 C-c C-c 进行操作。

2个回答

10
我认为巴别图书馆是在org-mode文件之间重用代码的最佳方式。
对于任何用户要将代码添加到库中,首先需要将代码保存在Org文件的常规“src”代码块中,然后使用绑定到C-c C-v i的org-babel-lob-ingest加载Org文件。
更明确地说,假设您有一个简单的代码,如下所示:
#+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

现在,如果您将代码保存在org文件中,例如 simpleShExample.org,那么您可以通过使用此lisp命令在任何其他org文件中加载它来重复使用它:
(org-babel-lob-ingest "path/to/simpleShExample.org")

请注意,您可以在emacs init文件中执行此操作一次。
您可以通过检查org-babel-library-of-babel变量来查看您摄取的所有源代码块的列表。

2
好吧,看起来这不是最好的,但是唯一可以重用代码块进行评估的方法:(很遗憾没有模块化的方法来插入其他带有代码块的文件。 - Dima Fomin
我对我发布的解决方案感到非常满意,但也许我们的要求不同。你尝试过使用 #+INCLUDE 吗?http://orgmode.org/manual/Include-files.html 可以直接包含你的代码块。 - Picaud Vincent
1
是的。 #+INCLUDE 是可以用于代码提取,但不能与实时块一起使用。另外,我也无法使 #+SETUPFILE 在 C-c C-c 的上下文中工作。 - Dima Fomin
1
我的想法是用Org-mode替换Project Jupyter。并且按需将不同的org文件插入代码块作为库。 - Dima Fomin
1
@DimaFomin 好的,我理解你的动机 :) 我也考虑过这个问题。然而,我的当前方法是使用 org mode 进行文档编写,但只提供到相关文件的链接:在你的情况下是 Jupyter 笔记本(在我的情况下是 C++ 代码和 Mathematica 脚本)。我最终采用这种方式的原因是我意识到,如果我使用 org-mode 存储代码源,我会失去所有本地工具:C++ 代码完成、Mathematica 的编辑器和图形输出等等。 - Picaud Vincent

8
下面这个方法适用于我:将以下内容放到名为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块
  • org-babel调用可以从其他文件中调用
  • org src块通过其内容响应调用
因此,org src块可以在文件之间传递。我使用一个wrap-org-block (the-wrapper),在原始src块(the-content)中,有我感兴趣的实际语言可用。
当原始src块的元素被解释为包装块中的org代码时,这种解决方案可能会引起问题!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接