diff --git a/modules/lang/org/+babel.el b/modules/lang/org/+babel.el index 06fdcc2c2..099ecc6eb 100644 --- a/modules/lang/org/+babel.el +++ b/modules/lang/org/+babel.el @@ -2,29 +2,6 @@ (add-hook 'org-load-hook #'+org|init-babel) -(defvar +org-babel-languages - '(calc - css - emacs-lisp - haskell - js - latex - ledger - lilypond - lisp - matlab - plantuml - python - restclient ; ob-restclient - ruby - rust ; ob-rust - shell - sqlite - sql-mode ; ob-sql-mode - translate) ; ob-translate - "A list of org-babel languages to load.") - - (defun +org|init-babel () (setq org-src-fontify-natively t ; make code pretty org-src-preserve-indentation t ; use native major-mode indentation @@ -32,10 +9,15 @@ org-src-window-setup 'current-window org-confirm-babel-evaluate nil) ; you don't need my permission - (org-babel-do-load-languages - 'org-babel-load-languages - (cl-loop for sym in +org-babel-languages - collect (cons sym t))) + (defun +org*babel-execute-src-block (orig-fn &rest args) + "Load babel libraries as needed when babel blocks are executed." + (let* ((language (org-element-property :language (org-element-at-point))) + (lang-sym (intern language))) + (unless (cdr (assoc lang-sym org-babel-load-languages)) + (require (intern (format "ob-%s" language))) + (add-to-list 'org-babel-load-languages (cons lang-sym t))) + (apply orig-fn args))) + (advice-add #'org-babel-execute-src-block :around #'+org*babel-execute-src-block) ;; I prefer C-c C-c for confirming over the default C-c ' (map! :map org-src-mode-map "C-c C-c" #'org-edit-src-exit)