Bisakah saya menghindari file elisp yang dikompilasi byte yang ketinggalan zaman?

27

Kadang-kadang, ketika saya memulai Emacs, saya mendapat pesan seperti.

File sumber `/home/USER/.emacs.d/elpa/....el 'lebih baru dari file byte-yang dikompilasi

Juga, saya terkadang mengedit paket yang saya kembangkan dan lupa mengkompilasi ulangnya. Ketika saya mencoba memuat file baru, perlu beberapa saat untuk menyadari bahwa Emacs masih menggunakan file yang dikompilasi lama.

Apakah ada cara saya dapat memberitahu Emacs untuk sepenuhnya menghindari file yang dikompilasi byte yang lebih tua dari file sumbernya masing-masing?

Malabarba
sumber

Jawaban:

35

Emacs 24.3 atau lebih rendah

Tidak ada cara bawaan untuk mencegah file-file lama ini tidak dimuat, tetapi ada cara mudah untuk menghilangkannya.

  • Anda dapat mengkompilasi ulang seluruh direktori ELPA dengan memanggil:
    M-x byte-recompile-directory RET ~/.emacs.d/elpa/.
    Ini harus menyingkirkan file yang sudah ketinggalan zaman.
  • Anda dapat menggunakan paket kompilasi otomatis dan mengaktifkan auto-compile-on-load-modeyang dapat mengkompilasi file sebelum mereka dimuat.

Emacs 24.4

Ya, dan ternyata agak sederhana. The load-prefer-newer variabel menyajikan tepatnya tujuan ini.

(setq load-prefer-newer t)

Sayangnya, itu tidak akan berfungsi ketika beberapa kode secara khusus menargetkan .elcfile, seperti (load "server.elc"). Tapi itu harus cukup selama Anda menggunakan requireatau menelepon loadtanpa akhiran, yang harus Anda lakukan.

Dari dokumen:

load-prefer-baru adalah variabel yang didefinisikan dalam lread.c.
Nilainya nol

Dokumentasi:
Non-nil berarti memuat lebih suka versi terbaru file.
Ini berlaku ketika sufiks nama file tidak ditentukan secara eksplisit dan load mencoba berbagai sufiks yang mungkin (lihat load-suffix dan load-file-rep-suffixes). Biasanya, itu berhenti di file pertama yang ada kecuali Anda secara eksplisit menentukan satu atau yang lain. Jika opsi ini bukan nol, ia memeriksa semua sufiks dan menggunakan file mana pun yang terbaru.
Perhatikan bahwa jika Anda mengkustomisasi ini, jelas itu tidak akan mempengaruhi file yang dimuat sebelum kustomisasi Anda dibaca!

Malabarba
sumber
1
Saya akan mendorong orang untuk menggunakan auto-compileperpustakaan (unggul!) Di Emacs 24.4+, juga di bawah ini. Ini adalah solusi mengkonfigurasi dan melupakan yang nyata. load-prefer-newerhanya memastikan bahwa Anda akan terus menjalankan kode yang tidak dikompilasi dengan lambat setelah kode yang dikompilasi keluar dari tanggal.
phils
1
@ phils Saat ini kode byte tidak jauh lebih cepat daripada kode sumber biasa, berkat ekspansi makro yang bersemangat.
lunaryorn
Perubahan yang saya buat untuk org-agenda-sorting-strategy (dalam org-agenda.el) tidak tercermin setelah restart, tetapi mengkompilasi ulang file .elc seperti yang dijelaskan dalam jawaban memecahkan masalah.
earlio
17

Jika Anda hanya mengatur load-prefer-newer(jika tersedia), kode yang benar akan dimuat, tetapi mungkin tidak byte-dikompilasi, sehingga mungkin ada sedikit penalti kinerja.

Anda dapat menggunakan pustaka kompilasi otomatis Jonas Bernoulli yang sangat baik untuk membantu memastikan masalah ini tidak muncul. Secara khusus, auto-compile-on-load-modeakan mengkompilasi ulang .elcfile yang sudah usang sebelum memuatnya.

sanityinc
sumber
3

Saya bertemu ini di Internet sejak lama:

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

jika Anda bekerja dengan FILEdalam emacs-lisp-mode dan Anda menyimpannya - kode di atas menghapus FILEcjika ada.

Adobe
sumber
0

Juga, saya terkadang mengedit paket yang saya kembangkan dan lupa mengkompilasi ulangnya. Ketika saya mencoba memuat file baru, perlu beberapa saat untuk menyadari bahwa Emacs masih menggunakan file yang dikompilasi lama.

Bolehkah saya menyarankan untuk menambahkan hook di file init Anda?

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

Atau, jika Anda ingin menerapkan pengait hanya pada file el:

(add-hook 'emacs-lisp-mode-hook (lambda () (add-hook 'after-save-hook 'byte-compile-current-buffer nil t)))
Nsukami _
sumber
9
Whoah, itu akan mencoba untuk byte-compile bahkan buffer non-elisp. Tidak ideal! Cara kuat untuk melakukan ini adalah dengan paket kompilasi otomatis.
sanityinc