In this post I will describe the setup I use to keep my Emacs configuration file in an org-mode document, and extracting and compiling the configuration automatically when I save the file.
I keep my configuration files in a git repository. There I also have an
init.el file that will run the first time the repository is checked out. This file looks as follows:
;; This file replaces itself with the actual configuration at first run. ;; We can't tangle without org! (require 'org) ;; Open the configuration (find-file (concat user-emacs-directory "init.org")) ;; tangle it (org-babel-tangle) ;; load it (load-file (concat user-emacs-directory "init.el")) ;; finally byte-compile it (byte-compile-file (concat user-emacs-directory "init.el"))
I don’t want to track any changes to this file, so I run the following git command to make sure that later changes to this file will be ignored.
git update-index --assume-unchanged init.el
To automatically tangle and compile the org-mode document (which I call
init.org), I have the following code section in the org document. It defines function that tangles (extracts) the lisp code and byte compiles it.
#+BEGIN_SRC emacs-lisp (defun tangle-init () "If the current buffer is 'init.org' the code-blocks are tangled, and the tangled file is compiled." (when (equal (buffer-file-name) (expand-file-name (concat user-emacs-directory "init.org"))) ;; Avoid running hooks when tangling. (let ((prog-mode-hook nil)) (org-babel-tangle) (byte-compile-file (concat user-emacs-directory "init.el"))))) (add-hook 'after-save-hook 'tangle-init) #+END_SRC
This function is added to the
after-save-hook, and will be executed when the
init.org file is saved. This will produce the
init.elc file that Emacs will read when it starts.