Makefile'yi bulmak için tekrar tekrar yukarı çıkın ve derleyin


9

Sorun M-x compilevarsa yani Makefilegeçerli dizinde değil, başarısız olur.

Yinelenen bir şekilde bulmak Makefileve bu dizinden çalıştırmak bir işlevi var istiyorum make.

Bu soruyu gördüm , ama yola özgü ve koşu hakkında düşünmem gereken bir şey.


Eğer kullanıyorsanız projectilederlemek için yollar vardır projectile-project-root. Örneğin, github.com/abo-abo/helm-make
abo-abo

@ abo-abo Mermiyi denememiştim! Görünüşe göre projectile-compile-projectistediğimi yapıyor. Ama mümkünse bu bağımlılık olmadan bir şeylere sahip olmak istiyorum.
Florian Margaine

teşekkürler, mermi-derleme-proje benim için çalışıyor
netawater

Yanıtlar:


15

İşlevi arıyorsunuz locate-dominating-file. Bu işlev için emacs belgeleri şunlardır:

(locate-dominating-file FILE NAME)

FILEİçeren bir dizin için dizin hiyerarşisine bakın NAME. Dosya içeren ilk üst dizinde durun NAMEve dizini döndürün. Bulunmazsa geri dönün nil. Bir dize yerine, bir NAMEargüman (dizin) almak ve bu dizin aradığımız dizinse sıfırdan farklı bir değer döndürmek de olabilir.

Bunu kullanarak abo-abo'nin cevabı kısaltılabilir

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

Güzel! Bu işlev benim döngüme benzer bir şey yapar, ancak iyi belgelenmiş ve uç durumda işleme şeklinde. Tarif listeme eklediğinizden emin olacağım, teşekkürler.
abo-abo

Güzel! vim adlı benzer bir işlevi var findfile, emacs sahip değildi şaşırdım.
Florian Margaine

Lisp'lere benzer bir şey yok letmu? locate-dominating-fileİki kez koşuyorsun .
Florian Margaine

@FlorianMargaine Evet, let kullanabilirsiniz. Cevabı test etmeden doğrudan yazıyordum ve bunun parantezleri yanlış yerleştirme olasılığının daha düşük olduğunu düşündüm :)
Pradhan

Keşke bu cevabı daha fazla oylayabilseydim. Teşekkür ederim.
Erik

6

Özyinelemeli derleme, bağımlılık yok:

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

Müthiş! Bu tam olarak istediğim şeydi.
Florian Margaine

Tamam, sadece döngünün son durumuna dikkat edin. Windows kullanıyorsanız, sonsuz bir döngü elde edebilirsiniz.
abo-abo

Yan soru: neden kullanıyorsunuz with-temp-buffer?
Florian Margaine

Evet, pencereleri umursamıyorum, ama bahsettiğiniz için teşekkürler.
Florian Margaine

Ben kullanıyorum with-temp-buffer, çünkü default-directorybuffer-local. Geçerli dosya için değiştirmek istemiyorum.
abo-abo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.