2009-02-18

Emacs/Makefileを親ディレクトリ方向へ探してcompile

というわけで、リファレンスなどを見ながら書いてみた。

;;; dirから親ディレクトリ方向へ向かってfilenameを探し、最初に見つけたディレクトリ名を返す。見つからなかったらnilを返す。
(defun search-file-for-updir(dir filename)
  (cond
   ((file-exists-p (expand-file-name filename dir))
    dir)
   ((equal (expand-file-name "/") dir)
    nil)
   (t
    (search-file-for-updir (file-name-directory (directory-file-name dir)) filename))))

;;; Makefileがあるディレクトリ上でcompileする。
(defun compile-on-makefile-dir()
  (interactive)
  (let ((dir (search-file-for-updir default-directory "Makefile")))
    (if dir
	(let ((default-directory dir))
	  (command-execute 'compile))
      (message "Makefile is not found."))))
        

なんかものすごーく久しぶりにEmacs Lispを書いた。

search-file-for-updirの未発見終了判定は、(file-name-directory (directory-file-name dir))がdirと同じ物を返したら終了とするのでもいいかどうか迷った。

default-directoryをcdで変えたら、戻せなくなって困るなぁと思ったのだけど、elispは動的スコープだから適当にletで束縛しておけばいいのかなと思った。