org-babel: 按需加载所有的语言

可以去提个 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 )