通过 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,我非常期待阅读(提示,提示...)
我不知道如何将 属性 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,我非常期待阅读(提示,提示...)