というわけで、リファレンスなどを見ながら書いてみた。
;;; 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で束縛しておけばいいのかなと思った。