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.


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

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.