Передача свойств режима org в блок исходного кода через org-sbe - PullRequest
1 голос
/ 04 апреля 2019

Я не мог понять, как передать свойство 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 голосов
/ 09 апреля 2019

Для строкового случая попробуйте это:

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

Я понимаю, что это не полный и не удовлетворительный ответ, но у меня не было времени или терпения, чтобы выяснить даже небольшое подмножество (не говоря уже о полном наборе) правил.Хороший ответ послужил бы основой для очень приятного поста в блоге, который я, например, очень хотел бы прочитать (подсказка, подсказка ...)

...