क्या यह संभव है कि एक ही ऑर्ग फाइल में, एक ही भाषा में दो कोड ब्लॉक हों जो कोड ब्लॉक के शीर्ष पर विभिन्न विकल्पों को निर्दिष्ट करके विभिन्न दुभाषियों में चलाए जाते हैं?
क्या यह संभव है कि एक ही ऑर्ग फाइल में, एक ही भाषा में दो कोड ब्लॉक हों जो कोड ब्लॉक के शीर्ष पर विभिन्न विकल्पों को निर्दिष्ट करके विभिन्न दुभाषियों में चलाए जाते हैं?
जवाबों:
मूल प्रश्न को एक निष्पादन योग्य के कई संस्करणों को चलाने की चिंता के लिए संशोधित किया गया है, और केवल स्वतंत्र दुभाषियों को नहीं।
का उपयोग करके find-library
मैंने उस स्रोत का निरीक्षण किया ob-ruby
, जिसमें यह कोड शामिल है:
(defvar org-babel-ruby-command "ruby"
"Name of command to use for executing ruby code.")
मैंने अजगर का उपयोग करने के लिए कहीं और संदर्भ देखा है 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
प्रत्येक ब्लॉक से पहले कॉल करने से बचने के लिए। ऐसा लगता है कि ऐसा करने का एक सरल तरीका होना चाहिए।
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
, जो भविष्य में इस मुद्दे के लिए समस्या को हल करने का उपयोग दिखा रहा है ?
मेरा मानना है कि डिफ़ॉल्ट रूप से प्रत्येक ब्लॉक एक स्वतंत्र दुभाषिया में चलता है, भले ही यह एक ही भाषा हो। कुछ भाषाओं के लिए व्यवहार भिन्न हो सकता है। उदाहरण के लिए, मुझे यकीन नहीं है कि एमएसीएस-लिस्प ब्लॉक सत्र संपत्ति का समर्थन करते हैं।
#+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 द्वारा समर्थित लगभग सभी भाषाओं में एक विशिष्ट कोड-ब्लॉक के लिए एक अलग दुभाषिया का उपयोग करने का कोई विकल्प नहीं है। एक उल्लेखनीय अपवाद (और एक जो मेरी दिलचस्पी है) जावास्क्रिप्ट है। इस मामले में कोई भी :cmd
विकल्प का उपयोग कर सकता है।
मानक जेएस दुभाषिया है 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