Bagaimana cara Emacs memulai dengan banyak file secara instan?

11

Seperti yang akan diketahui oleh setiap Emacser, saya saat ini menderita konfigurasi dot-Emacs saya yang luas. Semua paket saya ada di dalam wadah use-package, dan saya bytecompile semua .elfile saya . Bahkan dengan itu, Emacs dimulai dalam 6,4 detik, dan kemudian memuat sisa paket (sekitar 40 dari mereka) sesudahnya.

Saya memikirkan cara lain untuk menyelesaikan waktu startup yang lama, lalu saya perhatikan sesuatu. Emacs default (tanpa konfigurasi pengguna) menggunakan banyak .elpustaka, yang disertakan dengan setiap Emacs. Mereka terletak di \shares\emacs\version number\lisp\.

Bahkan dengan banyak file lisp, ia berhasil memulai dalam satu detik. Ketika saya memeriksa file banyak paket yang disertakan dengan Emacs default, saya tidak menemukan apa pun yang luar biasa yang dapat menjelaskan mengapa Emacs dapat memulai dalam satu detik. Adakah yang bisa memberitahu saya bagaimana Emacs mengelola itu, bahkan dengan ribuan .elfile?

ReneFroger
sumber
1
Apakah Anda menggunakan deklarasi :defer tAnda use-packagesedapat mungkin?
lunaryorn
7
Sejumlah pustaka inti di Emacs telah dimuat sebelumnya dalam executable, melalui mekanisme dump yang digunakan ketika membangun Emacs, yang juga memberikan ilusi bahwa memuat banyak hal dengan sangat cepat. Lihat C-h i g (elisp) Building Emacsapakah Anda tertarik belajar tentang itu.
phils
2
@phils: Alangkah baiknya jika Anda dapat memperluas komentar Anda menjadi sebuah jawaban, tampaknya mekanisme dump belum disebutkan di Emacs-SE sama sekali.
paprika
and Mine adalah 76s ..
Leu_Grady
paprika: Done ..
phils

Jawaban:

9

Adakah yang bisa memberitahu saya bagaimana Emacs mengelola itu, bahkan dengan ribuan file .el?

Emacs "mengelola" bahwa dengan tidak memuat saat startup sehingga tidak menahan pemuatan aplikasi inti. Ini pada gilirannya sebagai efek mengembalikan kontrol keyboard kepada pengguna lebih cepat.

Tapi kapan itu dimuat? Saat pertama kali menggunakan fungsi, mode, atau fitur itu.

Bukankah itu melambat? Ya, pada penggunaan pertama. Itu kompromi. Apakah Anda ingin memperlambat pada saat startup emacs atau pada penggunaan pertama.

Apakah terlihat? Memuat pada waktu startup tampaknya memakan waktu lebih lama karena pustaka inti lainnya juga dimuat. Tetapi pada penggunaan pertama terasa lebih cepat karena hanya fitur subset yang dimuat.

Lalu mengapa ada orang yang mengambil beban saat startup? Karena beberapa tidak keberatan menunggu untuk memuat semua pustaka yang sering digunakan pada startup sehingga setelah dimuat semua operasi tampil dengan cepat sesudahnya.

Bagaimana saya bisa memilih? Seperti yang Drew dan yang lainnya tunjukkan dalam tanggapan mereka terhadap pertanyaan ini, Anda dapat menggunakan pengisian otomatis dan trik serupa untuk mengontrolnya. Tetapi pertimbangan yang paling penting adalah pola penggunaan Anda. Jika Anda menggunakan emacs seperti vi, terus-menerus membuka dan menutup, ya waktu startup menjadi sangat jelas. Tetapi di sisi lain, jika Anda menggunakan emacs yang berjalan sepanjang waktu, waktu startup 1 detik atau 1 menit tidak akan terlalu terlihat atau cukup penting untuk diperhatikan.

Catatan Anda dapat menggunakan mode batch atau Zile untuk startup instan saat menguji, menjalankan, atau menggunakan emacs seperti vi.

Preferensi saya adalah memuat saat permulaan sehingga setiap kesalahan terungkap dimuka. Saya lebih suka tidak harus berurusan dengan kesalahan pemuatan apa pun di tengah-tengah hari kerja ketika saya memiliki buffer yang tidak terhitung, mode, dan kompilasi status yang aktif bersama dengan beberapa lokasi terpencil yang dikelola oleh TRAMP. Debugging kesalahan pengisian otomatis dalam kondisi seperti itu sangat tidak menyenangkan.

Pengguna Emacs
sumber
10

Banyak perpustakaan yang disertakan tidak dimuat saat Anda memulai.

Beberapa perintah dll. Diisi secara otomatis , yang berarti Emacs mengenalinya dan tahu cara memuatnya. Saat Anda mencoba menggunakan perintah yang dimuat secara otomatis, Emacs kemudian memuat pustaka yang mendefinisikannya, jika belum dimuat.

Anda dapat membuat autoload Anda sendiri, baik untuk perintah Anda sendiri atau perintah di perpustakaan yang tidak Anda tulis. Lihat manual Elisp, simpul Autoload .

Drew
sumber
Dikenal sebagai pemalas, saya kira? Apakah ada contoh bagaimana lazy-loading tercapai, yang akan dimuat hanya ketika dipanggil?
ReneFroger
Tidak yakin apa yang Anda tanyakan. Ya, Anda bisa menyebutnya pemuatan malas. Ada contoh dan penjelasan dalam manual Elisp. Menambahkan cookie autoload ( ;;;###autoload) tepat sebelum definisi perintah di perpustakaan Anda adalah salah satu cara untuk memberikannya definisi autoload, memastikan bahwa perpustakaannya akan dimuat ketika seseorang memanggilnya.
Drew
... tetapi bacalah tautan manual itu untuk memahami bagaimana / jika cookie autoload itu diproses. Manajer paket menanganinya untuk semua paket ELPA. Kalau tidak, Anda akan memanggil (autoload...)langsung di file init Anda untuk mendaftarkan mereka.
phils
Terima kasih atas kedua jawaban Anda, sangat membantu untuk mengetahui lebih banyak tentang itu!
ReneFroger
9

Selain jawaban lain (yang menjelaskan bagaimana sebagian besar perpustakaan sebenarnya hanya dimuat berdasarkan permintaan), ada juga masalah pra-pemuatan banyak perpustakaan inti inti dalam emacsexecutable itu sendiri, yang memberikan ilusi tentang itu memuat sebuah banyak hal yang sangat cepat.

Hal ini dicapai dengan menjalankan apa yang disebut "telanjang" versi Emacs (yang adalah apa yang benar-benar disusun, dan yang merupakan berfungsi secara penuh, namun hanya berisi penafsir elisp dan fungsi inti lainnya ditulis dalam C), dan mengatakan bahwa untuk beban semua pustaka elisp yang harus dimuat sebelumnya, sebelum akhirnya "membuang" emacsbiner yang sebenarnya dengan pustaka yang dibangun.

Mekanisme ini dirinci dalam manual elisp:
C-hig (elisp) Building Emacs RET

Jika Anda telah mengkompilasi Emacs sendiri maka Anda dapat bereksperimen dengan proses ini, dan bahkan dapat membuang versi alternatif dari executable final jika Anda mau (umumnya tidak disarankan, tetapi fasilitas ada di sana).

temacsBiner yang dikompilasi dapat ditemukan di srcdirektori, dan Anda dapat membandingkan perbedaan waktu mulai dengan menjalankan setiap versi seperti:

$ time ./temacs -l loadup --batch
$ time ./emacs --batch

Pada sistem saya yang pertama membutuhkan ~ 4 detik (di mana 111 perpustakaan elisp dimuat), sedangkan yang kedua membutuhkan ~ 0,02 detik.

phils
sumber
@Phils sangat bagus untuk membuat poin ini.
Pengguna Emacs