Чи можу я уникнути застарілих байтових файлів elisp?


27

Іноді, коли я запускаю Emacs, отримую повідомлення на кшталт.

Вихідний файл `/home/USER/.emacs.d/elpa/....el 'новіший, ніж файл, зібраний у байтах

Крім того, я іноді редагую пакет, який розробляю, і забуваю перекомпілювати його. Коли я намагаюся завантажити новий файл, мені потрібно час, щоб зрозуміти, що Emacs все ще використовує старий зібраний файл.

Чи є спосіб я скажу Emacs повністю уникати файлів, складених у байтах, які є старшими за відповідні вихідні файли?

Відповіді:


35

Emacs 24.3 або нижче

Не існує вбудованого способу запобігання завантаженню цих старих файлів, але є прості способи їх позбутися.

  • Ви можете перекомпілювати весь каталог Elpa по телефону:
    M-x byte-recompile-directory RET ~/.emacs.d/elpa/.
    Це повинно позбутися застарілих файлів.
  • Ви можете використовувати пакет для автоматичного компілювання та активувати, auto-compile-on-load-modeякий може компілювати файли перед завантаженням.

Emacs 24.4

Так, і це виявляється досить просто. load-prefer-newer Мінлива служить саме цієї мети.

(setq load-prefer-newer t)

На жаль, це не буде працювати , якщо якісь - то коди спеціально орієнтована на .elcфайл, наприклад (load "server.elc"). Але цього повинно вистачити до тих пір, поки ви використовуєте requires або дзвоните loadбез суфікса, що вам слід.

Від док.

load-vole-newer - це змінна, визначена в lread.c.
Його значення - нульове

Документація:
Non-nil означає, що завантаження віддає перевагу новітній версії файлу.
Це застосовується, коли суфікс імені файлу не визначений явно і завантажує спроби різних можливих суфіксів (див. Суфікси load та file-rep-rep-суфікси). Зазвичай він зупиняється на першому файлі, який існує, якщо явно не вказати той чи інший файл. Якщо цей параметр не має нульового значення, він перевіряє всі суфікси та використовує той, який файл є останнім.
Зауважте, що якщо ви налаштуєте це, очевидно, це не вплине на файли, завантажені до того, як ваші налаштування будуть прочитані!


1
Я б закликав людей використовувати (чудову!) auto-compileБібліотеку в Emacs 24.4+, а також нижче. Це справжнє рішення конфігурації та забуття. load-prefer-newerгарантує лише те, що ви продовжуватимете виконувати повільний некомпільований код після того, як ваш скомпільований код застаріє.
філс

1
@phils У наш час байт-код не набагато швидший, ніж звичайний вихідний код, завдяки прагненню розширення макросу.
місячник

Зміни, внесені в стратегію сортування для порядку денного org (в org-age.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"))))))

якщо ви працюєте FILEв режимі emacs-lisp і зберігаєте його - код вище видаляється, 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
Так, це спробує байт-компілювати навіть нееліпсові буфери. Не ідеально! Надійний спосіб зробити це з пакетом автокомпіляції.
sanityinc
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.