I like the ability to automatically byte compile my .emacs file but never had Emacs behave in a way that was acceptable to me. In particular, the interaction between debugging a .emacs file and automatic byte compile sometimes is troublesome. The solution for me which is least bad is to automatically byte compile on save of the .emacs buffer. To do this, add the following code to your .emacs.
(defun auto-recompile-emacs-file ()
(interactive)
(when (and buffer-file-name (string-match "\\.emacs" buffer-file-name))
(let ((byte-file (concat buffer-file-name "\\.elc")))
(if (or (not (file-exists-p byte-file))
(file-newer-than-file-p buffer-file-name byte-file))
(byte-compile-file buffer-file-name)))))
(add-hook 'after-save-hook 'auto-recompile-emacs-file)
Sam Morar suggests a more general solution of automatically compiling after saving a lisp-mode buffer.
(add-hook 'emacs-lisp-mode-hook '(lambda ()
(add-hook 'after-save-hook 'emacs-lisp-byte-compile t t))
)
Michael Hoffman points out that one might not want to compile all lisp files. His suggestion is to compile only if a corresponding .elc file already exists.
8 comments:
Using `byte-recompile-file' (and with an option to force):
(defun auto-recompile-emacs-file (&optional force)
(interactive "P")
(when (and buffer-file-name (string-match "\\.emacs" buffer-file-name))
(byte-recompile-file buffer-file-name force)))
I use this to byte-compile all lisp files upon save, which obviously includes the emacs config file:
(add-hook 'emacs-lisp-mode-hook '(lambda ()
(add-hook 'after-save-hook 'emacs-lisp-byte-compile t t))
)
Hi, Michael, I think the optional argument applies only to byte-recompile-directory. Correct me if I'm wrong.
Thanks Sam for the suggestion of a more general solution.
How about auto-async-byte-compile?
One doesn't have to wait for finishing compiling.
http://www.emacswiki.org/emacs/auto-async-byte-compile.el
You don't necessarily want to compile all Elisp files. Some should not be compiled. I use this code to automatically compile any where the *.elc file already exists.
Thanks kiwanami for the automatic and asynchronous solution!
You are correct Michael H. I guess this depends on individual requirements.
Post a Comment