Bagaimana cara mengompilasi byte semuanya di direktori .emacs.d saya?

140

Saya telah memutuskan untuk memeriksa Emacs, dan saya sangat menyukainya. Sekarang, saya menggunakan Emacs Starter Kit , yang menyediakan default yang lebih baik dan beberapa penyesuaian yang bagus untuk menginstal Emacs secara default.

Saya telah menyesuaikannya sedikit, menambahkan beberapa hal seperti yasnippet , tema warna , tidak terikat , dan hal-hal lainnya. Saya telah menyiapkan repositori github tempat saya menyimpan semua kustomisasi sehingga saya dapat mengaksesnya dari berbagai tempat atau jika terjadi masalah dan saya kehilangan direktori .emacs.d saya.

Semua ini sangat bagus, tetapi ada masalah: Emacs membutuhkan sekitar 1-2 detik untuk memuat. AFAIK Saya dapat mengkompilasi file .el individu dengan Mx byte-compile-file ke .elc, dan berhasil. Tetapi ada banyak sekali file .el, dan saya ingin tahu apakah ada cara untuk mengkompilasi semuanya dengan perintah sederhana atau semacamnya, untuk mempercepat pemuatan Emacs. Emacs saya tidak selalu terbuka, dan saya cukup sering membuka dan menutupnya, terutama setelah saya mengaturnya sebagai editor default untuk perintah edit di Total Commander agar terbiasa dengan lebih cepat (ya, windows xp di sini).

Versi Emacs saya adalah 22.3. Dan ya, penginstalan Emacs default tanpa penyesuaian apa pun akan langsung aktif.

Saya tidak yakin versi mana yang lebih disukai saat memuat, .el atau mengompilasi .elc satu dengan cara Oo

Jadi, apakah ada perintah elisp atau saklar baris perintah Emacs untuk membuat Emacs byte-compile semuanya di direktori .emacs.d?

Mikka
sumber

Jawaban:

214

C-u 0 M-x byte-recompile-directory

akan mengkompilasi semua file .el di direktori dan di semua subdirektori di bawah ini.

Bagian C-u 0ini membuatnya tidak menanyakan tentang setiap file .el yang tidak memiliki mitra .elc.

Laurynas Biveinis
sumber
9
Dan setelah itu (sekali masing-masing telah dikompilasi sekali), cukup gunakan perintah yang sama tanpa C-u 0(alias C-0, BTW). Itu hanya akan mengompilasi byte file sumber yang lebih baru daripada versi yang dikompilasi byte-nya.
Mundur
1
Sedikit catatan: bagi saya itu tidak berhasil sampai saya menghapus semua file «.elc» yang sesuai. Ia hanya mengatakan sesuatu seperti «Selesai, 0 file dikompilasi, α file dilewati».
Hi-Angel
1
@ Hi-Angel Saya memiliki masalah yang sama. Apakah Anda sudah menemukan solusi?
zhanxw
@hanifah. Sayangnya perintah ini hanya mengkompilasi file yang telah berubah, atau tidak memiliki mitra «.elc». Jadi untuk mengkompilasi ulang semua yang ada di direktori, pertama-tama Anda harus menghapus semua file «.elc».
Hi-Angel
3
Sayangnya, perintah interaktif tidak mengeksposnya, tetapi jika Anda memanggil fungsi secara langsung, Anda dapat menggunakan argumen opsional FORCEuntuk mengkompilasi ulang file yang sudah memiliki ".elc" terkait meskipun tidak lebih lama dari file sumber:M-: (byte-recompile-directory "/the/directory/" 0 t)
jbm
44

Untuk mengkompilasi byte secara otomatis semua yang membutuhkan kompilasi byte setiap kali saya memulai emacs, saya meletakkan yang berikut ini setelah perubahan saya ke load-pathbagian atas .emacsfile saya :

(byte-recompile-directory (expand-file-name "~/.emacs.d") 0)

Anehnya, itu tidak menambah banyak waktu startup saya (kecuali ada sesuatu yang perlu dikompilasi).

Untuk mempercepat emacs saya, pertama-tama saya mengidentifikasi bagian-bagian yang lambat menggunakan profile-dotemacs.el dan kemudian menggantinya dengan autoloads .

Richard Hansen
sumber
dokumentasi autoloads telah dipindahkan. Itu dan referensi profil-dotemacs.el persis seperti yang saya butuhkan ketika saya menemukan halaman ini.
Digicrat
24

Anda dapat menggunakan --batchbendera untuk mengkompilasi ulang dari baris perintah.

Untuk mengkompilasi ulang semua, lakukan

emacs --batch --eval '(byte-recompile-directory "~/.emacs.d")'

atau untuk mengkompilasi ulang satu file sebagai dari Makefile,

emacs --batch --eval '(byte-compile-file "your-elisp-file.el")'
Mike Samuel
sumber
5
gunakan batch-byte-compile sebagai gantinya.
npostavs
1
Bisakah Anda bagaimana cara menggunakannya?
nacho4d
8
@ nacho4d emacs -Q --batch -f batch-byte-compile *.el foo/*.el- itu tidak muncul kembali seperti byte-recompile-directory .
Brian Burns
3
Anda mungkin ingin menambahkan argumen untuk memaksa kompilasi ulang, mis. emacs --batch --eval '(byte-recompile-directory "~ / .emacs.d" 0)'
Ibrahim
17

Ini sedikit bergoyang dari pertanyaan, tetapi untuk mengatasi masalah memuat dengan lambat Anda dapat menggunakan fitur daemon baru di Emacs 23.

"Jika Anda memiliki banyak paket dukungan, pengaktifan emacs bisa agak lambat. Namun, emacs 23 menghadirkan emacs --daemon, yang memungkinkan Anda menjalankan emacs di latar belakang (misalnya saat Anda masuk). Anda dapat langsung membuka up windows emacs baru (frames) dengan emacsclient. Tentu saja, Anda sudah dapat memiliki 'server' emacs di versi yang lebih lama, tetapi dapat memulainya di latar belakang membuat ini menjadi solusi yang jauh lebih baik "

Dari http://emacs-fu.blogspot.com/2009/07/emacs-23-is-very-near.html

mwilliams.dll
sumber
Saya pasti akan memeriksa yang satu ini. Terima kasih!
Mikka
2
Jika Anda menambahkan alias emacs = 'emacsclient -nw -a "" -c' ke .bashrc Anda (atau versi shell Anda) pertama-tama akan mencoba menghubungkan ke daemon yang sedang berjalan jika ada, jika tidak itu akan memulainya dan terhubung kamu.
Frederick
2

Untuk saya yang menggunakan spacemacs, perintahnya adalah spacemacs/recompile-elpa. Perintah byte-recompile-directorytidak mengkompilasi file apa pun.

Yu Shen
sumber
2
Hal yang berbeda. Barang ELPA / MELPA telah menetapkan metode build dalam hierarki arsipnya sendiri. byte-recompile-directory mencoba untuk mengkompilasi semua file .el dalam direktori yang ditentukan pengguna.
RichieHH
1

Perintah yang saya gunakan adalah M-x byte-force-recompile RET, lalu menanyakan direktori, jadi, misalnya, saya berikan ~/.emacs.d/elpa/. Itu kemudian mengkompilasi ulang semua yang ada di sana, biasanya tidak perlu menghapus .elcfile terlebih dahulu atau mengacaukannya dengan cara lain.

Pedro Queiroga
sumber