เป็นไปได้หรือไม่ว่าในไฟล์ org เดียวกันนั้นโค้ดบล็อกสองอันในภาษาเดียวกันที่รันในล่ามที่ต่างกันโดยการระบุตัวเลือกต่าง ๆ ที่ด้านบนสุดของบล็อคโค้ด
เป็นไปได้หรือไม่ว่าในไฟล์ org เดียวกันนั้นโค้ดบล็อกสองอันในภาษาเดียวกันที่รันในล่ามที่ต่างกันโดยการระบุตัวเลือกต่าง ๆ ที่ด้านบนสุดของบล็อคโค้ด
คำตอบ:
คำถามเดิมได้รับการแก้ไขเพื่อให้ทำงานได้หลายเวอร์ชันและไม่ใช่แค่ล่ามอิสระ
ใช้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
เพื่อหลีกเลี่ยงการเรียก 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
บล็อกสองบล็อกแรกใช้ล่ามอิสระ แต่บล็อกที่สามและสี่แบ่งปันเซสชัน:foo
ดังนั้นพวกเขาจึงประเมินในล่ามเดียวกัน
ปรากฎว่าเกือบทุกภาษาสนับสนุนโดย Org Babel ไม่มีตัวเลือกในการใช้ล่ามที่แตกต่างกันสำหรับบล็อกโค้ดเฉพาะ ข้อยกเว้นหนึ่งที่น่าสังเกต (และที่ฉันสนใจ) คือ 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