Kullanım paketinde init ve config arasındaki fark


16

Ben böyle bir yapılandırma var:

(use-package html-mode
  :mode "\\.html\\'"
  :config
  (progn
    (add-hook 'html-mode-hook 'turn-off-auto-fill)))

Şimdi bir HTML dosyasını ziyaret ettiğimde auto-fill, bunun kapalı olmadığını görüyorum . Ama :initbunun yerine kullanırsam :config, auto-fillkapanır. Benim sorum şu anda ne zaman :configçalıştırılan komutlar ?

Yanıtlar:


16

Paket ertelendiğinde farklıdır, yani gerekinceye kadar yüklenmez. Bu durumda :initemacs dosyanız ilk okunduğunda :configyürütülür , ancak paketin gerçekten yüklendiği sırada yürütülür.

modeÖrneğinizde , örtük olarak kullanılması paketi yüklemeyi defers. Paketi bir html dosyası ilk kez ziyaret edildiğinde yüklenecek şekilde yapılandırdınız.

:demandPaketin her zaman başlangıçta yüklendiğinden emin olmak için kullanabilirsiniz , ancak burada yapmak istediğiniz şey kancayı koymaktır :init.

Öğretiden:

:init Code to run when `use-package' form evals.

Bunu kullanıcı init dosyanıza koyduğunuz için, temelde başlangıçta çalışacağı anlamına gelir.

:config Runs if and when package loads.

Yani, paket aslında yüklenene kadar çalıştırmayın ..

:defer Defer loading of package -- automatic if :commands, :bind, :bind*,  :mode or :interpreter are used.

Bir paketi otomatik olarak ertelenen şeylerin listesine dikkat edin. Temel olarak use-package, bu pakete ihtiyacınız olan koşulları söylerseniz , bu koşullar ortaya çıkana kadar yüklemek istemediğinizi varsayar.

:demand Prevent deferred loading in all cases.

Belirttiğiniz diğer seçeneklerden bağımsız olarak, paketin başlangıçta yüklendiğinden emin olun.

Güncelleme

Son yorumlara dayanarak bunu tekrar gözden geçirmek ... Yukarıda söylediğim şey doğrudur, ancak soruyu doğru cevapladığını düşünmüyorum. Buradaki temel sorun aslında html-modebir paket değil, paket tarafından tanımlanan bir moddur sgml-mode. Bu benim için beklendiği gibi çalışıyor:

(use-package sgml-mode
  :mode ("\\.html\\'" . html-mode)
  :config (add-hook 'html-mode-hook 'turn-off-auto-fill))

Orijinal örnekte, :configifade adlı bir paket html-modeasla yüklenmediği için ifade asla değerlendirilmez . :initPaketin yüklenip yüklenmediğine bakılmaksızın init kodu her zaman değerlendirildiğinden aynı ifadeyi işe yarar.



@npostavs Teşekkürler, kayda değer. Henüz kendime-paket 2.0 kullanmaya geçmedim. Bir kere, :idleoldukça yoğun kullanıyorum ve ": rölanti kaldırıldı" etkisine bakmadım.
glucas

1
Hala neden bir HTML dosyasını ziyaret ettiğinde ve paketi yüklemek için tetiklediğinde, auto-fillkapalı değil yani yapılandırma kodu çalışmadı neden anlamıyorum. Aynı problemim var.
Ken Williams

@KenWilliams Sorununuz html modunda mı? Sanırım burada asıl sorun html-modebunun bir paket olmaması. En azından şu anki Emacs sürümünde html-mode, pakette tanımlandı sgml-mode. Dolayısıyla, use-packageadlandırılmış bir paket html-modeyüklendiğinde bir şey yapmayı söylerseniz bu kod hiçbir zaman çalışmaz çünkü bu paket yüklenmez. Html modu kurulumunu bir (use-package sgml-mode ....).
glucas

Üzgünüm - benim sorunum org-modedeğil, değil html-mode. Benzer bir sorun, paketin çağrılması org-mode, ancak ELPA paketinin çağrılmasıdır org. Belki de kafa karıştırıcı (ya da ben)?
Ken Williams

7

Bu örnek :initve ile arasındaki farkı anlamamı kolaylaştırdı :config. Bir ace-windowpaket örneği alalım (ancak bu herhangi bir paket olabilir). Bunu init.eldosyanıza koyun :

(use-package ace-window
  :ensure t
  :defer t
  :config
  (progn
    (message "ace window: hello world")))

Şimdi emac'larınızı açın ve *Messages*herhangi bir hello worldmesaj olup olmadığını görmek için tamponda görün . Paket ertelendiği için bulamazsınız. Şimdi configyerine init:

(use-package ace-window
  :ensure t
  :defer t
  :init
  (progn
    (message "ace window: hello world")))

Şimdi emacs'ı kapatıp tekrar açın ve *Messages*tamponu inceleyin . İletiyi göreceksiniz ace window: hello worldçünkü kod ne zaman :initverilirse verilsin çalıştırılır . Bu durumda configsadece bu paket yüklendiğinde çalıştırılacaktır.


yardımcı olur, sadece bir yan soru, anahtar kelime :initile :prefaceörneğinize göre arasındaki fark nedir?
doktora

@doctorate: :prefaceSöz konusu paket bile çalıştırılan devre dışı iken :initbir paket etkinken sadece çalıştırılır.
bbenne10
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.