오래된 바이트 컴파일 된 elisp 파일을 피할 수 있습니까?


27

때때로 Emacs를 시작할 때 다음과 같은 메시지가 나타납니다.

바이트 컴파일 된 파일보다 새로운 소스 파일`/home/USER/.emacs.d/elpa/....el '

또한 때로는 개발중인 패키지를 편집하고 다시 컴파일하는 것을 잊었습니다. 새 파일을로드하려고 할 때 Emacs가 여전히 오래된 컴파일 된 파일을 사용하고 있음을 깨닫는 데 시간이 걸립니다.

각각의 소스 파일보다 오래된 바이트 컴파일 파일을 완전히 피하도록 Emacs에 지시 할 수있는 방법이 있습니까?

답변:


35

이맥스 24.3 이하

이러한 오래된 파일이로드되는 것을 막는 기본 방법은 없지만 쉽게 제거 할 수있는 방법이 있습니다.

  • 다음을 호출하여 전체 elpa 디렉토리를 다시 컴파일 할 수 있습니다
    M-x byte-recompile-directory RET ~/.emacs.d/elpa/.
    오래된 파일을 제거해야합니다.
  • 자동 컴파일 패키지를 사용하여 auto-compile-on-load-mode파일을로드하기 전에 컴파일 할 수있는 파일을 활성화 할 수 있습니다.

이맥스 24.4

그렇습니다. 오히려 간단합니다. load-prefer-newer 변수 정확하게이 목적을 제공.

(setq load-prefer-newer t)

불행히도 일부 코드가 .elc파일을 특별히 대상으로 지정하면 작동하지 않습니다 ( 예 :) (load "server.elc"). 그러나 requires를 사용 하거나 load접미사없이 전화 를하는 한 충분 해야합니다.

문서에서 :

load-prefer-newer는 lread.c에 정의 된 변수입니다.
그 값은 nil입니다

설명서 :
비-닐은로드가 최신 버전의 파일을 선호 함을 의미합니다.
파일 이름 접미사가 명시 적으로 지정되지 않고로드가 다양한 접미사를 시도하는 경우에 적용됩니다 (load-suffixes 및 load-file-rep-suffixes 참조). 일반적으로 명시 적으로 지정하지 않는 한 존재하는 첫 번째 파일에서 중지됩니다. 이 옵션이 0이 아닌 경우 모든 접미사를 확인하고 최신 파일을 사용합니다.
이것을 사용자 정의하면 사용자 정의를 읽기 전에로드 된 파일에는 영향을 미치지 않습니다.


1
나는 사람들이 auto-compileEmacs 24.4+에서 (우수한!) 라이브러리 를 사용할 것을 촉구 합니다. 실제 구성 및 잊어 버린 솔루션입니다. load-prefer-newer단지 당신이 있습니다 보장 느린 컴파일되지 않은 코드를 계속 실행 하여 컴파일 된 코드를 최신의 출소 후.
— phils December

1
@phils 요즘의 매크로 확장 덕분에 바이트 코드는 일반 소스 코드보다 훨씬 빠르지 않습니다.
— lunaryorn

org-agenda-sorting-strategy (org-agenda.el)의 변경 사항은 다시 시작한 후에 반영되지 않았지만 답변에 설명 된대로 .elc 파일을 다시 컴파일하면 문제가 해결되었습니다.
— earlio

17

load-prefer-newer(사용 가능한 경우) 만 설정 하면 올바른 코드가로드되지만 바이트 컴파일되지 않았으므로 약간의 성능 저하가 발생할 수 있습니다.

Jonas Bernoulli의 우수한 자동 컴파일 라이브러리를 사용하여이 문제가 발생하지 않도록 할 수 있습니다. 특히 auto-compile-on-load-mode오래된 .elc파일을로드하기 전에 다시 컴파일 합니다.


3

나는 오래 전에 인터넷에서 이것을 만났다.

;; If you're saving an elisp file, likely the .elc is no longer valid:
(add-hook 'emacs-lisp-mode-hook 'esk-remove-elc-on-save)
(defun esk-remove-elc-on-save ()
  "If you're saving an elisp file, likely the .elc is no longer valid."
  (make-local-variable 'after-save-hook)
  (add-hook 'after-save-hook
            (lambda ()
              (if (file-exists-p (concat buffer-file-name "c"))
                  (delete-file (concat buffer-file-name "c"))))))

FILEemacs-lisp-mode에서 작업하고 저장하면 위의 코드 FILEc가 있으면 제거 됩니다.


0

또한 때로는 개발중인 패키지를 편집하고 다시 컴파일하는 것을 잊었습니다. 새 파일을로드하려고 할 때 Emacs가 여전히 오래된 컴파일 된 파일을 사용하고 있음을 깨닫는 데 시간이 걸립니다.

init 파일에 후크를 추가하는 것이 좋습니다?

(add-hook 'after-save-hook 'byte-compile-current-buffer)

또는 el 파일에만 후크를 적용하려는 경우 :

(add-hook 'emacs-lisp-mode-hook (lambda () (add-hook 'after-save-hook 'byte-compile-current-buffer nil t)))

9
Whoah, 비 Elisp 버퍼조차 바이트 컴파일하려고합니다. 이상적이지 않습니다! 이를 수행하는 강력한 방법은 자동 컴파일 패키지를 사용하는 것입니다.
— sanityinc
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.