Eski bayt-derlenmiş elisp dosyalarını önleyebilir miyim?


27

Arada sırada Emacs'ı başlattığım zaman şöyle bir mesaj alıyorum.

Kaynak dosya `/home/USER/.emacs.d/elpa/....el 'byte-derlenmiş dosyadan daha yeni

Ayrıca, bazen geliştirdiğim bir paketi düzenliyorum ve yeniden derlemeyi unuttum. Yeni dosyayı yüklemeye çalıştığımda, Emacs'in hala eski derlenmiş dosyayı kullandığını fark etmem biraz zaman alıyor.

Emacs'a, kaynak dosyalarından daha eski olan bayt derlemeli dosyalardan tamamen kaçınmalarını söylememin bir yolu var mı?

Yanıtlar:


35

Emacs 24.3 veya altı

Bu eski dosyaların yüklenmesini önlemenin yerleşik bir yolu yoktur, ancak bunlardan kurtulmanın kolay yolları vardır.

  • Sen arayarak tüm ELPA dizini yeniden derlemek olabilir:
    M-x byte-recompile-directory RET ~/.emacs.d/elpa/.
    Bu eski dosyalardan kurtulmalı.
  • Sen kullanabilirsiniz otomatik derleme paketi ve aktive auto-compile-on-load-modeyüklenmeden önce dosyaları derlemek hangi.

Emacs 24.4

Evet ve oldukça basit olduğu ortaya çıkıyor. load-prefer-newer Değişken tam da bu amaca hizmet eder.

(setq load-prefer-newer t)

Maalesef, bazı kodlar .elcgibi dosyayı özellikle hedeflediğinde çalışmaz (load "server.elc"). Ancak, requires kullanmanız veya loadsonek kullanmadan arama yapmanız gerektiği sürece yeterli olmalıdır.

Dokümandan:

load-prefer-newer, lread.c dosyasında tanımlanan bir değişkendir.
Değeri sıfır

Belgeler:
Non-nil, load, bir dosyanın en yeni sürümünü tercih eder.
Bu, bir dosya adı soneki açıkça belirtilmediğinde ve yükleme çeşitli olası sonekleri denediğinde uygulanır (bkz. Yükleme sonekleri ve yükleme dosyası-rep-sonekleri). Normalde, birini veya diğerini açıkça belirtmediğiniz sürece varolan ilk dosyada durur. Bu seçenek sıfır değilse, tüm sonekleri kontrol eder ve hangi dosyanın en yeni olduğunu kullanır.
Bunu kişiselleştirirseniz, kişiselleştirmeleriniz okunmadan önce yüklenen dosyaları etkilemeyeceği açıktır!


1
İnsanları auto-compileEmacs 24.4+ kitaplığındaki (mükemmel!) Kütüphaneyi kullanmaya teşvik ediyorum . Gerçek bir yapılandır ve unut çözümü. load-prefer-neweryalnızca derlenmiş kodunuz güncelledikten sonra derlenmemiş yavaş kod çalıştırmaya devam etmenizi sağlar .
phils

1
@ phils Günümüzde bayt kodu, istekli makro genişletme sayesinde, düz kaynak kodundan çok daha hızlı değil.
00’de

Org-agenda-sorting stratejisinde (org-agenda.el'de) yaptığım değişiklikler bir yeniden başlatmanın ardından yansıtılmadı, ancak .elc dosyalarını cevapta açıklandığı şekilde yeniden derleme sorunu çözdü.
earlio

17

Yalnızca ayarlarsanız load-prefer-newer(varsa) doğru kod yüklenir, ancak baytla derlenmemiş olabilir, bu nedenle küçük bir performans cezası olabilir.

Bu sorunun ortaya çıkmamasını sağlamak için Jonas Bernoulli'nin mükemmel otomatik derleme kütüphanesini kullanabilirsiniz. Özellikle, auto-compile-on-load-modeeski .elcdosyaları yüklemeden önce yeniden derleyecektir .


3

Bunu internette uzun zaman önce tanıdım:

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

Eğer çalışıyorsanız FILEemacs-lisp-modu ve bunu kaydetmek - kodunu uzaklaşmaların yukarıda FILEcvarsa.


0

Ayrıca, bazen geliştirdiğim bir paketi düzenliyorum ve yeniden derlemeyi unuttum. Yeni dosyayı yüklemeye çalıştığımda, Emacs'in hala eski derlenmiş dosyayı kullandığını fark etmem biraz zaman alıyor.

İnit dosyanıza bir kanca eklemenizi önerebilir miyim?

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

Veya kancayı yalnızca el dosyalarına uygulamak istiyorsanız:

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

9
Whoah, bu elisp olmayan tamponları bile byte-derlemeye çalışacaktı. Uygun değil! Bunu yapmanın en sağlam yolu otomatik derleme paketi ile.
sanityinc
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.