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