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.


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"))))

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"))))

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.