Emacs birçok el dosyasıyla anında başlamayı nasıl başarır?


11

Her Emacs'ın bileceği gibi, şu anda kapsamlı dot-Emacs yapılandırmamdan muzdaripim. Tüm paketlerim kaplar içinde use-packageve tüm .eldosyalarımı bytecompiled. Bununla bile, Emacs 6.4 saniye içinde başlar ve daha sonra paketlerin geri kalanını (yaklaşık 40 tanesi) yükler.

Uzun başlangıç ​​zamanını çözmenin başka bir yolunu düşünüyordum, sonra bir şey fark ettim. Varsayılan Emacs (kullanıcı yapılandırması olmadan), .elher Emacs ile birlikte gelen birçok kitaplığı kullanır . Bulundukları yer \shares\emacs\version number\lisp\.

Birçok lisp dosyasıyla bile, bir saniyede başlamayı başarır. Varsayılan Emacs ile gelen birçok paketin dosyalarını incelerken, Emacs'ın neden bir saniye içinde başlamayı başarabileceğini sıra dışı bir şey bulamadım. Birisi bana binlerce .eldosyada bile Emacs'ın bunu nasıl yönettiğini söyleyebilir mi?


1
Kullanıyor musunuz :defer tsenin içinde use-packagemümkün olan her yerde bildirimleri?
lunaryorn

7
Emacs içindeki çok sayıda çekirdek kütüphanesi, Emacs'ı oluştururken kullanılan dökümü mekanizması aracılığıyla yürütülebilir dosyaya önceden yüklenir , bu da çok fazla şeyi inanılmaz derecede hızlı bir şekilde yüklemesine yanılsamasını verir. Bunu öğrenmek isteyip istemediğinize bakın . C-h i g (elisp) Building Emacs
phils

2
@phils: Yorumunuzu bir cevaba genişletebilmeniz harika olurdu, döküm mekanizmasının henüz Emacs-SE'de hiç bahsedilmediği anlaşılıyor.
kırmızı biber

and Mine is 76s ..
Leu_Grady

kırmızı biber: Bitti ..
phils

Yanıtlar:


9

Birisi bana binlerce .el dosyasıyla bile Emacs'ın bunu nasıl yönettiğini söyleyebilir mi?

Emacs, başlangıçta yüklenmemesi ve böylece temel uygulamanın yüklenmesini engellememesini "yönetir". Bu, klavye kontrolünü kullanıcıya daha hızlı geri döndürmenin bir etkisi olarak.

Ancak ne zaman yüklenir? Bu işlevin, modun veya özelliğin ilk kullanımında.

Yavaşlamıyor mu? Evet, ilk kullanımda. Bu değiş tokuş. Emacs başlangıç ​​zamanında veya ilk kullanımda yavaşlamak istiyor musunuz?

Fark edilir mi? Başlangıçta yükleme işlemi, diğer çekirdek kütüphaneler de yüklendikçe daha uzun sürer. Ancak ilk kullanımda, yalnızca bu alt küme özelliği yüklendiğinden daha hızlı hissedilir.

O zaman neden birisi başlangıçta yük seçsin? Bazıları başlangıçta sık kullanılan tüm kitaplıkları yüklemeyi beklemediğinden, yüklendikten sonra tüm işlemler daha sonra kolayca gerçekleştirilir.

Nasıl seçebilirim? Drew ve diğerlerinin bu soruya verdikleri yanıtlarda belirttikleri gibi, kontrol etmek için otomatik yükleme ve benzer numaralar kullanabilirsiniz. Ancak en önemli husus kullanım modeliniz olmalıdır. Vi gibi emacs kullanırsanız, sürekli açılır ve kapanırsanız, evet başlangıç ​​zamanı acı verici bir şekilde belirginleşir. Ancak diğer taraftan, sürekli çalışan emac'ler kullanırsanız, 1 saniye veya 1 dakikalık başlatma süresi, dikkat edilmesi gereken kadar belirgin veya önemli olmayacaktır.

Vi gibi emac'leri test ederken, çalıştırırken veya başka bir şekilde anında başlatma için toplu mod veya Zile kullanabileceğinizi unutmayın .

Benim tercihim, başlangıçta yükleme yapmaktır, böylece herhangi bir hata önceden yakalanır. TRAMP tarafından yönetilen birkaç uzak konum ile birlikte sayısız arabellek, mod ve derleme durumum olduğunda bir iş gününün ortasındayken herhangi bir yük hatasıyla uğraşmamayı tercih ederim. Bu gibi durumlarda otomatik yükleme hatalarının ayıklanması çok hoş değildir.


10

Başlatıldığında dahil edilen kitaplıkların çoğu yüklenmez.

Bazı komutlar vb vardır otomatik yüklenmesi Emacs bunları tanır ve bunları nasıl yerleştirileceği bilir hangi araçları. Otomatik olarak yüklenen bir komutu kullanmaya çalıştığınızda, Emacs henüz yüklenmemişse, onu tanımlayan kitaplığı yükler.

Kendi komutlarınız veya yazmadığınız kitaplıklardaki komutlarınız için kendi otomatik yüklemelerinizi oluşturabilirsiniz. Elisp kılavuzuna bakın, Autoload düğümü .


Tembel yükleme olarak bilinen, sanırım? Sadece çağrıldığında yüklenecek tembel yüklemenin nasıl yapıldığına dair bir örnek var mı?
ReneFroger

Ne sorduğundan emin değilim. Evet, buna tembel yükleme diyebilirsiniz. Elisp kılavuzunda örnekler ve açıklamalar bulunmaktadır. ;;;###autoloadKitaplığınızdaki bir komut tanımından hemen önce bir otomatik yükleme çerezi ( ) eklemek, otomatik yükleme tanımı vermenin bir yoludur ve birisi onu çağırdığında kitaplığının yüklenmesini sağlar.
Drew

... ancak bu otomatik yükleme çerezlerinin nasıl işlenip işlenmediğini anlamak için bu bağlantıyı okuyun. Paket yöneticisi bunları tüm ELPA paketleri için işler. Aksi takdirde (autoload...), onları kaydetmek için doğrudan init dosyanızda arama yaparsınız .
phils

Her iki cevabınız için teşekkürler, daha fazla bilgi edinmeniz çok yardımcı oldu!
ReneFroger

9

Diğer cevaplara ek olarak (kütüphanelerin çoğunun aslında sadece talep üzerine nasıl yüklendiğini açıklar), yürütülebilir dosyanın içindeki birçok çekirdek elisp kütüphanesinin önceden yüklenmesi sorunu vardır ve bu da emacsbir inanılmaz hızlı bir şekilde bir çok şey.

Bu sözde Emacs versiyonu "çıplak" çalıştırarak elde (aslında derlenmiştir budur ve hangi edilir ise tam işlevsel, ama sadece elisp tercüman ve C ile yazılmış diğer temel işlevselliği içerir), ve yük bunu söylemen önceden yüklenmiş olması gereken tüm elisp kütüphaneleri, nihayet gerçek emacskütüphaneyi yerleşik kütüphanelerle "boşaltmadan" önce .

Bu mekanizma elisp kılavuzunda ayrıntılı olarak açıklanmıştır:
C-hig (elisp) Building Emacs RET

Emacs'ı kendiniz derlediyseniz, bu işlemi deneyebilir ve hatta isterseniz son çalıştırılabilir dosyanın alternatif sürümlerini dökebilirsiniz (genellikle önerilmez, ancak tesis oradadır).

Derlenmiş temacsikili srcdizinde bulunabilir ve her sürümü aşağıdaki gibi çalıştırarak başlangıç ​​zamanlarındaki farkı karşılaştırabilirsiniz:

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

Sistemimde eski ~ 4 saniye sürer (bu süre zarfında 111 elisp kütüphanesi yüklenir), ikincisi ~ 0.02 saniye sürer.


Bu noktayı belirtmek için çok güzel @ philils.
Emacs Kullanıcısı
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.