Emacs Lisp auto-compile.elを公開しました
自作の Emacs Lisp auto-compile.el を公開しました。
これは何か?
C, C++などのコードをEmacs上で編集しているときに、ファイルを保存したタイミングで、バックグラウンドで make コマンドが自動で実行されます。
以下のようなメリットがあると思われます。
- いちいち terminal で makeしなくて良いので、開発効率があがる
- 保存時に行われるのでコンパイルエラーが早い段階で発見でき、開発効率があがる
このような感じ
C-x C-s で保存すると make が自動で実行されます
コンパイルが終われば OK がでます(エラーが発生すれば表示されます)

インストール方法
sf.netから auto-compile.el をダウンロードしロードパスが通っている場所に置く。
.emacsに
(require 'auto-compile) ;; auto-compileを有効にする path の設定 (setq auto-compile-target-path-regexp-list (list "Linux" "FreeBSD" "Foo\/src"))
おまけ
GNU GLOBALのGTAGSの自動更新機能もこっそりと実装されています。
不具合など
不具合の御指摘、要望はお気軽にどうぞ。
ソースコード
;;; auto-compile.el --- auto compile support for developers.
;; Copyright (C) 2006 Higepon <higepon at users.sourceforge.jp>
;; Version: 0.0.1
;; Author: Higepon <higepon at users.sourceforge.jp>
;; Maintainer: Higepon <higepon at users.sourceforge.jp>
;; Require : compile.el
;; History
;;; Commentary:
;;; What is auto-compile?
;;; When you are writing "hello.c" source code with Emacs.
;;; After you save file with C-x C-s, "make" command runs automatically on background.
;;; So you have no need to change Window to terminal,enter make command, and back to Emacs.
;;; Install
;; (require 'auto-compile)
;; ;; enable auto-compile for your projects
;; (setq auto-compile-target-path-regexp-list (list "Linux" "FreeBSD" "Foo\/src"))
;;; Variables
(defvar auto-compile-auto-update-gtags t "*update gtags if t")
(defvar auto-compile-target-file-regexp-list (list "\.cpp$" "\.h$" "\.c$" "\.asm$") "*target file type")
(defvar auto-compile-target-path-regexp-list (list "src") "*target file type")
;;; Code
(defun auto-compile-after-save-hook ()
(if (and (auto-compile-target-path-p) (auto-compile-target-file-type-p))
(progn
(if auto-compile-auto-update-gtags
(auto-compile-update-gtags))
(auto-compile-do-compile))))
(defun auto-compile-do-compile ()
(let ((makefile (expand-file-name "Makefile")))
(if (file-exists-p makefile)
(auto-compile-silent-compile makefile "make" 'auto-compile-do-compile-finish-function))))
(defun auto-compile-do-compile-finish-function (buffer result)
(if (string-match "abnormally" result)
(progn
(setq compilation-finish-function nil)
(auto-compile-show-compile-error result))
(message "[auto-compile]:compile ok.")))
;;; Code utilities
(defun auto-compile-show-compile-error (error)
"show compile result"
(replace-regexp-in-string "\n" "" error)
(message "[auto-compile]:%s" error))
(defun auto-compile-silent-compile (makefile command finish-function)
"Compile with minimum window height."
(let ((save-height compilation-window-height))
(save-current-buffer
(setq compilation-window-height 1)
(setq compilation-finish-function finish-function)
(set-buffer (find-file-noselect makefile))
(ad-activate-regexp "auto-compile-yes-or-no-p-always-yes")
(message "[auto-compile]:%s at %s" command makefile)
(compile command)
(ad-deactivate-regexp "auto-compile-yes-or-no-p-always-yes")
(setq compilation-window-height save-height))))
(defun auto-compile-target-path-p ()
"Current buffer is target?"
(auto-compile-list-or
(mapcar (lambda (x) (string-match x (buffer-file-name)))
auto-compile-target-path-regexp-list)))
(defun auto-compile-target-file-type-p ()
"Current buffer is source file?"
(auto-compile-list-or
(mapcar (lambda (x) (string-match x (buffer-file-name)))
auto-compile-target-file-regexp-list)))
(defun auto-compile-list-or (list)
(if (consp list)
(or (car list) (auto-compile-list-or (cdr list)))))
(defun auto-compile-update-gtags ()
"Update GTAGS file"
(let ((status (call-process "global" nil nil nil "-uv")))
(if (= status 0)
(message "[auto-compile]:GTAGS updated"))))
(defun auto-compile-cleanup ()
"Clean up add-hooks for auto-compile.el."
(remove-hook 'after-save-hook 'auto-compile-after-save-hook)
(setq compilation-finish-function nil))
(defadvice yes-or-no-p (around auto-compile-yes-or-no-p-always-yes)
"Return always yes."
(setq ad-return-value t))
(defadvice compilation-start (around auto-compile-compilation-start)
(message "[auto-compile]:now compiling")
ad-do-it)
;;; Code install
(auto-compile-cleanup)
(add-hook 'after-save-hook 'auto-compile-after-save-hook)
(ad-activate-regexp "auto-compile-compilation-start")
(provide 'auto-compile)