通过 org-sbe 将组织模式属性传递给源代码块

Passing org-mode properties to source code block via org-sbe

我不知道如何将 属性 RID 传递给不同范围的源代码块,例如它在传递给函数 addSomething 之前无法计算 (org-entry-get nil "RID")。它在使用 #+CALL: 时确实有效,但相同的语法在 SRC 块中不起作用(请参见下面的最后一个示例)。

#+NAME: addSomething
#+BEGIN_SRC sh :results value :var x="no"
echo "something: $x"
#+END_SRC

* Heading 1
:PROPERTIES:
:RID:      h1_property
:END:

This works.
#+BEGIN_SRC sh :var y=(org-sbe addSomething (x  "1"))
echo $y
#+END_SRC

#+RESULTS:
: something: 1


This works too:
#+BEGIN_SRC sh :var y=(org-entry-get nil "RID")
echo $y
#+END_SRC

#+RESULTS:
: h1_property

Error: Reference 'RID' not found in this buffer
#+BEGIN_SRC sh :var y=(org-sbe addSomething (org-entry-get nil "RID"))
echo $y
#+END_SRC


Error: Reference 'just a string' not found in this buffer. 
#+BEGIN_SRC sh :var y=(org-sbe addSomething (x  "a string"))
echo $y
#+END_SRC

Why? Passing "1" worked.

Error: Symbol's variable is void: RID
#+BEGIN_SRC sh :var y=(org-sbe addSomething (x (org-entry-get nil "RID")))
echo $y
#+END_SRC

Seems ~(org-entry-get nil "RID")~ is evaluated outside of the current scope.

It works using CALL.
#+CALL: addSomething(x=(org-entry-get nil "RID")) :results value

#+RESULTS:
: something: h1_property

Try the same for `:var`:
#+BEGIN_SRC sh :var y=addSomething(x=(org-entry-get nil "RID"))
echo $y
#+END_SRC

#+RESULTS:
: something:

对于字符串大小写,试试这个:

#+BEGIN_SRC sh :var y=(org-sbe addSomething (x  $"a string"))
echo $y
#+END_SRC

#+RESULTS:
: something: a string

对于 RID 案例,试试这个:

#+BEGIN_SRC sh :var y=(org-sbe addSomething (x (org-entry-get nil \"RID\")))
echo $y
#+END_SRC

#+RESULTS:
: something: h1_property

您可以添加源块来计算您想要的任何元素,然后使用 org-sbe 将结果传递给其他源块;例如

#+name: rid
#+BEGIN_SRC sh :var y=(org-entry-get nil "RID")
echo $y
#+END_SRC

#+BEGIN_SRC sh :var y=(org-sbe addSomething (x (org-sbe rid)))
echo $y
#+END_SRC

#+RESULTS:
: something: h1_property

同样

#+name: string
#+BEGIN_SRC sh :var y="a string"
echo $y
#+END_SRC

#+RESULTS: string
: a string

#+BEGIN_SRC sh :var y=(org-sbe addSomething (x (org-sbe string)))
echo $y
#+END_SRC

#+RESULTS:
: something: a string

这是内联传递参数的第二个示例(再次使用上面定义的 "rid" 源代码块):

#+BEGIN_SRC sh :var y=addSomething((org-sbe rid)))
echo $y
#+END_SRC

#+RESULTS:
: something: h1_property

我意识到这既不是一个完整的也不是一个令人满意的答案,但我没有时间或耐心弄清楚规则的一小部分(更不用说完整的集合了)。一个好的答案将构成一个非常好的博客的核心 post,我非常期待阅读(提示,提示...)