From 98b439e3bbb5af3a79b472c4ab7d82b9c954771d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 30 May 2018 18:11:12 +0200 Subject: [PATCH] Refactor lang/org +babel lazy loader for src blocks Exposes +org-babel-load-functions, which are a list of functions that will be tried in order to load the dependencies of a src block. --- modules/lang/org/+babel.el | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/modules/lang/org/+babel.el b/modules/lang/org/+babel.el index c4f4cc9d8..ccf8899a0 100644 --- a/modules/lang/org/+babel.el +++ b/modules/lang/org/+babel.el @@ -12,6 +12,11 @@ "An alist that maps languages to babel libraries. This is necessary for babel libraries (ob-*.el) that don't match the name of the language.") +(defvar +org-babel-load-functions () + "A list of functions that are used to try to load the current executing src +block. They take one argument (the language specified in the src block, as +string). Stops at the first function to return non-nil.") + (defun +org|init-babel () (setq org-src-fontify-natively t ; make code pretty org-src-preserve-indentation t ; use native major-mode indentation @@ -24,11 +29,12 @@ libraries (ob-*.el) that don't match the name of the language.") (let* ((language (org-element-property :language (org-element-at-point))) (lang-sym (intern language))) (when (and (not (cdr (assq lang-sym org-babel-load-languages))) - (require - (intern (format "ob-%s" - (or (cdr (assoc (downcase language) +org-babel-mode-alist)) - language))) - nil t)) + (or (run-hook-with-args-until-success '+org-babel-load-functions language) + (require + (intern (format "ob-%s" + (or (cdr (assoc (downcase language) +org-babel-mode-alist)) + language))) + nil t))) (map-put org-babel-load-languages lang-sym t)) (apply orig-fn args))) (advice-add #'org-babel-execute-src-block :around #'+org*babel-execute-src-block)