compile/literate: refactor & recompile on save

And add autoloaded commands. This may need work to ensure you don't
spawn multiple instances of Emacs all vying to compile the same file.
This commit is contained in:
Henrik Lissner 2018-06-05 16:09:03 +02:00
parent f5fe36af23
commit 47efd56fd4
No known key found for this signature in database
GPG key ID: 5F6C0EA160557395
2 changed files with 50 additions and 21 deletions

View file

@ -0,0 +1,23 @@
;;; config/literate/autoload.el -*- lexical-binding: t; -*-
;;;###autoload
(add-hook 'org-mode-hook #'+literate|enable-compile-on-save)
;;;###autoload
(defun +literate|enable-compile-on-save ()
"TODO"
(add-hook 'after-save-hook #'+literate|compile-on-save nil 'local))
;;;###autoload
(defun +literate|compile-on-save ()
"TODO"
(when (and (eq major-mode 'org-mode)
buffer-file-name
(file-in-directory-p buffer-file-name )))
(+literate/compile))
;;;###autoload
(defun +literate/compile (&optional load)
"TODO"
(interactive "P")
(+literate-compile load))

View file

@ -1,31 +1,37 @@
;;; config/literate/config.el -*- lexical-binding: t; -*-
(defvar +literate-config-file "config.org"
"The literate config file, searched for in `doom-private-dir' (unless this is
an absolute path).")
(defvar +literate-config-file
(expand-file-name "config.org" doom-private-dir)
"The file path of your literate config file.")
(defvar +literate-config-dest-file "config.el"
"The file that `+literate-config-file' will be tangled to, then byte-compiled
from.")
(defvar +literate-config-dest-file
(expand-file-name "config.el" doom-private-dir)
"The file path that `+literate-config-file' will be tangled to, then
byte-compiled from.")
;;
(let ((org (expand-file-name +literate-config-file doom-private-dir))
(elc (expand-file-name (concat +literate-config-dest-file "c") doom-private-dir)))
;; If config is pre-compiled, then load that
(when (file-newer-than-file-p org elc)
;; We tangle in a separate, blank process because loading it here would load
;; all of :lang org, which will be more expensive than it needs to be.
(or (zerop (call-process
"emacs" nil nil nil
"-q" "--batch" "-l" "ob-tangle" "--eval"
(format "(org-babel-tangle-file \"%s\" \"%s\" \"emacs-lisp\")"
org +literate-config-dest-file)))
(error "There was a problem tangling your literate config!"))
(defun +literate-compile (&optional load)
"Tangles & compiles `+literate-config-file' if it has changed. If LOAD is
non-nil, load it too!"
(let ((org +literate-config-file)
(elc (concat +literate-config-dest-file "c")))
;; If config is pre-compiled, then load that
(when (file-newer-than-file-p org elc)
;; We tangle in a separate, blank process because loading it here would load
;; all of :lang org, which will be more expensive than it needs to be.
(or (zerop (call-process
"emacs" nil nil nil
"-q" "--batch" "-l" "ob-tangle" "--eval"
(format "(org-babel-tangle-file \"%s\" \"%s\" \"emacs-lisp\")"
org +literate-config-dest-file)))
(error "There was a problem tangling your literate config!"))
;; Then byte-compile it!
(require 'bytecomp)
(byte-compile-file +literate-config-dest-file load))))
;; Then byte-compile it!
(require 'bytecomp)
(byte-compile-file +literate-config-dest-file)))
;; Let 'er rip!
(+literate-compile)
;; No need to load the resulting file. Doom will do this for us after all
;; modules have finished loading.