재귀 적으로 Makefile을 찾고 컴파일


9

문제는 M-x compile(가) 경우이다 Makefile현재 디렉토리에없는, 실패.

이 디렉토리에서 a를 찾아 Makefile실행 하기 위해 재귀 적으로 올라가는 기능을 갖고 싶습니다 make.

나는 본 적이 이 질문을 하지만, 경로 별, 그리고 내가 가진 그것의 뭔가가 실행에 대한 생각.


당신이 사용하는 projectile경우 컴파일 방법이 있습니다 projectile-project-root. 예를 들어, github.com/abo-abo/helm-make
abo-abo

@ abo-abo 나는 발사체를 시도하지 않았습니다! projectile-compile-project내가 원하는 것을하는 것 같습니다 . 그러나 가능한 경우이 종속성이없는 것을 갖고 싶습니다.
Florian Margaine

나를 위해 감사, 발사체 - 컴파일 프로젝트 작품
netawater

답변:


15

함수를 찾고 있습니다 locate-dominating-file. 이 기능에 대한 emacs 문서는 다음과 같습니다.

(locate-dominating-file FILE NAME)

FILE포함 된 디렉토리 에서 디렉토리 계층을 찾습니다 NAME. file을 포함하는 첫 번째 상위 디렉토리에서 중지하고 디렉토리를 NAME리턴하십시오. nil찾을 수 없으면 반환 합니다. 문자열 대신 NAME하나의 인수 (디렉토리)를 사용하고 해당 디렉토리가 우리가 찾고있는 디렉토리 인 경우 0이 아닌 값을 반환하는 술어가 될 수 있습니다.

이것을 사용하여 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

좋은! vim은이라는 이름의 비슷한 기능을 가지고 있는데 findfile, emacs에없는 것이 놀랍습니다.
Florian Margaine

lisp와 비슷한 것이 let없습니까? 당신은 locate-dominating-file두 번 달리고 있습니다.
Florian Margaine

@FlorianMargaine 예, let을 사용할 수 있습니다. 나는 테스트없이 직접 답을 입력하고 이것이 괄호를 잘못 배치했을 가능성이 적다는 것을 알았습니다 :)
Pradhan

이 답변을 더 많이 투표 할 수 있기를 바랍니다. 감사합니다.
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

네, 창문은 신경 쓰지 않지만 언급 해 주셔서 감사합니다.
Florian Margaine

버퍼 로컬 with-temp-buffer이기 default-directory때문에을 사용 합니다. 현재 파일에 대해 변경하고 싶지 않습니다.
abo-abo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.