Sube recursivamente para encontrar Makefile y compilar

9

El problema M-x compilees que si Makefileno está en el directorio actual, falla.

Me gustaría tener una función que suba recursivamente para encontrar ay Makefileejecutar makedesde este directorio.

He visto esta pregunta , pero es específica de la ruta y es algo en lo que tengo que pensar en correr.

Florian Margaine
fuente
Si está utilizando projectilehay formas de compilar projectile-project-root. Por ejemplo, github.com/abo-abo/helm-make
abo-abo el
@ abo-abo ¡No había probado el proyectil! Parece que projectile-compile-projecthace lo que quiero. Pero me gustaría tener algo sin esta dependencia, si es posible.
Florian Margaine
gracias, obras de compilación del proyecto proyectil para mí
netawater

Respuestas:

14

Estás buscando la función locate-dominating-file. Aquí está la documentación de emacs para esta función:

(locate-dominating-file FILE NAME)

Busque la jerarquía de directorios desde FILEun directorio que contenga NAME. Deténgase en el primer directorio principal que contiene un archivo NAMEy devuelva el directorio. Regresar nilsi no se encuentra. En lugar de una cadena, NAMEtambién puede ser un predicado que toma un argumento (un directorio) y devuelve un valor no nulo si ese directorio es el que estamos buscando.

Usando esto, la respuesta de abo-abo se puede acortar a

(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
fuente
¡Agradable! Esta función hace algo similar a mi bucle, pero de una manera bien documentada y de manejo de casos extremos. Me aseguraré de agregarlo a mi lista de recetas, gracias.
abo-abo
¡Agradable! vim tiene una función similar llamada findfile, me sorprendió que emacs no la tuviera.
Florian Margaine
¿No hay algo similar al lisp let? Estás corriendo locate-dominating-filedos veces.
Florian Margaine
@FlorianMargaine Sí, podrías usar let. Estaba escribiendo la respuesta directamente sin probarla y pensé que era menos probable que hubiera entre paréntesis fuera de lugar :)
Pradhan
Desearía poder votar más esta respuesta. Gracias.
Erik
6

Compilación recursiva, sin dependencias adjuntas:

(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
fuente
¡Increíble! Esto es exactamente lo que quería.
Florian Margaine
OK, solo ten cuidado con la condición final del bucle. Si está en Windows, puede obtener un bucle sin fin.
abo-abo
Pregunta secundaria: ¿por qué estás usando with-temp-buffer?
Florian Margaine
Sí, no me importan las ventanas, pero gracias por mencionarlo.
Florian Margaine
Yo uso with-temp-buffer, porque default-directoryes buffer-local. No quiero cambiarlo por el archivo actual.
abo-abo