오래된 바이트 컴파일 된 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.