ขึ้นไปซ้ำ ๆ เพื่อค้นหา Makefile และคอมไพล์


9

ปัญหาM-x compileคือถ้าMakefileไม่ได้อยู่ในไดเรกทอรีปัจจุบันก็ล้มเหลว

ฉันต้องการที่จะมีฟังก์ชั่นที่เกิดขึ้นซ้ำ ๆ เพื่อค้นหาMakefileและเรียกใช้makeจากไดเรกทอรีนี้

ฉันเคยเห็นคำถามนี้แต่มันเป็นแบบเฉพาะเส้นทางและเป็นสิ่งที่ฉันต้องคิดเกี่ยวกับการทำงาน


หากคุณกำลังใช้มีวิธีที่จะรวบรวมจากprojectile projectile-project-rootตัวอย่างเช่นgithub.com/abo-abo/helm-make
abo-abo

@ abo-abo ฉันไม่ได้ลองกระสุน! ดูเหมือนว่าprojectile-compile-projectจะเป็นสิ่งที่ฉันต้องการ แต่ฉันต้องการมีบางสิ่งหากปราศจากการพึ่งพานี้
Florian Margaine

ขอบคุณ projectile-compile-project ใช้ได้กับฉัน
netawater

คำตอบ:


15

locate-dominating-fileคุณกำลังมองหาฟังก์ชั่น นี่คือเอกสาร emacs สำหรับฟังก์ชั่นนี้:

(locate-dominating-file FILE NAME)

เงยหน้าขึ้นมองไดเรกทอรีลำดับชั้นจากไดเรกทอรีที่มีFILE NAMEหยุดที่ไดเร็กทอรีพาเรนต์แรกที่มีไฟล์NAMEและส่งคืนไดเร็กทอรี ส่งคืนnilหากไม่พบ แทนที่จะเป็นสตริงคุณ NAMEสามารถใช้เพรดิเคตรับหนึ่งอาร์กิวเมนต์ (ไดเรกทอรี) และส่งคืนค่าที่ไม่ใช่ศูนย์ได้หากไดเรกทอรีนั้นเป็นไดเรกทอรีที่เรากำลังมองหา

การใช้สิ่งนี้คำตอบของ abo-abo สามารถย่อให้สั้นลงได้

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

ดี! ฟังก์ชั่นนี้ทำสิ่งที่คล้ายกับลูปของฉัน แต่ในวิธีการจัดการเอกสารและขอบอย่างดี ฉันจะทำให้แน่ใจว่าจะเพิ่มลงในรายการสูตรของฉันขอบคุณ
abo-abo

ดี! เป็นกลุ่มมีฟังก์ชั่นที่คล้ายกันชื่อfindfileฉันรู้สึกประหลาดใจ emacs ไม่ได้
Florian Margaine

มีอะไรที่คล้ายกับเสียงกระเพื่อมletหรือไม่? คุณทำงานlocate-dominating-fileสองครั้ง
Florian Margaine

@FlorianMargaine ใช่คุณสามารถใช้ let ผมก็พิมพ์คำตอบโดยตรงโดยไม่ต้องทดสอบและคิดนี้เป็นโอกาสน้อยที่จะมีวงเล็บใส่ผิด :)
พรัด

ฉันหวังว่าฉันจะโหวตคำตอบนี้ได้มากกว่านี้ ขอบคุณ.
Erik

6

คอมไพล์แบบเรียกซ้ำไม่มีการอ้างอิงที่แนบ:

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

! น่ากลัว นี่คือสิ่งที่ฉันต้องการ
Florian Margaine

ตกลงเพียงระวังสภาพสิ้นสุดของลูป หากคุณใช้ Windows คุณอาจได้รับการวนซ้ำไม่รู้จบ
abo-abo

คำถามด้านข้าง: เหตุผลที่คุณจะใช้with-temp-buffer?
Florian Margaine

ใช่ฉันไม่สนใจ windows แต่ขอบคุณที่พูดถึงมัน
Florian Margaine

ฉันใช้with-temp-bufferเพราะdefault-directoryเป็นบัฟเฟอร์ในเครื่อง ฉันไม่ต้องการเปลี่ยนเป็นไฟล์ปัจจุบัน
abo-abo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.