;; [[file:init-emacs.org::*Init][Init:1]]
;; -*- mode: emacs-lisp; lexical-binding: t; no-byte-compile: t -*-
;;==============================================================================
;;; init.el
;;
;;; Bootstrap Emacs Initialization File
;;
;; Author: Kyle W T Sherman
;;
;; This file was generated from init-emacs.org and should not be edited
;; manually.
;;
;; init-emacs.org => init.el
;;==============================================================================

;;------------------------------------------------------------------------------
;;; Org/Babel Bootstrap: Custom Tangle
;;------------------------------------------------------------------------------

;; (defun org-babel-generate-elisp-file (file &optional byte-compile force)
;;   "Generate an emacs-lisp file from an org-babel FILE.

;; Additionally, byte compile the file if BYTE-COMPILE is
;; non-nil.

;; Process file even if timestamp is not newer than target if FORCE
;; is non-nil."
;;   (let* ((case-fold-search t)
;;          (file-base (concat (file-name-directory user-init-file) "init-emacs"))
;;          (file-org (file-truename (concat file-base ".org")))
;;          (file-elisp (file-truename (concat file-base ".el")))
;;          (file-comp (file-truename (concat file-base ".elc")))
;;          (heading-regexp "^\*+ ")
;;          (heading-comment-regexp "^\*+ COMMENT ")
;;          (begin-regexp "^[ \t]*#\\+BEGIN_SRC emacs-lisp")
;;          (begin-tangle-regexp "^[ \t]*#\\+BEGIN_SRC .*:tangle ")
;;          (end-regexp "^[ \t]*#\\+END_SRC")
;;          (indent-regexp "^  "))
;;     ;; generate elisp file if needed
;;     (when (or force
;;               (not (file-exists-p file-elisp))
;;               (file-newer-than-file-p file-org file-elisp))
;;       (message "Writing %s..." file-elisp)
;;       (with-temp-file file-elisp
;;         (insert-file-contents file)
;;         (goto-char (point-min))
;;         (let (code
;;               headings-counts
;;               (level 1)
;;               (comment-level 0)
;;               (end-comment ""))
;;           (while (not (eobp))
;;             (cond
;;              ;; comment heading
;;              ((let ((case-fold-search nil))
;;                 (looking-at heading-comment-regexp))
;;               (setq level (/ (- (match-end 0) (line-beginning-position) 8) 2))
;;               (when (or (zerop comment-level)
;;                         (< level comment-level))
;;                 (setq comment-level level))
;;               (delete-region (line-beginning-position) (progn (forward-line 1) (point))))
;;              ;; normal heading
;;              ((looking-at heading-regexp)
;;               (setq level (/ (- (match-end 0) (line-beginning-position)) 2))
;;               (when (or (zerop comment-level)
;;                         (<= level comment-level))
;;                 (setq comment-level 0)
;;                 (if (assoc level headings-counts)
;;                     (setf (cdr (assoc level headings-counts))
;;                           (cons (buffer-substring-no-properties (match-end 0) (line-end-position)) 1))
;;                   (setq headings-counts (append headings-counts (list (cons level (cons "No heading" 1)))))))
;;               (delete-region (line-beginning-position) (progn (forward-line 1) (point))))
;;              ;; start of tangled source block
;;              ((and (looking-at begin-regexp)
;;                    (zerop comment-level)
;;                    (not (looking-at begin-tangle-regexp))) ; skip blocks with their own tangle directive
;;               (let* ((heading-count (cdr (assoc level headings-counts)))
;;                      (heading (car heading-count))
;;                      (count (cdr heading-count)))
;;                 (delete-region (line-beginning-position) (progn (forward-line 1) (point)))
;;                 (unless (bobp)
;;                   (newline))
;;                 (when (fboundp 'org-link-escape)
;;                   (insert (format ";; [[file:%s::*%s][%s:%s]]\n" file-org (org-link-escape heading) heading count))
;;                   (setq end-comment (format ";; %s:%s ends here\n" heading count))
;;                   (cl-incf (cddr (assoc level headings-counts))))
;;                 (setq code t)))
;;              ;; end of tangled source block
;;              ((and code
;;                    (looking-at end-regexp))
;;               (delete-region (line-beginning-position) (progn (forward-line 1) (point)))
;;               (insert end-comment)
;;               (setq code nil
;;                     end-comment ""))
;;              ;; inside tangled source block
;;              (code
;;               (when (looking-at indent-regexp)
;;                 (delete-char (if (boundp 'org-edit-src-content-indentation)
;;                                  org-edit-src-content-indentation
;;                                2)))
;;               (forward-line 1))
;;              ;; outside tangled source block
;;              (t
;;               (delete-region (line-beginning-position) (progn (forward-line 1) (point))))))
;;           (time-stamp))
;;         (message "Wrote %s..." file-elisp)))
;;     ;; byte compile elisp file if needed
;;     (when (and byte-compile
;;                (or (not (file-exists-p file-comp))
;;                    (file-newer-than-file-p file-elisp file-comp)))
;;       (byte-compile-file file-elisp))))

;; ;; generate and load main init file
;; (let* ((file-base (concat (file-name-directory user-init-file) "init-emacs"))
;;        (file-org (file-truename (concat file-base ".org")))
;;        (file-elisp (file-truename (concat file-base ".el")))
;;        (file-comp (file-truename (concat file-base ".elc"))))
;;   ;; do not try to byte compile the generated file as it will fail since our environment is not setup
;;   (org-babel-generate-elisp-file file-org)
;;   ;; delete any existing byte compiled init file to prevent an outdated version from loading
;;   (when (file-exists-p file-comp)
;;     (delete-file file-comp))
;;   (if (file-exists-p file-elisp)
;;       (load file-elisp)
;;     (message "Error loading %s" file-elisp)))

;;------------------------------------------------------------------------------
;;; Org/Babel Bootstrap: Normal Tangle
;;------------------------------------------------------------------------------

(require 'ob-tangle)
(setq vc-follow-symlinks t)

;; generate (if needed) and load main init file
(let* ((file-base (concat (file-name-directory user-init-file) "init-emacs"))
       (file-org (file-truename (concat file-base ".org")))
       (file-elisp (file-truename (concat file-base ".el")))
       (file-comp (file-truename (concat file-base ".elc"))))
  ;; do not try to byte compile the generated file as it will fail since our environment is not setup
  (when (file-newer-than-file-p file-org file-elisp)
    (org-babel-tangle-file file-org))
  ;; delete any existing byte compiled init file to prevent an outdated version from loading
  (when (file-exists-p file-comp)
    (delete-file file-comp))
  (if (file-exists-p file-elisp)
      (load file-elisp)
    (message "Error loading %s" file-elisp)))

;;==============================================================================
;;; init.el ends here
;;==============================================================================
;; Init:1 ends here