Jawaban:
Apakah ada aturan yang digunakan pengguna untuk menentukan apakah konfigurasi paket memerlukan
:init
atau:config
?
Tidak ada aturan umum yang berlaku untuk semua pengaturan dan paket; Anda hanya perlu membiasakan diri dengan arti kata kunci ini dengan membaca file README dari use-package
.
Singkatnya, :init
blok dijalankan pada saat startup, seolah-olah Anda telah meletakkan form-form konstituennya di tingkat atas (yaitu di luar panggilan khas ke use-package
) dari Anda user-init-file
. Ini berarti mereka selalu dijalankan, terlepas dari apakah paket yang sesuai telah dimuat atau belum.
The :config
blok, di sisi lain, dijalankan setelah paket yang sesuai telah dimuat, dengan cara dari eval-after-load
mekanisme.
Dengan demikian, Anda dapat meningkatkan waktu startup Anda dengan memindahkan pengaturan lama yang berlaku dari :init
ke :config
. Jika Anda perlu memodifikasi variabel yang hanya didefinisikan setelah memuat paket tertentu, Anda juga perlu menempatkan ini di :config
blok. Beberapa variabel, seperti gnus-home-directory
, perlu disetel sebelum paket yang sesuai dimuat, sehingga harus ditempatkan :init
. Saya sangat menyarankan menempatkan semua panggilan add-hook
/ yang berlaku remove-hook
di :init
blok, karena kait dapat dimodifikasi bahkan ketika tidak terikat, dan ini memberi lebih banyak modularitas untuk pengaturan Anda.
Anda seringkali dapat menghindari harus mencari tahu di mana menempatkan pengaturan tertentu dengan menggunakan :custom
kata kunci baru , atau dengan menggunakan antarmuka Kustomisasi Mudah secara langsung.
Saya tidak yakin apakah ada aturan umum (selain dari "gunakan :init
untuk prakonfigurasi sebelum pemuatan paket yang sebenarnya dan gunakan :config
untuk konfigurasi lainnya, baik," ").
Tapi saya sendiri gunakan :init
ketika, misalnya, saya ingin menambahkan beberapa keybindings peta mode lain untuk menggunakan fungsi dari paket "ini". Dan masih ingin paket "ini" menjadi malas dimuat.
Berikut adalah contoh pemuatan malas dired-ranger
:
(use-package dired-ranger
:commands (dired-ranger-copy dired-ranger-paste dired-ranger-move)
:init
(add-hook 'dired-mode-hook
(lambda ()
(define-key dired-mode-map (kbd "M-w") 'dired-ranger-copy)
(define-key dired-mode-map (kbd "C-y") 'dired-ranger-paste)
(define-key dired-mode-map (kbd "C-c C-y") 'dired-ranger-move))))
PS: Jika tidak ada :defer
, :commands
, :mode
dan lain-lain yang membuat paket lazy loading, kemudian :init
dan :config
harus lebih atau kurang sama (tapi :init
akan dievaluasi sebelumnya :))
:config
sudah terlambat - pemuatan malas tidak akan menggunakan binding saya. Dan :bind
dengan :map
tidak benar-benar mengikatnya.
:config
tidak terlambat - saat dired-mode-map
itulah pertama kali didefinisikan. Anda mungkin hanya meletakkannya dalam use-package
bentuk yang salah dired-ranger
alih-alih dired
, di mana dired-mode-map
didefinisikan. Ini mungkin juga menjelaskan mengapa Anda :bind
tidak bekerja. Pada dasarnya, Anda melakukan sesuatu yang salah atau use-package
memiliki bug. Jangan mengacaukan ikatan kunci lokal dan eval-after-load
dengan ikatan kunci global dari perintah / kode kunci yang diisi otomatis.
use-package-always-ensure
dan ketika saya mencoba menggunakan-paket dired gagal mengambilnya dari elpa. Tetapi setelah :ensure nil
ada menyelesaikan masalah dan saya dapat mengatur memuat paket dirantai dired
-> dired-ranger
menggunakan :after
.
:bind
kata kunci untuk ini, atau memodifikasi binding kunci di:config
blok.