This removes expansion of #+INCLUDE directives at tangle time because it's too much trouble to maintain a workflow that org doesn't support, without modifying the user's files, which goes against Doom's "your system your rules" mantra. The tangling process is just too brittle to hack without compounding edge cases. Fixes #5089
75 lines
3.1 KiB
EmacsLisp
75 lines
3.1 KiB
EmacsLisp
;;; config/literate/autoload.el -*- lexical-binding: t; -*-
|
|
|
|
(defvar +literate-config-file
|
|
(concat doom-private-dir "config.org")
|
|
"The file path of your literate config file.")
|
|
|
|
(defvar +literate-config-cache-file
|
|
(concat doom-cache-dir "literate-last-compile")
|
|
"The file path that `+literate-config-file' will be tangled to, then
|
|
byte-compiled from.")
|
|
|
|
(defvar org-mode-hook)
|
|
(defvar org-inhibit-startup)
|
|
|
|
;;;###autoload (add-hook 'org-mode-hook #'+literate-enable-recompile-h)
|
|
|
|
;;;###autoload
|
|
(defun +literate-tangle-h ()
|
|
"Tangles `+literate-config-file' if it has changed."
|
|
(and (not (getenv "__NOTANGLE"))
|
|
(require 'ox nil t)
|
|
(require 'ob-tangle nil t)
|
|
(letf! ((default-directory doom-private-dir)
|
|
(target +literate-config-file)
|
|
(cache +literate-config-cache-file)
|
|
(dest (expand-file-name (concat doom-module-config-file ".el")))
|
|
;; Ensure output conforms to the formatting of all doom CLIs
|
|
(defun message (msg &rest args)
|
|
(when msg
|
|
(print! (info "%s") (apply #'format msg args)))))
|
|
(print! (start "Compiling your literate config..."))
|
|
(print-group!
|
|
(let (;; Do as little unnecessary work as possible in these org files.
|
|
(org-startup-indented nil)
|
|
(org-startup-folded nil)
|
|
(vc-handled-backends nil)
|
|
;; Prevent unwanted entries in recentf, or formatters, or
|
|
;; anything that could be on these hooks, really. Nothing else
|
|
;; should be touching these files (particularly in interactive
|
|
;; sessions).
|
|
(write-file-functions nil)
|
|
(before-save-hook nil)
|
|
(after-save-hook nil)
|
|
;; Prevent infinite recursion due to recompile-on-save hooks
|
|
;; later, and speed up `org-mode' init.
|
|
(org-mode-hook nil)
|
|
(org-inhibit-startup t)
|
|
;; Allow evaluation of src blocks at tangle-time (would abort
|
|
;; them otherwise). This is a security hazard, but Doom will
|
|
;; trust that you know what you're doing!
|
|
(org-confirm-babel-evaluate nil))
|
|
(org-babel-tangle-file target dest))
|
|
;; Write an empty file to serve as our mtime cache
|
|
(with-temp-file cache)
|
|
(if doom-interactive-p t
|
|
(message "Restarting..." )
|
|
(throw 'exit "__DOOMRESTART=1 __NOTANGLE=1 $@"))))))
|
|
|
|
;;;###autoload
|
|
(defalias '+literate/reload #'doom/reload)
|
|
|
|
;;;###autoload
|
|
(defun +literate-enable-recompile-h ()
|
|
"Enable literate-compiling-on-save in the current buffer."
|
|
(add-hook 'after-save-hook #'+literate-recompile-maybe-h nil 'local))
|
|
|
|
;;;###autoload
|
|
(defun +literate-recompile-maybe-h ()
|
|
"Recompile literate config to `doom-private-dir'.
|
|
|
|
We assume any org file in `doom-private-dir' is connected to your literate
|
|
config, and should trigger a recompile if changed."
|
|
(and (file-in-directory-p
|
|
buffer-file-name (file-name-directory +literate-config-file))
|
|
(+literate-tangle-h)))
|