Secara rekursif naik untuk menemukan Makefile dan kompilasi

9

Masalahnya M-x compileadalah bahwa jika Makefiletidak ada di direktori saat ini, gagal.

Saya ingin memiliki fungsi yang secara rekursif naik untuk menemukan Makefiledan menjalankan makedari direktori ini.

Saya telah melihat pertanyaan ini , tetapi khusus untuk jalurnya, dan ini adalah sesuatu yang harus saya pikirkan tentang berlari.

Florian Margaine
sumber
Jika Anda menggunakan projectileada beberapa cara untuk mengkompilasi projectile-project-root. Misalnya, github.com/abo-abo/helm-make
abo-abo
@ abo-abo Saya belum mencoba proyektil! Tampaknya projectile-compile-projectmelakukan apa yang saya inginkan. Tetapi saya ingin memiliki sesuatu tanpa ketergantungan ini, jika memungkinkan.
Florian Margaine
terima kasih, projectile-compile-project bekerja untuk saya
netawater

Jawaban:

15

Anda mencari fungsinya locate-dominating-file. Berikut ini adalah dokumentasi emacs untuk fungsi ini:

(locate-dominating-file FILE NAME)

Cari hierarki direktori dari FILEdirektori yang berisi NAME. Berhenti di direktori induk pertama yang berisi file NAME, dan kembalikan direktori. Kembali niljika tidak ditemukan. Alih-alih sebuah string, NAMEbisa juga merupakan predikat mengambil satu argumen (direktori) dan mengembalikan nilai non-nil jika direktori itu adalah yang kita cari.

Dengan menggunakan ini, jawaban abo-abo dapat disingkat menjadi

(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
sumber
Bagus! Fungsi ini melakukan hal yang mirip dengan loop saya, tetapi dengan cara penanganan terdokumentasi dan tepi-kasus. Saya akan pastikan untuk menambahkannya ke daftar resep saya, terima kasih.
abo-abo
Bagus! vim memiliki fungsi yang sama bernama findfile, saya terkejut emacs tidak memilikinya.
Florian Margaine
Bukankah ada yang mirip dengan lisp let? Anda berlari locate-dominating-filedua kali.
Florian Margaine
@FlorianMargaine Ya, Anda bisa menggunakan let. Saya mengetikkan jawabannya secara langsung tanpa pengujian dan saya pikir ini kemungkinan besar tidak memiliki tanda kurung yang salah :)
Pradhan
Saya berharap bisa lebih memilih jawaban ini. Terima kasih.
Erik
6

Kompilasi rekursif, tidak ada dependensi yang dilampirkan:

(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
sumber
Luar biasa! Inilah yang saya inginkan.
Florian Margaine
OKE, berhati-hatilah dengan kondisi akhir dari loop. Jika Anda menggunakan Windows, Anda mungkin mendapatkan loop tanpa akhir.
abo-abo
Pertanyaan sampingan: mengapa Anda menggunakan with-temp-buffer?
Florian Margaine
Ya saya tidak peduli dengan windows, tapi terima kasih sudah menyebutkannya.
Florian Margaine
Saya menggunakan with-temp-buffer, karena default-directorybuffer-lokal. Saya tidak ingin mengubahnya untuk file saat ini.
abo-abo