From 61b7451b52c603f89c238ecb8bcff32c058e34ff Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 28 Jul 2019 23:28:38 +0200 Subject: [PATCH] config/literate: always tangle asynchronously Should also fix errors during tangling while running `bin/doom` commands. --- modules/config/literate/init.el | 54 +++++++++++++++------------------ 1 file changed, 25 insertions(+), 29 deletions(-) diff --git a/modules/config/literate/init.el b/modules/config/literate/init.el index 37c9f845d..050ea65a6 100644 --- a/modules/config/literate/init.el +++ b/modules/config/literate/init.el @@ -1,11 +1,11 @@ ;;; config/literate/init.el -*- lexical-binding: t; -*- (defvar +literate-config-file - (expand-file-name "config.org" doom-private-dir) + (concat doom-private-dir "config.org") "The file path of your literate config file.") (defvar +literate-config-cache-file - (expand-file-name "literate-last-compile" doom-cache-dir) + (concat doom-cache-dir "literate-last-compile") "The file path that `+literate-config-file' will be tangled to, then byte-compiled from.") @@ -13,38 +13,34 @@ byte-compiled from.") ;; (defun +literate-tangle (&optional force-p) "Tangles `+literate-config-file' if it has changed." - (let ((default-directory doom-private-dir) - (org +literate-config-file)) - (when (or force-p (file-newer-than-file-p org +literate-config-cache-file)) + (let ((default-directory doom-private-dir)) + (when (or (file-newer-than-file-p +literate-config-file + +literate-config-cache-file) + force-p) (message "Compiling your literate config...") - (let* ((org (file-truename +literate-config-file)) - (dest (concat (file-name-sans-extension org) ".el"))) - (or (and (if (fboundp 'org-babel-tangle-file) - (org-babel-tangle-file org dest "emacs-lisp") - ;; We tangle in a separate, blank process because loading it - ;; here would load all of :lang org (very expensive!). - (zerop (call-process - "emacs" nil nil nil - "-q" "--batch" - ;; HACK See lang/org/init.el on why this is necessary - "--eval" - (prin1-to-string '(defun org-release () "9.3")) - "--eval" - (prin1-to-string '(fset 'org-git-release #'ignore)) - "-l" "ob-tangle" "--eval" - (format "(org-babel-tangle-file %S %S \"emacs-lisp\")" - org dest)))) - ;; Write the cache file to serve as our mtime cache - (with-temp-file +literate-config-cache-file - (message "Done!"))) - (warn "There was a problem tangling your literate config!")))))) + (dest (concat (file-name-sans-extension org) ".el")) + (output (get-buffer-create "*org-tangle*"))) + (unwind-protect + ;; We tangle in a separate, blank process because loading it here + ;; would load all of :lang org (very expensive!). + (or (and (zerop (call-process + "emacs" nil output nil + "-q" "--batch" + "-l" "ob-tangle" + "--eval" (format "(org-babel-tangle-file %S %S)" + org dest))) + (with-current-buffer output + (message "%s" (buffer-string)) + t) + ;; Write the cache file to serve as our mtime cache + (with-temp-file +literate-config-cache-file + (message "Done!"))) + (warn "There was a problem tangling your literate config!")) + (kill-buffer output)))))) ;; Let 'er rip! -(when noninteractive - (require 'ob-tangle nil t)) - (+literate-tangle (or doom-reloading-p noninteractive)) ;; No need to load the resulting file. Doom will do this for us after all ;; modules have finished loading.