通过org-sbe将org-mode属性传递到源代码块

时间:2019-04-03 21:10:41

标签: emacs org-mode org-babel

我不知道如何将属性RID传递给其他范围内的源代码块,例如它在传递给函数(org-entry-get nil "RID")之前无法评估addSomething。使用#+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:

1 个答案:

答案 0 :(得分:0)

对于字符串大小写,请尝试以下操作:

#+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

我意识到这既不是一个完整的解决方案也不是令人满意的解决方案,但是我没有时间或耐心来找出哪怕是一小部分规则(更不用说完整的规则)了。一个好的答案将构成一篇非常不错的博客文章的核心,我个人非常希望阅读(提示,提示...)

相关问题