Ricorsivamente, vai su per trovare Makefile e compilare


9

Il problema M-x compileè che se Makefilenon si trova nella directory corrente, non riesce.

Mi piacerebbe avere una funzione che ricorsivamente sale per trovare un Makefileed eseguire makeda questa directory.

Ho visto questa domanda , ma è specifica del percorso ed è qualcosa che devo pensare di correre.


Se stai usando projectileci sono modi per compilare projectile-project-root. Ad esempio, github.com/abo-abo/helm-make
a bordo del

@ abo-abo Non avevo provato il proiettile! Sembra che projectile-compile-projectfaccia quello che voglio. Ma mi piacerebbe avere qualcosa senza questa dipendenza, se possibile.
Florian Margaine,

grazie, projectile-compile-project funziona per me
netawater,

Risposte:


15

Stai cercando la funzione locate-dominating-file. Ecco la documentazione di emacs per questa funzione:

(locate-dominating-file FILE NAME)

Cercare la gerarchia di directory da FILEper una directory contenente NAME. Arrestare nella prima directory principale contenente un file NAMEe restituire la directory. Ritorna nilse non trovato. Invece di una stringa, NAMEpuò anche essere un predicato che accetta un argomento (una directory) e restituisce un valore diverso da zero se quella directory è quella per cui stiamo cercando.

Usando questo, la risposta di abo-abo può essere abbreviata in

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

Bello! Questa funzione fa una cosa simile al mio loop, ma in modo ben documentato e maneggevole. Mi assicurerò di aggiungerlo al mio elenco di ricette, grazie.
abo-ABO

Bello! vim ha una funzione simile chiamata findfile, ero sorpreso che emacs non ce l'avesse.
Florian Margaine,

Non c'è qualcosa di simile a Lisp let? Stai correndo locate-dominating-filedue volte.
Florian Margaine,

@FlorianMargaine Sì, puoi usare let. Stavo scrivendo la risposta direttamente senza test e ho pensato che era meno probabile che avessero smarrito le parentesi :)
Pradhan

Vorrei poter votare di più su questa risposta. Grazie.
Erik,

6

Compilazione ricorsiva, nessuna dipendenza allegata:

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

Eccezionale! Questo è esattamente quello che volevo.
Florian Margaine,

OK, stai solo attento alle condizioni finali del loop. Se sei su Windows, potresti ottenere un ciclo infinito.
a bordo del

Domanda a margine: perché stai usando with-temp-buffer?
Florian Margaine,

Sì, non mi interessa Windows, ma grazie per averlo menzionato.
Florian Margaine,

Io uso with-temp-buffer, perché default-directoryè buffer-local. Non voglio cambiarlo per il file corrente.
a bordo del
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.