Setelah baru-baru ini belajar tentang use-package
saya memutuskan untuk port konfigurasi saya untuk itu tetapi menemukan diri saya enggan untuk memberikan kemudahan menggunakan package.el
menginstal paket dan tetap memperbaruinya. Saya merasa agak sulit untuk menggabungkan use-package
dan package.el
.
Saya umumnya tertarik mempelajari bagaimana orang-orang bergabung use-package
dengan package.el
sistem, tetapi untuk pertanyaan yang lebih spesifik, teruslah membaca.
Inilah yang saya inginkan:
- Untuk memiliki paket yang diinstal oleh manajer paket sehingga saya dapat dengan mudah menelusuri paket dan terus memperbaruinya
list-packages
. - Untuk mengkonfigurasi dan memuat paket secara eksklusif
use-package
, jadi saya dapat dengan mudah melihat di file init saya persis apa yang saya muat dan bagaimana hal itu dikonfigurasi. - Opsional, saya ingin juga dapat menginstal paket melalui
use-package
's:ensure
kata kunci.
Jika saya mengerti dengan benar saya ingin sedikit dari apa yang package-initialize
dilakukan, pada dasarnya hanya cara mengatur load-path
. Saat ini saya memiliki ini dalam konfigurasi saya:
;(package-initialize)
(setq package-enable-at-startup nil)
(let ((default-directory "~/.emacs.d/elpa"))
(normal-top-level-add-subdirs-to-load-path))
(require 'use-package)
Baris pertama, yang dikomentari, adalah agar Emacs 25 tidak membantu menambahkan (package-initialize)
file init saya. Bit with normal-top-level-add-subdirs-to-load-path
adalah aproksimasi terhadap apa yang package-initialize
akan membuat load-path
, aproksimasi yang tampaknya cukup baik.
Ini tampaknya mencapai keinginan saya 1 dan 2, tetapi tidak 3. Jika saya mencoba menggunakan :ensure
, saya mendapatkan pesan kesalahan yang mengatakan bahwa package.el
itu tidak diinisialisasi. Memanggil package-initialize
akan memperbaikinya, tetapi saya ingin menghindari itu karena a) Saya tidak ingin semua autoload yang sangat banyak dimuat (saya lebih suka menggunakan use-package
untuk membuat secara tepat autoload yang saya butuhkan), dan b) Saya ingin dapat dengan mudah hindari memuat paket yang diinstal tertentu kapan pun saya mau (yang mudah dilakukan use-package
).
Adakah yang punya rekomendasi untuk bagaimana melakukan ini?
sumber
package-initialize
yang membuat pertanyaan saya diperdebatkan.Dengan konfigurasi Anda saat ini, Anda telah secara efektif menonaktifkan package.el, karena Anda tidak menginisialisasi manajer paket dan mencegah Emacs menginisialisasi secara otomatis. Yang Anda lakukan sebagai gantinya adalah menambahkan ELPA ke
load-path
, tapi itu hanya sebagian kecil dari apa yang dilakukan package.el. Saya tidak yakin mengapa Anda melakukan itu, tetapi ini bukan pengaturan yang saya sarankan.Khususnya, Anda tidak akan mendapatkan autoload paket dengan pendekatan Anda, yang berarti pada awalnya tidak ada perintah dari paket apa pun yang akan tersedia.
Dengan kata lain,
M-x
hanya akan menawarkan Anda perintah bawaan. Untuk menambahkan perintah dari paket Anda, Anda harus menambahkan:commands
definisi eksplisit untuk semuause-package
deklarasi Anda , yang berarti banyak upaya pemeliharaan - terutama untuk paket besar seperti Magit - untuk dasarnya nol kenaikan - package.el memberi Anda autoloads gratis .Menggabungkan
use-package
dengan package.el sebenarnya sangat sederhana — seluruh pengaturan didasarkan pada kombinasi ini — tetapi jauh lebih baik membiarkan package.el benar-benar melakukan tugasnya. Inisialisasinya package.el di awal file init Anda:Untuk kenyamanan Anda selanjutnya ingin bootstrap
use-package
, jika belum diinstal:Ini memungkinkan Anda memulai sesi Emacs pada sistem yang baru, dan init.el Anda akan secara otomatis menginstal
use-package
.Pada akhirnya Anda perlu memuat
use-package
:Sekarang Anda dapat menggunakan
use-package
untuk menginstal dan mengkonfigurasi paket:Ketika Emacs sekarang mengevaluasi formulir ini selama startup,
use-package
akan memeriksa apakah Magit sudah diinstal, dan secara otomatis menginstalnya jika perlu.sumber
package-initialize
membutuhkan waktu untuk mengisi path, menentukan autoloads, dan melakukan sisanya. Saya pikir saya membaca di suatu tempat bahwa Jon Wiegley sendiri (penulisuse-package
) lebih suka mendeklarasikan semua perintah yang dimuat secara otomatis dalamuse-package
bait daripada mengandalkanpackage.el
.load-path
dan menambahkan pengisian otomatis dalam kedua kasus, baik melaluiuse-package
atau melaluipackage.el
. Saya ragu bahwa ada perbedaan yang terukur, terutama jika Anda memiliki sistem modern dengan disk cepat.package-initialize
dibandingkan daftar kustomload-path
. Saya mengaitkan ini dengan "eksplorasi" sistem file yangpackage.el
melakukannya. Namun, saya tidak pernah mengukur perbedaan yang signifikan dalam kinerja antara memuatautoload
definisi dari file dan memilikinya dalamuse-package
bait.package.el
sistem, saya akan mengatakan saya hanya dinonaktifkanpackage-initialize
! Alasannya adalah bahwa walaupun saya sukalist-packages
menelusuri paket-paket baru dan secara khusus memperbarui semua paket yang saya instal saat ini, saya pikir saya lebih suka memuat yang ditargetkanuse-package
. Bagi saya memiliki autoloads hanya untuk perintah yang saya gunakan terdengar seperti hal yang baik!