可以去提个 issue,按需加载是比较省心一点。
advice 没必要用 :around
,用 :before
就可以了。而且 info
参数已经包含所有信息,直接使用即可:
(defun my/org-babel-execute-src-block (&optional _arg info _params)
"Load language if needed"
(let* ((lang (nth 0 info))
(sym (if (member (downcase lang) '("c" "cpp" "c++")) 'C (intern lang)))
(backup-languages org-babel-load-languages)
(pair (assoc sym backup-languages)))
;; - `(LANG . nil)' 是有意义的,不宜覆盖,详见 `org-babel-do-load-languages'。
;; - 只加载当前语言,「按需」到底。
(unwind-protect
(org-babel-do-load-languages 'org-babel-load-languages (list (cons sym t)))
(setq-default org-babel-load-languages
(if pair
backup-languages
(append (list (cons sym t)) backup-languages))))))
(advice-add 'org-babel-execute-src-block :before #'my/org-babel-execute-src-block )