Mereka berbeda jika paket ditangguhkan, yaitu tidak dimuat sampai diperlukan. Dalam hal ini :init
akan dieksekusi pada saat file emacs Anda pertama kali dibaca, tetapi :config
akan dieksekusi pada saat paket itu sebenarnya dimuat.
Dalam contoh Anda, penggunaan mode
secara implisit mencegah pemuatan paket. Anda telah mengonfigurasi paket untuk dimuat saat pertama kali file html dikunjungi.
Anda bisa menggunakan :demand
untuk memastikan paket selalu dimuat saat startup, tetapi lebih mungkin apa yang ingin Anda lakukan di sini adalah memasukkan kait Anda :init
.
Dari docstring:
:init Code to run when `use-package' form evals.
Karena Anda meletakkan ini di file user-init Anda, itu pada dasarnya berarti akan berjalan saat startup.
:config Runs if and when package loads.
Jadi, jangan dijalankan sampai paket benar-benar dimuat ..
:defer Defer loading of package -- automatic if :commands, :bind, :bind*, :mode or :interpreter are used.
Perhatikan daftar hal-hal yang secara otomatis membuat paket ditangguhkan. Pada dasarnya jika Anda memberi tahu use-package
kondisi di mana Anda membutuhkan paket ini, ia menganggap Anda tidak ingin memuatnya sampai persyaratan itu muncul.
:demand Prevent deferred loading in all cases.
Pastikan paket dimuat saat startup, terlepas dari opsi apa yang telah Anda tentukan.
Memperbarui
Meninjau kembali ini berdasarkan pada komentar baru-baru ini ... Apa yang saya katakan di atas adalah benar, tetapi saya tidak berpikir dengan benar menjawab pertanyaan. Masalah root di sini sebenarnya html-mode
bukan paket, melainkan mode yang ditentukan oleh paket sgml-mode
. Ini berfungsi seperti yang diharapkan untuk saya:
(use-package sgml-mode
:mode ("\\.html\\'" . html-mode)
:config (add-hook 'html-mode-hook 'turn-off-auto-fill))
Dalam contoh asli, :config
ekspresi tidak pernah dievaluasi karena paket bernama html-mode
tidak pernah dimuat. Memindahkan ekspresi yang sama menjadi :init
berfungsi karena kode init selalu dievaluasi, terlepas dari apakah paket tersebut pernah dimuat.
:idle
cukup luas dan belum melihat dampak ": idle telah dihapus".auto-fill
tidak dimatikan, yaitu kode konfigurasi tidak berjalan. Saya memiliki masalah yang sama.html-mode
itu bukan paket. Setidaknya dalam versi Emacs saya saat ini,html-mode
didefinisikan dalam paketsgml-mode
. Jadi jika Anda mengatakanuse-package
untuk melakukan sesuatu ketika paket bernamahtml-mode
dimuat kode itu tidak pernah berjalan karena tidak ada paket seperti itu pernah dimuat Anda harus meletakkan pengaturan mode html di a(use-package sgml-mode ....)
.org-mode
, bukanhtml-mode
. Masalah serupa di sana adalah bahwa paket dipanggilorg-mode
, tetapi paket ELPA disebutorg
. Mungkin itu membingungkan (atau saya)?Contoh ini membuat saya lebih mudah memahami perbedaan antara
:init
dan:config
. Mari kita ambil contohace-window
paket (tetapi ini bisa berupa paket apa saja). Letakkan ini diinit.el
file Anda :Sekarang buka emacs Anda dan lihat di
*Messages*
buffer untuk melihat apakah adahello world
pesan. Anda tidak akan dapat menemukannya karena paket ditangguhkan. Sekarang ubah dariconfig
menjadiinit
:Sekarang tutup dan buka kembali emacs dan periksa
*Messages*
buffer. Anda akan melihat pesan ituace window: hello world
karena kode dijalankan apa pun yang:init
diberikan. Dalam halconfig
ini hanya akan berjalan ketika paket itu dimuat.sumber
:init
dan:preface
berdasarkan contoh Anda?:preface
dijalankan bahkan jika paket tersebut dinonaktifkan sedangkan:init
hanya dijalankan ketika paket diaktifkan.