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?
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!
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.
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?
auto-compile
perpustakaan (unggul!) Di Emacs 24.4+, juga di bawah ini. Ini adalah solusi mengkonfigurasi dan melupakan yang nyata.load-prefer-newer
hanya memastikan bahwa Anda akan terus menjalankan kode yang tidak dikompilasi dengan lambat setelah kode yang dikompilasi keluar dari tanggal.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-mode
akan mengkompilasi ulang.elc
file yang sudah usang sebelum memuatnya.sumber
Saya bertemu ini di Internet sejak lama:
jika Anda bekerja dengan
FILE
dalam emacs-lisp-mode dan Anda menyimpannya - kode di atas menghapusFILEc
jika ada.sumber
Bolehkah saya menyarankan untuk menambahkan hook di file init Anda?
Atau, jika Anda ingin menerapkan pengait hanya pada file el:
sumber