Makefileを見つけてコンパイルするために再帰的に上昇します


9

の問題は、が現在のディレクトリにないM-x compile場合、Makefile失敗することです。

このディレクトリからを見つけてMakefile実行するために再帰的に上がる関数が欲しいのですがmake

私はこの質問を見ましたが、それはパス固有であり、実行について考えなければならないものです。


を使用しているprojectile場合は、からコンパイルする方法がありますprojectile-project-root。たとえば、github.com
abo-abo

@ abo-abo私は発射体を試していませんでした!それはprojectile-compile-project私が望むことをするようです。しかし、可能であれば、この依存関係のないものを用意したいと思います。
Florian Margaine、2015年

おかげで、projectile-compile-projectはうまく
いきました-netawater

回答:


14

あなたは機能を探していますlocate-dominating-file。この関数のemacsドキュメントは次のとおりです。

(locate-dominating-file FILE NAME)

FILEを含む ディレクトリのディレクトリ階層を検索しNAMEます。ファイルを含む最初の親ディレクトリで停止し、ディレクトリをNAME返します。nil見つからない場合は戻ります。文字列の代わりに、 NAME1つの引数(ディレクトリ)を取り、そのディレクトリが目的のディレクトリである場合は、nil以外の値を返す述語にすることもできます。

これを使用すると、abo-aboの答えは次のように短縮できます。

(defun desperately-compile ()
  "Traveling up the path, find a Makefile and `compile'."
  (interactive)
  (when (locate-dominating-file default-directory "Makefile")
  (with-temp-buffer
    (cd (locate-dominating-file default-directory "Makefile"))
    (compile "make -k"))))

いいね!この関数は私のループに似ていますが、十分に文書化された、エッジケースの処理方法です。おかげで、必ずレシピリストに追加します。
abo-abo 2015年

いいね!vimにはと呼ばれる同様の関数がありますがfindfile、emacsにそれがないことに驚きました。
Florian Margaine、2015年

lispのようなものはありませんletか?あなたはlocate-dominating-file二度走っています。
Florian Margaine、2015年

@FlorianMargaineはい、letを使用できます。私はテストせずに直接答えを入力していましたが、これが括弧の位置を間違えている可能性が低いことがわかりました:)
Pradhan

私はこの回答をもっと賛成投票できればいいのにと思います。ありがとうございました。
エリック

6

再帰的なコンパイル、依存関係なし:

(defun desperately-compile ()
  "Traveling up the path, find a Makefile and `compile'."
  (interactive)
  (with-temp-buffer
    (while (and (not (file-exists-p "Makefile"))
                (not (equal "/" default-directory)))
      (cd ".."))
    (when (file-exists-p "Makefile")
      (compile "make -k"))))

驚くばかり!これはまさに私が欲しかったものです。
Florian Margaine、2015年

OK、ループの終了条件に注意してください。Windowsを使用している場合は、無限ループが発生する可能性があります。
abo-abo 2015年

副題:なぜ使用していwith-temp-bufferますか?
Florian Margaine、2015年

うん、私は窓は気にしないが、それについて言及してくれてありがとう。
Florian Margaine、2015年

はバッファローカルなwith-temp-bufferので、私はを使用していますdefault-directory。現在のファイルでは変更したくありません。
abo-abo 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.