递归地找到Makefile并进行编译


9

问题M-x compile在于,如果Makefile不在当前目录中,它将失败。

我想要一个递归地查找Makefilemake从该目录运行的函数。

我已经看到了这个问题,但这是特定于路径的,这是我必须考虑运行的问题。


如果您使用的projectile是从中进行编译的方法projectile-project-root。例如,github.com/abo
-

@ abo-abo我没试过弹丸!似乎projectile-compile-project可以满足我的要求。但是,如果可能的话,我想拥有一些没有这种依赖性的东西。
Florian Margaine 2015年

谢谢,projectile-compile-project为我工作
netawater

Answers:


15

您正在寻找功能locate-dominating-file。这是此功能的emacs文档:

(locate-dominating-file FILE NAME)

从中查找目录层次结构,FILE以查找包含的目录 NAME。在包含文件的第一个父目录处停止NAME,然后返回目录。nil如果找不到则返回。代替字符串的 NAME还可以是谓词,该谓词可以接受一个参数(一个目录),并且如果该目录是我们要查找的目录,则返回一个非null值。

使用此功能,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

真好!vim有一个类似的函数名为findfile,我很惊讶emacs没有它。
Florian Margaine 2015年

有没有类似于Lisp的东西let?您正在跑步locate-dominating-file两次。
Florian Margaine 2015年

@FlorianMargaine是的,您可以使用let。我直接在没有测试的情况下直接输入答案,并认为这不太可能放错括号:)
Pradhan 2015年

我希望我可以对这个答案进行更多投票。谢谢。
埃里克

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

附带问题:您为什么使用with-temp-buffer
Florian Margaine 2015年

是的,我不在乎Windows,但感谢您提及它。
Florian Margaine 2015年

我使用with-temp-buffer,因为default-directory是本地缓冲区。我不想为当前文件更改它。
abo-abo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.