답변:
원래 질문은 단순한 독립 통역사가 아닌 여러 버전의 실행 파일을 실행하는 것과 관련하여 수정되었습니다.
사용 find-library
나는의 소스 검사 된 ob-ruby
이 코드를 포함 :
(defvar org-babel-ruby-command "ruby"
"Name of command to use for executing ruby code.")
python을 사용하는 다른 곳의 참조를 보았 org-babel-python-command
으므로 다른 언어로 존재하므로 적절한 ob-$lang
지원을 확인하십시오.
이를 통해 다음이 작동합니다.
#+begin_src emacs-lisp :results none
(setq org-babel-python-command "python3")
#+end_src
#+begin_src python :results output
import sys
print(sys.version)
#+end_src
#+RESULTS:
: 3.4.0 (default, Apr 11 2014, 13:05:11)
: [GCC 4.8.2]
#+begin_src emacs-lisp :results none
(setq org-babel-python-command "python2")
#+end_src
#+begin_src python :results output
import sys
print(sys.version)
#+end_src
#+RESULTS:
: 2.7.6 (default, Mar 22 2014, 22:59:56)
: [GCC 4.8.2]
이것은 각 블록 전에 elisp 호출 :session python3
과 결합 :session python2
하여 피할 수 있습니다 . 그래도 더 간단한 방법이 있어야합니다.
org-babel-post-tangle-hook
. 누군가에서 구현해야합니다 org-babel-pre-tangle-hook
.
:interpreter
속성이 필요한 것 같습니다 .
:interpreter
. 그러나 org-babel-post-tangle-hook
코드 실행 후 C-c C-c
코드 블록을 통해 실행됩니다 . pre
코드 실행 전에 실행 한다고 가정 합니다. 그러나 전역 변수를 변경하면 부작용이 발생한다는 것을 알았습니다. :interpreter
더 좋을 것입니다.
:interpreter
옵션을 추가하기로 결정했습니다 org-babel-execute:js
. 그러나 그 출처를 살펴보면 내가 원하는 것을 정확하게 수행 org-babel-execute:js
하는 :cmd
옵션 이 이미 있다는 것을 알았습니다. 불행히도, :cmd
모든 언어에서 사용 가능한 것은 아니며 설명서도 찾지 못했기 ob-js
때문에 처음에는 :cmd
존재 하지 않았습니다 .
:cmd
했지만 인터프리터 명령에 인수를 추가하는 데만 사용 된 것처럼 보입니다. 앞으로이 :cmd
문제가있는 사람들을 위해 문제를 해결하는 방법을 보여주는 전체 예를 들어 자신의 질문에 대답 해 주 시겠습니까?
기본적으로 각 블록은 동일한 언어 인 경우에도 독립적 인 인터프리터에서 실행됩니다. 일부 언어의 경우 동작이 다를 수 있습니다. 예를 들어 emacs-lisp 블록이 세션 속성을 지원하는지 확실하지 않습니다.
#+BEGIN_SRC ruby
a = "foo"
#+END_SRC
#+RESULTS:
: foo
#+BEGIN_SRC ruby
a ||= "bar"
#+END_SRC
#+RESULTS:
: bar
#+BEGIN_SRC ruby :session foo
a ||= "session foo"
#+END_SRC
#+RESULTS:
: session foo
#+BEGIN_SRC ruby :session foo
a += " with bar"
#+END_SRC
#+RESULTS:
: session foo with bar
처음 두 블록은 독립 통역사를 사용하지만 세 번째 및 네 번째 블록은 세션을 공유 :foo
하므로 동일한 통역사에서 평가됩니다.
Org Babel에서 지원하는 거의 모든 언어는 특정 코드 블록에 다른 인터프리터를 사용할 수있는 옵션이 없습니다. 주목할만한 예외 중 하나 (그리고 관심있는 예외)는 Javascript입니다. 이 경우 :cmd
옵션을 사용할 수 있습니다 .
node
변수에 정의 된대로 표준 JS 인터프리터가 org-babel-js-cmd
있습니다. 다른 인터프리터를 통해 특정 코드 블록을 실행하려면 :cmd
다음 예와 같이 옵션을 전달하십시오 .
#+begin_src js :cmd "/usr/bin/osascript -l JavaScript"
app = Application.currentApplication()
app.includeStandardAdditions = true
app.say("Hello")
#+end_src