use-package -: init atau: config

13

Apakah ada aturan yang digunakan pengguna untuk menentukan apakah konfigurasi paket memerlukan :initatau :config?

rchar01
sumber

Jawaban:

13

Apakah ada aturan yang digunakan pengguna untuk menentukan apakah konfigurasi paket memerlukan :initatau :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, :initblok 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 :configblok, di sisi lain, dijalankan setelah paket yang sesuai telah dimuat, dengan cara dari eval-after-loadmekanisme.

Dengan demikian, Anda dapat meningkatkan waktu startup Anda dengan memindahkan pengaturan lama yang berlaku dari :initke :config. Jika Anda perlu memodifikasi variabel yang hanya didefinisikan setelah memuat paket tertentu, Anda juga perlu menempatkan ini di :configblok. 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-hookdi :initblok, 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 :customkata kunci baru , atau dengan menggunakan antarmuka Kustomisasi Mudah secara langsung.

Kemangi
sumber
2

Saya tidak yakin apakah ada aturan umum (selain dari "gunakan :inituntuk prakonfigurasi sebelum pemuatan paket yang sebenarnya dan gunakan :configuntuk konfigurasi lainnya, baik," ").

Tapi saya sendiri gunakan :initketika, 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, :modedan lain-lain yang membuat paket lazy loading, kemudian :initdan :configharus lebih atau kurang sama (tapi :initakan dievaluasi sebelumnya :))

Maxim Kim
sumber
4
Memodifikasi binding kunci dalam mode hook berarti mereka dijalankan setiap kali Anda membuka buffer dalam mode itu. Anda hanya perlu memodifikasi binding kunci satu kali, setelah paket dimuat. Anda dapat menggunakan :bindkata kunci untuk ini, atau memodifikasi binding kunci di :configblok.
Basil
Memang, tidak pernah dipikirkan. Tapi :configsudah terlambat - pemuatan malas tidak akan menggunakan binding saya. Dan :binddengan :maptidak benar-benar mengikatnya.
Pepatah Kim
3
:configtidak terlambat - saat dired-mode-mapitulah pertama kali didefinisikan. Anda mungkin hanya meletakkannya dalam use-packagebentuk yang salah dired-rangeralih-alih dired, di mana dired-mode-mapdidefinisikan. Ini mungkin juga menjelaskan mengapa Anda :bindtidak bekerja. Pada dasarnya, Anda melakukan sesuatu yang salah atau use-packagememiliki bug. Jangan mengacaukan ikatan kunci lokal dan eval-after-loaddengan ikatan kunci global dari perintah / kode kunci yang diisi otomatis.
Basil
@ Basil, thx, kau benar. Masalah saya adalah bahwa saya telah menetapkan use-package-always-ensuredan ketika saya mencoba menggunakan-paket dired gagal mengambilnya dari elpa. Tetapi setelah :ensure nilada menyelesaikan masalah dan saya dapat mengatur memuat paket dirantai dired-> dired-rangermenggunakan :after.
Maksim Kim