Gehen Sie rekursiv nach oben, um Makefile zu finden und zu kompilieren

9

Das Problem dabei M-x compileist, dass das Makefilefehlschlägt , wenn es sich nicht im aktuellen Verzeichnis befindet.

Ich hätte gerne eine Funktion, die rekursiv nach oben geht, um eine zu finden Makefileund makevon diesem Verzeichnis aus auszuführen .

Ich habe diese Frage gesehen , aber sie ist pfadspezifisch und ich muss über das Laufen nachdenken.

Florian Margaine
quelle
Wenn Sie verwenden, projectilegibt es Möglichkeiten zum Kompilieren projectile-project-root. Zum Beispiel github.com/abo-abo/helm-make
abo-abo
@ abo-abo Ich hatte kein Projektil ausprobiert! Es scheint, dass das projectile-compile-projectmacht, was ich will. Aber ich würde gerne etwas ohne diese Abhängigkeit haben, wenn möglich.
Florian Margaine
danke, projectile-compile-project funktioniert für mich
netawater

Antworten:

14

Sie suchen die Funktion locate-dominating-file. Hier ist die Emacs-Dokumentation für diese Funktion:

(locate-dominating-file FILE NAME)

Suchen Sie in der Verzeichnishierarchie FILEnach einem Verzeichnis mit NAME. Halten Sie am ersten übergeordneten Verzeichnis an, das eine Datei enthält NAME, und geben Sie das Verzeichnis zurück. Rückgabe, nilwenn nicht gefunden. Anstelle einer Zeichenfolge NAMEkann auch ein Prädikat verwendet werden, das ein Argument (ein Verzeichnis) verwendet und einen Wert ungleich Null zurückgibt, wenn dieses Verzeichnis dasjenige ist, nach dem wir suchen.

Auf diese Weise kann die Antwort von abo-abo auf verkürzt werden

(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"))))
Pradhan
quelle
Nett! Diese Funktion macht eine ähnliche Funktion wie meine Schleife, jedoch auf eine gut dokumentierte und randfallbezogene Weise. Ich werde es auf jeden Fall meiner Rezeptliste hinzufügen, danke.
abo-abo
Nett! vim hat eine ähnliche Funktion namens findfile, ich war überrascht, dass Emacs sie nicht hatte.
Florian Margaine
Gibt es nicht etwas Ähnliches wie bei Lisp let? Du rennst locate-dominating-filezweimal.
Florian Margaine
@FlorianMargaine Ja, Sie könnten let verwenden. Ich tippte die Antwort direkt ein, ohne sie zu testen, und stellte fest, dass dies weniger wahrscheinlich ist, dass Klammern falsch platziert wurden :)
Pradhan
Ich wünschte, ich könnte diese Antwort mehr abstimmen. Vielen Dank.
Erik
6

Rekursive Kompilierung, keine Abhängigkeiten angehängt:

(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"))))
abo-abo
quelle
Genial! Genau das wollte ich.
Florian Margaine
OK, seien Sie vorsichtig mit dem Endzustand der Schleife. Wenn Sie unter Windows arbeiten, wird möglicherweise eine Endlosschleife angezeigt.
abo-abo
Nebenfrage: Warum benutzt du with-temp-buffer?
Florian Margaine
Ja, Fenster interessieren mich nicht, aber danke, dass du sie erwähnt hast.
Florian Margaine
Ich benutze with-temp-buffer, weil default-directoryes pufferlokal ist. Ich möchte es nicht für die aktuelle Datei ändern.
abo-abo