Rekurencyjnie przejdź w górę, aby znaleźć Makefile i skompiluj

9

Problem M-x compilepolega na tym, że jeśli Makefilenie ma go w bieżącym katalogu, kończy się niepowodzeniem.

Chciałbym mieć funkcję, która rekurencyjnie idzie w górę, aby znaleźć Makefilei uruchomić makez tego katalogu.

Widziałem to pytanie , ale jest ono specyficzne dla ścieżki i muszę o tym myśleć.

Florian Margaine
źródło
Jeśli używasz, projectileistnieją sposoby na kompilację projectile-project-root. Na przykład github.com/abo-abo/helm-make
abo-abo
@ abo-abo Nie próbowałem pocisku! Wygląda na to, że projectile-compile-projectrobi to, co chcę. Ale chciałbym mieć coś bez tej zależności, jeśli to możliwe.
Florian Margaine,
dzięki, projekt pocisku-kompilacji działa dla mnie
netawater

Odpowiedzi:

15

Szukasz funkcji locate-dominating-file. Oto dokumentacja emacsa dla tej funkcji:

(locate-dominating-file FILE NAME)

Sprawdź hierarchię katalogów, FILEaby znaleźć katalog zawierający NAME. Zatrzymaj się w pierwszym katalogu nadrzędnym zawierającym plik NAMEi zwróć katalog. Wróć, niljeśli nie znaleziono. Zamiast ciągu NAMEmoże być predykatem przyjmującym jeden argument (katalog) i zwracającym wartość inną niż zero, jeśli ten katalog jest tym, którego szukamy.

Za pomocą tego można skrócić odpowiedź 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"))))
Pradhan
źródło
Miły! Ta funkcja działa podobnie do mojej pętli, ale w dobrze udokumentowany sposób obsługi krawędzi. Dzięki, dodam go do mojej listy przepisów.
abo-abo
Miły! vim ma podobną funkcję o nazwie findfile, byłem zaskoczony, że emacs go nie miał.
Florian Margaine,
Czy nie ma czegoś podobnego do seplenienia let? Biegniesz locate-dominating-filedwa razy.
Florian Margaine
@FlorianMargaine Tak, możesz użyć let. Wpisywałem odpowiedź bezpośrednio bez testowania i doszedłem do wniosku, że prawdopodobieństwo wprowadzenia niewłaściwych nawiasów jest mniejsze :)
Pradhan
Chciałbym móc więcej głosować nad tą odpowiedzią. Dziękuję Ci.
Erik
6

Kompilacja rekurencyjna, brak załączonych zależności:

(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
źródło
Niesamowite! Właśnie tego chciałem.
Florian Margaine,
OK, bądź ostrożny z końcowym stanem pętli. Jeśli korzystasz z systemu Windows, możesz uzyskać nieskończoną pętlę.
abo-abo
Boczne pytanie: dlaczego używasz with-temp-buffer?
Florian Margaine,
Tak, nie dbam o okna, ale dziękuję, że o tym wspomniałeś.
Florian Margaine,
Używam with-temp-buffer, ponieważ default-directoryjest to bufor lokalny. Nie chcę go zmieniać dla bieżącego pliku.
abo-abo