ฉันจะประเมิน elisp ในไฟล์ orgmode ได้อย่างไรเมื่อมันถูกเปิด


13

ฉันมีรหัส elisp ฉันต้องการเรียกใช้ในไฟล์ orgmode เมื่อโหลด (ต่างกันสำหรับไฟล์ที่แตกต่างกันและกำหนดไว้ในไฟล์เอง) มีวิธีทำเช่นนี้หรือไม่? ฉันไม่เห็นอะไรเลยในhttp://orgmode.org/manual/In_002dbuffer-settings.html

หากฉันสามารถเพิ่มบางอย่างลงในการเริ่มต้น emacs ที่เรียกใช้โค้ดบล็อกที่มีชื่อเป็นพิเศษเมื่อใดก็ตามที่โหลดไฟล์ orgmode นั่นอาจเป็นวิธีแก้ปัญหา แต่ฉันไม่แน่ใจว่าจะทำเช่นนั้นได้อย่างไรและมีบางอย่างในตัว


1
ตัวแปรไฟล์ท้องถิ่นอาจ?
แดน

ได้ผลจริง! คุณต้องการทำให้เป็นคำตอบที่ฉันสามารถยอมรับได้หรือไม่?
avv

ในความคิดเพิ่มเติมว่าเป็นสภาพแวดล้อมที่ยุ่งมากในการแก้ไขดังนั้นทางออกที่ดีจะมีตัวแปรไฟล์ท้องถิ่นใช้รหัสบล็อกชื่อ
avv

ห่อไว้ใน progn หรือแลมบ์ดาบางที?
แดน

3
คุณสามารถใช้# -*- eval: (lisp code here) -*-แต่คุณต้องระวังอันตรายด้วย แม้ว่าคุณจะไม่แบ่งปันเอกสารเหล่านี้กับคนอื่น ๆ ลักษณะที่ตีความของ Emacs Lisp จะหมายความว่าการเปลี่ยนแปลงอาจส่งผลให้ข้อมูลสูญหายโดยไม่ตั้งใจ นอกจากนี้โหมดฮุกจะมีเสียงเหมือนตัวเลือกที่ดีกว่าถ้าคุณต้องการเรียกใช้รหัสเดียวกันมากกว่าหนึ่งไฟล์
wvxvw

คำตอบ:


9

โซลูชันนี้ไม่จำเป็นต้องเปลี่ยนแปลงinit.el(ด้วยการแก้ไขเล็กน้อย) มันเกี่ยวข้องกับการประเมินแบบโลคอลไฟล์ - แต่นั่นคือสิ่งที่ OP ต้องการ ข้อดีของการแก้ปัญหาคือ:

  • ขอให้ยืนยันการประเมินรหัส
  • รหัส elisp สามารถแก้ไขและทดสอบภายในสภาพแวดล้อม org-babel
  • เนื่องจากโซลูชันไม่ต้องการการแก้ไขinit.elไฟล์ orgmode อาจถูกแชร์กับผู้ใช้ (ที่เชื่อถือได้)

ฉันกำลังปรับปรุงคำแก้ปัญหาที่นี่

เพิ่ม src-block บางแห่งในไฟล์ของคุณ:

#+NAME: startup
#+BEGIN_SRC emacs-lisp
(your-code-here)
#+END_SRC

จากนั้นให้ใส่ส่วนท้ายของไฟล์ orgmode ของคุณ:

# Local Variables:
# eval: (progn (org-babel-goto-named-src-block "startup") (org-babel-execute-src-block) (outline-hide-sublevels 1))
# End:

ฉันได้เพิ่ม(outline-hide-sublevels 1)เพราะฉันต้องการซ่อน src-block ภายในส่วนหัวและต้องการให้ระดับย่อยถูกซ่อนเมื่อเริ่มต้น โดยไม่ต้องคำสั่งนี้ sublevels (org-babel-goto-named-src-block "startup")จะกลายเป็นขยายตัว

ด้วยโซลูชันนี้ emacs จะขอสิทธิ์ในการดำเนินการ 2 ครั้ง (วันที่ 1: ใช้ตัวแปรท้องถิ่นอันดับที่ 2: เรียกใช้ "startup" -src-block) เนื่องจากฉันมีบล็อก src จำนวนมากในไฟล์ของฉันฉันได้ตั้งค่าตัวแปรไฟล์ท้องถิ่นอีกไฟล์หนึ่งorg-confirm-babel-evaluateเช่นนี้

# Local Variables:
# org-confirm-babel-evaluate: nil
# eval: (progn (org-babel-goto-named-src-block "startup") (org-babel-execute-src-block) (outline-hide-sublevels 1))
# End:

คำเตือน:ด้วยการเพิ่มนี้ emacs จะแจ้งเตือนเพียงครั้งเดียวสำหรับการอนุญาตให้ดำเนินการ - บล็อก src ทั้งหมดในไฟล์นั้นอาจถูกเรียกใช้งานโดยไม่ต้องมีการยืนยันเพิ่มเติม ดังที่คนอื่น ๆ ชี้ไว้ก่อนหน้านี้พฤติกรรมนี้อาจเป็นอันตรายและคุณควรระมัดระวังในการตั้งค่านี้

อย่างไรก็ตามฉันขอยืนยันว่าโซลูชันนี้ (โดยเฉพาะรุ่นแรก) มีความปลอดภัยมากกว่าโซลูชันที่โจคอร์เนลีมอบให้เพราะอย่างน้อยคุณจะถูกขอให้ยืนยันการดำเนินการ ทางออกของโจจะประเมินบล็อกพิเศษโดยไม่มีการยืนยันถ้าพบในไฟล์ ผู้โจมตีจะต้องเดาชื่อของบล็อคพิเศษแน่นอน ...

ฉันใช้วิธีนี้เพื่อเขียนเอกสารขนาดใหญ่ที่ต้องการเช่นการปรับตัวให้เข้ากับกลไกการส่งออกองค์กร


5

org-mode... นอกเหนือจาก hooks ใด ๆ โหมดพาเรนoutline-modeต์ที่อาจรันอยู่โหมดนี้จะรัน hook org-mode-hookเป็นขั้นตอนสุดท้ายระหว่างการเริ่มต้น

ดังนั้นใน init.el ของคุณ:

(defun function-that-finds-and-evaluates-special-block ()
;; DWIM :-)
)
(add-hook 'org-mode-hook 'function-that-finds-and-evaluates-special-block)

สิ่งนี้ฟังดูสมเหตุสมผลสำหรับฉันมากกว่า vars สำหรับไฟล์นี้สำหรับงานนี้ แต่บางทีฉันก็ขาดอะไรไป
Drew

@Joe Corneli แล้วสิ่งที่คุณจะใส่ในไฟล์ org จริง?
หลอดไส้

ไม่มีอะไรพิเศษยกเว้น "บล็อกพิเศษ"
Joe Corneli

3

ตั้งแต่ที่คุณขอ

(แตกต่างกันสำหรับไฟล์ต่าง ๆ และกำหนดไว้ในไฟล์เอง)

จากนั้นลองใช้วิธีแก้ปัญหานี้


สนใจที่จะอธิบายว่าทำไมลงคะแนนเสียงหรือไม่
ผู้ใช้ Emacs

มันเป็นเพราะคำตอบที่เป็นเพียงการเชื่อมโยงไปยังคำตอบอื่น ๆ จะหมดกำลังใจ อย่างที่บอกไปแล้วบางทีคำถามนี้อาจเป็นคำตอบของคำถามที่คุณเชื่อมโยงกับ?
Linus Arver

1

ฉันเห็นด้วยกับข้อเสนอแนะของ @Joe Corneli เกี่ยวกับการใช้เบ็ด

มันเกิดขึ้นกับฉันเช่นกันที่คุณสามารถใช้ประโยชน์จากบุ๊คมาร์คได้ที่นี่: ใส่ที่คั่นหนังสือกระโดดบนตะขอ ข้อดีของบุ๊คมาร์คไปยังบล็อกรหัสคือโดยทั่วไปแล้วจะได้รับการย้ายโดยอัตโนมัติ (เช่นการเปลี่ยนแปลงเนื้อหาไฟล์) ดังนั้นโดยทั่วไปแล้วการค้นหาบล็อกควรได้รับการดูแลโดยอัตโนมัติ

[แต่มันไม่ชัดเจนสำหรับฉันว่าทำไมคุณถึงมีรหัสในไฟล์ Org-mode แทนที่จะเป็นที่อื่น เรากำลังทำสิ่งนั้นตามที่ได้รับตามแถลงการณ์ปัญหา แต่ฉันสงสัยว่าทำไมคุณถึงทำอย่างนั้น การแจ้งให้เราทราบเพิ่มเติมเกี่ยวกับการออกแบบในแง่นั้นอาจนำไปสู่ความช่วยเหลือที่ดีขึ้น]


0

ฉันพยายามปรับปรุงโค้ดจาก Joe Corneli:

คุณต้องการมันในไฟล์ init.el ของคุณ:

  (defun tdh/eval-startblock ()
    (if (member "startblock" (org-babel-src-block-names))
      (save-excursion
        (org-babel-goto-named-src-block "startblock")
        (org-babel-execute-src-block))
      nil
      )
    )
  (add-hook 'org-mode-hook 'tdh/eval-startblock)

ทุกครั้งที่คุณเปิดบัฟเฟอร์โหมดองค์กรจะค้นหาบล็อกต้นฉบับที่ชื่อ startblock หากพบหนึ่งบล็อกจะดำเนินการ

ในไฟล์ org-mode ของคุณคุณสามารถใส่:

#+NAME: startblock
#+BEGIN_SRC emacs-lisp
  ;; Any code you want
#+END_SRC
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.