Improve async config tangling experience

This commit is contained in:
TEC 2021-10-01 05:07:12 +08:00
parent 0e2ce6afae
commit aa3233f62f
Signed by: tec
GPG Key ID: 779591AFDB81F06C
1 changed files with 42 additions and 18 deletions

View File

@ -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