Tembel bir başlatmayı nereye eklemeliyim?


13

Lateks moduna belirli bir anahtar bağlama eklemek istiyorum:

(define-key latex-mode-map (kbd "<f6>") 'my-latex-defun)

Aynı zamanda sadece belirli bir mod yüklendiğinde ayarlamak istiyorum. Bu yüzden bunu latex-mode-hookgerçekleştirmek için uygun hook ( ) kullanma veya (with-eval-after-load "tex-mode" ...anahtar bağlama tanımını sarmak için yan tümce kullanma arasında bir tercih (en iyi uygulama) olup olmadığını bilmek istiyorum . Her ikisini de test ettim ve iyi çalışıyorlar, ancak hangisinin bunu yapmanın doğru yolu olduğunu merak ediyorum.


2
with-eval-after-loadbir kez yüklendiğinden , bir tuş eşlemesi değişikliği oraya gider. Kancalar , mod her çalıştırıldığında yüklenir, örn. Modla ilişkili yeni bir dosya yüklenirken veya kanca tanımlanır. Örneğin flyspell-modeveya hl-line-modebir kancaya yüklersiniz. Benim içinde init.elben kullanım with-eval-after-loadyaklaşık 160 kat ve add-hook110 kez. Tembel bir init iyi bir inittir (IMO).
rasmus

Eğer zamanınız varsa @rasmus bir cevap gibi geliyor :) Bence kodun kaç kez çalıştırıldığının ayrımı, dikkate alınması gereken ana sorundur. (Aynı zamanda düşünebildiğim tek kişi de…)
Sean Allred

O yüzden kötü bir fikir modu kanca kilit bağları değiştirmek için bkz emacs.stackexchange.com/questions/990/...
Tarsius

Yanıtlar:


18

Tembel bir init iyi bir inittir.

(IMO)

Ne zaman kullanılır? with-eval-after-load

with-eval-after-loadyüklendikten sonra belli olduğunda özellik veya dosya olduğu ilk bir klavye düzenini değiştirme açıkça içeride bunlardan biri gider, böylece yüklendi. En azından değil, çünkü anahtar haritası init-time'da bilinmeyebilir [ (define-key message-mode-map (kbd "C-c f") 'Footnote-add-footnote)in gibi bir şey deneyin emacs -q]. Bir kancanın bir değil güzel bir tuşa işlevini bağlar beri burada çözüm her kanca başlatılır zaman. Gibi Tarsius notları yapabilirsiniz devamı neden değil için local-set-keykancaları.

Son olarak, with-eval-after-loadGNU Emacs 24.4'ün, alıntı yapılmasının gerekmediği eval-after-loadyerlerde 2 satırlık bir paket olduğunu unutmayın body.

Kancalar ne zaman kullanılır?

Kancalar, bir ölçüt her karşılandığında yüklenen işlevlerin listesidir, örneğin belirli bir mod başlatılır. Kancaların yaygın kullanımı, flyspell-modeveya gibi küçük modları yüklemektir hl-line-mode. Örn (add-hook 'org-agenda-mode-hook 'hl-line-mode). As Rémi işaret, add-hooksakıllı ve kanca değişken henüz yüklenen olsa bile doğru olanı yapacağız. Bununla birlikte, hız kazanımları için ihmal edilebilir, ancak organizasyon ve bağımlılık yapısı hissi veren aşağıdaki gibi birçok cümleyim var:

(with-eval-after-load 'org-agenda
  (add-hook 'org-agenda-mode-hook 'hl-line-mode))

Neden sonra kanca eklemek için org-agenda? Her zaman olduğu gibi C-h v org-agenda-mode-hook C-jteslim eder. Kanca, org-agenda.elgösterildiği gibi tanımlanır *help*.

Ek özellikler yükleniyor with-eval-after-load

with-eval-after-loadekstra özelliklerin yüklenmesi için de önemlidir. Muhtemelen (with-eval-after-load 'org (require 'org-inlinetask))kuruluş içi satır içi görevleri yüklemek istersiniz. Nedenini görmek için (find-library "org-inlinetask"). org-inlinetasks.elDoğrudan beri (require 'org), autoloaddost Emacs sürdürmek için büyük özen gösterdi tüm güzel "göz ardı edilecek" ve tüm org.el(c)yüklenecektir.

Peki ya (kişisel) defunbirkaç yere ihtiyaç duyulursa? Gerçekten seçiciyseniz, defuns'yi başka bir dosyaya load-pathekleyebilir ve autoloadçerezler ekleyebilir veya Emacs'a işlevle işlevi nerede bulacağını söyleyebilirsiniz autoload. Sonra böyle bir şey işe yarayacaktır:

(autoload 'org-cdlatex-mode "org" "cdlatex mode from org.")
(with-eval-after-load "latex"
  (add-hook 'TeX-mode-hook 'org-cdlatex-mode))

Ya require orgda aynen çekeceği gibicdlatex

Ve dürüst olmak gerekirse, kişisel defun çoğu zaman init zaman için çok önemli olmayacaktır. 1150 satırlık kişisel defun (84 defun) init.elvanilya Emacs'a 0.02s ekliyor.

Başlatma zamanının ölçülmesi

Başlatma süresine yaklaşmanın kolay bir yolu

time emacs --eval "(kill-emacs)"

karşılaştırmalı değerlendirme emacs -q.

Ancak, başlatma darboğazlarının nerede olduğu hakkında daha ayrıntılı bir yaklaşım için Joe Schafer's'e bakın esup.

Son olarak, yükleme süresi sihirli bir şekilde kaybolmaz. Yalnızca ileriye doğru itiyorsunuz (her oturumdaki tüm özellikleri kullandığınız sürece).


1
Add-hook'u bir load-eval-after-load içine koymanıza gerek yoktur, çünkü add-hook zaten orada değilse değişkeni bağlar.
Rémi

Haklısın! Yine de ondan hız kazancı olabilir mi? [Bunu daha sonra yansıtmak için cevabı daha sonra güncellemeye çalışacağım]
rasmus

Sonra bir kanca veya anahtar bağlama bağlamak istiyorum defuns hakkında ne. with-eval-after-loadTembel başlatma avantajlarını kaybetmeden dışında bir kusur tanımlamalı mıyım ?
jrbalderrama

5

eval-after-loadBir kanca önerilerinize ve bir kancaya ek olarak, önereyim use-package.el. İhtiyacınız olanı yapabilirsiniz

(use-package latex
  :ensure auctex
  :bind ("<f6>" . my-latex-defun))

LaTeX kadar yüklenmeyecektir sonra bunu talep ediyoruz.

Bir yan not olarak: dikkatli kullanımı, use-packagebaşlangıç ​​sürelerimi bir saniyenin altına indirdi. (Eskiden dört saniye sürüyordu.)


Öneriniz için teşekkür ederiz. Ben de use-package kullanmayı düşündüm ama gerçekten ek paketler olmadan nasıl yapılacağını bulmak istiyorum.
jrbalderrama

1
@jrbalderrama use-package, Emacs 25 ile birlikte gönderilecek not
Sean Allred
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.