Đệ quy đi lên để tìm Makefile và biên dịch


9

Vấn đề M-x compilelà nếu Makefilekhông có trong thư mục hiện tại, nó sẽ thất bại.

Tôi muốn có một hàm đệ quy đi lên để tìm Makefilevà chạy maketừ thư mục này.

Tôi đã thấy câu hỏi này , nhưng nó cụ thể theo đường dẫn và đó là điều tôi phải suy nghĩ về việc chạy.


Nếu bạn đang sử dụng, projectilecó nhiều cách để biên dịch projectile-project-root. Chẳng hạn, github.com/abo-abo/mus-make
abo-abo

@ abo-abo Tôi chưa thử bắn! Dường như đó là projectile-compile-projectnhững gì tôi muốn. Nhưng tôi muốn có một cái gì đó mà không có sự phụ thuộc này, nếu có thể.
Florian Margaine

cảm ơn, dự án biên dịch dự án làm việc cho tôi
netawater

Câu trả lời:


14

Bạn đang tìm kiếm chức năng locate-dominating-file. Dưới đây là tài liệu emacs cho chức năng này:

(locate-dominating-file FILE NAME)

Tra cứu hệ thống phân cấp thư mục từ FILEcho một thư mục chứa NAME. Dừng lại ở thư mục cha đầu tiên chứa một tệp NAMEvà trả về thư mục. Trả lại nilnếu không tìm thấy. Thay vì một chuỗi, NAMEcũng có thể là một vị từ lấy một đối số (một thư mục) và trả về một giá trị không phải là không nếu thư mục đó là đối số mà chúng ta đang tìm kiếm.

Sử dụng điều này, câu trả lời của abo-abo có thể được rút ngắn thành

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

Đẹp! Hàm này thực hiện một thao tác tương tự như vòng lặp của tôi, nhưng theo cách xử lý tài liệu tốt và trường hợp cạnh. Tôi chắc chắn sẽ thêm nó vào danh sách công thức của tôi, cảm ơn.
abo-abo

Đẹp! vim có một chức năng tương tự được đặt tên findfile, tôi đã ngạc nhiên khi emacs không có nó.
Florian Margaine

Không có cái gì đó tương tự như lisp let? Bạn đang chạy locate-dominating-filehai lần.
Florian Margaine

@FlorianMargaine Vâng, bạn có thể sử dụng let. Tôi đã gõ câu trả lời trực tiếp mà không cần kiểm tra và nhận ra rằng điều này ít có khả năng bị đặt sai dấu ngoặc đơn :)
Pradhan

Tôi ước tôi có thể bình chọn câu trả lời này nhiều hơn. Cảm ơn bạn.
Erik

6

Biên dịch đệ quy, không có phụ thuộc kèm theo:

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

Tuyệt vời! Đây chính xác là những gì tôi muốn.
Florian Margaine

OK, chỉ cần cẩn thận với điều kiện kết thúc của vòng lặp. Nếu bạn đang ở trên Windows, bạn có thể nhận được một vòng lặp vô tận.
abo-abo

Câu hỏi phụ: tại sao bạn sử dụng with-temp-buffer?
Florian Margaine

Vâng, tôi không quan tâm đến các cửa sổ, nhưng cảm ơn vì đã đề cập đến nó.
Florian Margaine

Tôi sử dụng with-temp-buffer, bởi vì default-directorylà bộ đệm cục bộ. Tôi không muốn thay đổi nó cho tập tin hiện tại.
abo-abo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.