Tôi có thể tránh các tệp elisp được biên dịch byte lỗi thời không?


27

Thỉnh thoảng, khi tôi bắt đầu Emacs, tôi nhận được một tin nhắn như thế nào.

Tệp nguồn `/home/USER/.emacs.d/elpa/....el 'mới hơn tệp được biên dịch byte

Ngoài ra, đôi khi tôi chỉnh sửa một gói tôi đang phát triển và quên biên dịch lại nó. Khi tôi cố tải tập tin mới, tôi phải mất một lúc để nhận ra rằng Emacs vẫn đang sử dụng tập tin đã biên dịch cũ.

Có cách nào tôi có thể nói với Emacs để tránh hoàn toàn các tệp được biên dịch byte cũ hơn các tệp nguồn tương ứng của chúng không?

Câu trả lời:


35

Emacs 24.3 trở xuống

Không có cách tích hợp nào để ngăn chặn các tệp cũ này được tải, nhưng có những cách dễ dàng để loại bỏ chúng.

  • Bạn có thể biên dịch lại toàn bộ thư mục elpa bằng cách gọi :
    M-x byte-recompile-directory RET ~/.emacs.d/elpa/.
    Điều này sẽ thoát khỏi các tập tin lỗi thời.
  • Bạn có thể sử dụng gói tự động biên dịch và kích hoạt auto-compile-on-load-modecó thể biên dịch các tệp trước khi chúng được tải.

Emacs 24.4

Vâng, và nó hóa ra khá đơn giản. Các load-prefer-newer biến phục vụ chính xác mục đích này.

(setq load-prefer-newer t)

Thật không may, nó sẽ không hoạt động khi một số mã đặc biệt nhắm mục tiêu vào .elctệp, chẳng hạn như (load "server.elc"). Nhưng nó là đủ miễn là bạn đang sử dụng requirehoặc gọi loadmà không có hậu tố, mà bạn nên.

Từ tài liệu:

load-prefer-mới hơn là một biến được định nghĩa trong lread.c.
Giá trị của nó là con số không

Tài liệu:
Non-nil có nghĩa là tải thích phiên bản mới nhất của tệp.
Điều này áp dụng khi hậu tố tên tệp không được chỉ định rõ ràng và tải đang thử các hậu tố có thể khác nhau (xem hậu tố tải và hậu tố tải tệp-rep-hậu tố). Thông thường, nó dừng lại ở tệp đầu tiên tồn tại trừ khi bạn chỉ định rõ ràng cái này hay cái kia. Nếu tùy chọn này là không, nó sẽ kiểm tra tất cả các hậu tố và sử dụng tệp nào mới nhất.
Lưu ý rằng nếu bạn tùy chỉnh điều này, rõ ràng nó sẽ không ảnh hưởng đến các tệp được tải trước khi các tùy chỉnh của bạn được đọc!


1
Tôi mong mọi người nên sử dụng auto-compilethư viện (xuất sắc!) Trong Emacs 24.4+, cũng như bên dưới. Đó là một giải pháp cấu hình và quên thực sự. load-prefer-newerchỉ đảm bảo rằng bạn sẽ tiếp tục chạy mã chưa được biên dịch chậm sau khi mã được biên dịch của bạn hết hạn.
phils 20/12/14

1
@phils Ngày nay mã byte không nhanh hơn mã nguồn đơn giản, nhờ mở rộng macro háo hức.
lunaryorn

Những thay đổi tôi đã thực hiện cho chiến lược sắp xếp org-agenda (trong org-agenda.el) không được phản ánh sau khi khởi động lại, nhưng biên dịch lại các tệp .elc như được mô tả trong câu trả lời đã giải quyết vấn đề.
Earlio

17

Nếu bạn chỉ đặt load-prefer-newer(nếu có), mã chính xác sẽ được tải, nhưng nó có thể chưa được biên dịch byte, do đó có thể có một hiệu suất phạt nhẹ.

Bạn có thể sử dụng thư viện biên dịch tự động tuyệt vời của Jonas Bernoulli để đảm bảo vấn đề này không phát sinh. Cụ thể, auto-compile-on-load-modesẽ biên dịch lại .elccác tệp đã lỗi thời trước khi tải chúng.


3

Tôi đã gặp điều này trên Internet từ lâu:

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

nếu bạn làm việc với FILEchế độ emacs-lisp-mode và bạn lưu nó - đoạn mã trên sẽ xóa FILEcnếu nó tồn tại.


0

Ngoài ra, đôi khi tôi chỉnh sửa một gói tôi đang phát triển và quên biên dịch lại nó. Khi tôi cố tải tập tin mới, tôi phải mất một lúc để nhận ra rằng Emacs vẫn đang sử dụng tập tin đã biên dịch cũ.

Tôi có thể đề nghị thêm một hook trong tập tin init của bạn không?

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

Hoặc, nếu bạn muốn chỉ áp dụng hook trên các tệp el:

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

9
Whoah, điều đó sẽ cố gắng biên dịch byte ngay cả bộ đệm không elisp. Không lý tưởng! Cách mạnh mẽ để làm điều này là với gói tự động biên dịch.
sanityinc
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.