diff options
Diffstat (limited to 'Emacs/.config/emacs/elisp/literate.el')
-rw-r--r-- | Emacs/.config/emacs/elisp/literate.el | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/Emacs/.config/emacs/elisp/literate.el b/Emacs/.config/emacs/elisp/literate.el new file mode 100644 index 0000000..bb34ae9 --- /dev/null +++ b/Emacs/.config/emacs/elisp/literate.el @@ -0,0 +1,89 @@ +;;; literate.el --- My literate configuration setup -*- lexical-binding: t; -*- + +;; Copyright (C) 2023 Aryadev Chavali + +;; Author: Aryadev Chavali <aryadev@aryadevchavali.com> +;; Keywords: + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see <https://www.gnu.org/licenses/>. + +;;; Commentary: + +;; + +;;; Code: + +(defun +literate/filter (predicate list) + (if (null list) + nil + (let ((first (car list)) + (tail (cdr list))) + (if (funcall predicate first) + (cons first (+literate/filter predicate tail)) + (+literate/filter predicate tail))))) + +(defconst +literate/org-files (list (concat user-emacs-directory "config.org"))) + +(defconst +literate/output-files + (mapcar #'(lambda (x) (replace-regexp-in-string ".org" ".el" x)) +literate/org-files)) + +(defconst +literate/elisp-files + `(,(concat user-emacs-directory "early-init.el") + ,(concat user-emacs-directory "init.el") + ,@(mapcar #'(lambda (name) (concat user-emacs-directory "elisp/" name)) + ;; Only take .el files + (+literate/filter + (lambda (name) (string= "el" (file-name-extension name))) + (cddr (directory-files (concat user-emacs-directory "elisp/"))))))) + +(defconst +literate/elisp-byte-compiled + `(,@(mapcar #'(lambda (x) (replace-regexp-in-string ".el" ".elc" x)) +literate/output-files) + ,@(mapcar #'(lambda (x) (replace-regexp-in-string ".el" ".elc" x)) +literate/elisp-files))) + +;; Setup predicates and loading + +(defun +literate/--reduce-bool (bools init) + (if (= (length bools) 0) + init + (+literate/--reduce-bool (cdr bools) (and (car bools) init)))) + +(defun +literate/output-files-exist () + "Checks if output files exist, for compilation purposes." + (if (< 1 (length +literate/output-files)) + (+literate/--reduce-bool (mapc #'file-exists-p +literate/output-files) t) + (file-exists-p (car +literate/output-files)))) + +(defun +literate/load-config () + "Load all files in +literate/output-files." + (interactive) + (mapc #'(lambda (x) (load-file x)) +literate/output-files)) + +(autoload #'org-babel-tangle-file "ob-tangle") + +(defun +literate/compile-config () + "Compile all files in +literate/org-files via org-babel-tangle." + (interactive) + (message "Compiling files...") + (mapc #'org-babel-tangle-file +literate/org-files) + (message "Files compiled") + + (message "Byte-compiling literate files...") + (mapc #'(lambda (file) (byte-compile-file file)) +literate/output-files) + (message "Literate files byte-compiled") + (message "Byte compiling init.el, early-init.el, elisp/*") + (mapc #'(lambda (file) (byte-compile-file file)) +literate/elisp-files) + (message "Finishied byte-compiling")) + +(provide 'literate) +;;; literate.el ends here |