在 Org 模式下如何调用代码块来评估其他 org 文件?

Dim*_*min 4 emacs org-mode spacemacs

OrgMode版本 9+感兴趣

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

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

#+BEGIN_SRS lang :noweb yes
<<reusable-part1>>
<<current-buffer-specific-part>>
<<reusable-part2>>
#+END_SRS
Run Code Online (Sandbox Code Playgroud)

并且可以抄送它。

imi*_*mix 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
Run Code Online (Sandbox Code Playgroud)

这在文件中two.org

#+begin_src emacs-lisp :noweb yes
<<one.org:the-wrapper()>>
#+end_src
Run Code Online (Sandbox Code Playgroud)

执行此块响应"hello"。Cc Cv Cv 确认来源the-content最终位于源块中。

该解决方案利用了

  • noweb 块可以调用 src-blocks
  • org-babel 调用可以从其他文件调用
  • orgsrc-blocks 用它们的内容响应调用

因此orgsrc-blocks 可以通过文件转发。我使用了一个wrapp-org-block(the-wrapper),我在原始的src-block()中拥有我感兴趣的实际语言the-content

当原始 src 块的元素被解释为包装器块中的组织代码时,此解决方案可能会引起麻烦!


Pic*_*ent 5

我认为Babel 库是跨组织模式文件重用代码的最佳方式。

对于任何用户向库中添加代码,首先将代码保存在一个 Org 文件的常规 'src' 代码块中,然后使用 org-babel-lob-ingest 加载 Org 文件,该文件绑定到 Cc Cv i

更明确地说,假设您有一个像这样的简单代码:

#+NAME: simpleShExample
#+BEGIN_SRC sh :var x="default X" :var y="default Y" :export none
  echo "Var: $x, $y"
#+END_SRC
Run Code Online (Sandbox Code Playgroud)

此代码可以重复使用:

#+CALL: simpleShExample(y="My y")
Run Code Online (Sandbox Code Playgroud)

打印:

Var: default X, My y
Run Code Online (Sandbox Code Playgroud)

现在,如果您将代码保存在 org 文件中,simpleShExample.org 那么您可以通过使用以下 lisp 命令加载它在任何其他 org 文件中重用它:

(org-babel-lob-ingest "path/to/simpleShExample.org")
Run Code Online (Sandbox Code Playgroud)

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

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

  • 好吧,似乎这不是最好的,但却是重用代码块进行评估的唯一方法:(遗憾的是,没有模块化的方法可以用代码块插入其他文件 (2认同)