コードブロックの上部で異なるオプションを指定することにより、同じインタープリターで実行される同じ言語の2つのコードブロックを同じorgファイルに含めることは可能ですか?
コードブロックの上部で異なるオプションを指定することにより、同じインタープリターで実行される同じ言語の2つのコードブロックを同じorgファイルに含めることは可能ですか?
回答:
元の質問は、単なる独立したインタープリターではなく、実行可能ファイルの複数のバージョンの実行に関係するように変更されました。
を使用して、このコードを含むの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]
これは、と組み合わせることができる:session python3
し、:session python2
各ブロックの前のelispを呼び出さないようにします。ただし、これを行うにはもっと簡単な方法があるはずです。
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
最初の2つのブロックは独立したインタープリターを使用しますが、3番目と4番目のブロックはセッションを共有する:foo
ため、同じインタープリターで評価されます。
Org Babelでサポートされているほとんどすべての言語には、特定のコードブロックに異なるインタープリターを使用するオプションがないことがわかります。注目すべき1つの例外(および私が興味を持っている例外)は、Javascriptです。この場合、:cmd
オプションを使用できます。
標準のJSインタープリターはnode
、変数で定義されています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