diff --git a/config.org b/config.org index 9f30ad3..b0bb74d 100644 --- a/config.org +++ b/config.org @@ -969,15 +969,51 @@ Doom adds an =org-mode= hook ~+literate-enable-recompile-h~. This is a nice idea but it's too blocking for my taste. Since I trust my tangling to be fairly straightforward, I'll just redefine it to a simpler, async, function. #+begin_src emacs-lisp +(defvar +literate-tangle--proc nil) +(defvar +literate-tangle--proc-start-time nil) + (defadvice! +literate-tangle-async-h () "A very simplified version of `+literate-tangle-h', but async." :override #'+literate-tangle-h (let ((default-directory doom-private-dir)) - (async-shell-command - (format "emacs --batch --eval \"(progn \ -(require 'org) (setq org-confirm-babel-evaluate nil) \ -(org-babel-tangle-file \\\"%s\\\"))\"" - +literate-config-file)))) + (when +literate-tangle--proc + (message "Killing outdated tangle process...") + (set-process-sentinel +literate-tangle--proc #'ignore) + (kill-process +literate-tangle--proc) + (sit-for 0.3)) ; ensure the message is seen for a bit + (setq +literate-tangle--proc + (start-process "tangle-config" + (get-buffer-create " *tangle config*") + "emacs" "--batch" "--eval" + (format "(progn \ +(require 'org) \ +(setq org-confirm-babel-evaluate nil) \ +(org-babel-tangle-file \"%s\"))" +literate-config-file)) + +literate-tangle--proc-start-time (float-time)) + (set-process-sentinel +literate-tangle--proc #'+literate-tangle--sentinel) + (run-at-time nil nil (lambda () (message "Tangling config.org"))) ; ensure shown after a save message + "Tangling config.org...")) + +(defun +literate-tangle--sentinel (process signal) + (cond + ((and (eq 'exit (process-status process)) + (= 0 (process-exit-status process))) + (message "Tangled config.org sucessfully (took %.1fs)" + (- (float-time) +literate-tangle--proc-start-time)) + (setq +literate-tangle--proc nil)) + ((memq (process-status process) (list 'exit 'signal)) + (+popup-buffer (get-buffer " *tangle config*")) + (message "Failed to tangle config.org (after %.1fs)" + (- (float-time) +literate-tangle--proc-start-time)) + (setq +literate-tangle--proc nil)))) + +(defun +literate-tangle-check-finished () + (when (and (process-live-p +literate-tangle--proc) + (yes-or-no-p "Config is currently retangling, would you please wait a few seconds?")) + (switch-to-buffer " *tangle config*") + (signal 'quit nil))) +(add-hook! 'kill-emacs-hook #'+literate-tangle-check-finished) +#+end_src #+end_src *** Dashboard quick actions @@ -1470,19 +1506,7 @@ anything to be run. (message ";; setup.sh did not exist during tangle. Tangle again.") (pp-to-string `(unless noninteractive - (add-hook! 'doom-init-ui-hook - (let ((default-directory doom-private-dir)) - (setq tangle-proc (start-process "tangle-config" (get-buffer-create " *tangle config*") - "emacs" "--batch" "--eval" - (format "(progn \ -(require 'org) \ -(setq org-confirm-babel-evaluate nil) \ -(org-babel-tangle-file \"%s\"))" +literate-config-file))) - (add-hook! 'kill-emacs-hook - (when (and (process-live-p tangle-proc) - (yes-or-no-p "Config is currently retangling, would you please wait a few seconds?")) - (switch-to-buffer " *tangle config*") - (signal 'quit nil)))))))) + (add-hook! 'doom-init-ui-hook #'+literate-tangle-async-h)))) #+end_src #+begin_src emacs-lisp :noweb no-export