Improve async config tangling experience
This commit is contained in:
parent
0e2ce6afae
commit
aa3233f62f
60
config.org
60
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
|
||||
|
|
Loading…
Reference in New Issue