Po niedawnym zapoznaniu się z use-package
tym zdecydowałem się na przeniesienie do niego konfiguracji, ale nie chciałem rezygnować z wygody package.el
instalowania pakietów i aktualizowania ich. Uważam, że to trochę trudne do połączenia use-package
i package.el
.
Zasadniczo jestem zainteresowany nauczeniem się, jak ludzie łączą się use-package
z package.el
systemem, ale aby uzyskać bardziej szczegółowe pytanie, czytaj dalej.
Oto czego chcę:
- Aby pakiety zostały zainstalowane przez menedżera pakietów, dzięki czemu mogę łatwo przeglądać pakiety i aktualizować je
list-packages
. - Aby skonfigurować i ładować pakiety wyłącznie przez
use-package
, dzięki czemu mogę łatwo zobaczyć w moim pliku init dokładnie to, co ładuję i jak to jest skonfigurowane. - Opcjonalnie, chciałbym być w stanie zainstalować pakiety poprzez
use-package
„s:ensure
słowa kluczowego.
Jeśli dobrze rozumiem, bardzo mało chcę tego, co package-initialize
robi, w zasadzie tylko sposób, w jaki to konfiguruje load-path
. Obecnie mam to w mojej konfiguracji:
;(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)
Pierwsza komentowana linia jest taka, że Emacs 25 nie dodaje pomocniczo (package-initialize)
do mojego pliku init. Bit z normal-top-level-add-subdirs-to-load-path
jest przybliżeniem tego package-initialize
, co by czyniło load-path
, przybliżeniem, które wydaje się wystarczająco dobre.
To wydaje się spełniać moje pragnienia 1 i 2, ale nie 3. Jeśli spróbuję użyć :ensure
, pojawi się komunikat o błędzie informujący, że package.el
nie został zainicjowany. Wywołanie package-initialize
to naprawiłoby to, ale chcę tego uniknąć, ponieważ a) nie chcę, aby ładowane były wszystkie niezliczone autoloady (wolę use-package
tworzyć dokładnie te autoloady, których potrzebuję), i b) chcę mieć możliwość łatwego unikaj ładowania niektórych zainstalowanych pakietów, kiedy tylko chcę (co jest łatwe do zrobienia use-package
).
Czy ktoś ma zalecenie, jak to zrobić?
źródło
package-initialize
co sprawia, że moje pytanie jest dyskusyjne.Przy obecnej konfiguracji skutecznie wyłączyłeś pakiet.el, ponieważ nie inicjujesz menedżera pakietów i nie uniemożliwiasz Emacsowi automatycznego inicjowania go. W zamian dodajesz ELPA do
load-path
, ale to tylko niewielki podzbiór tego, co robi pakiet.el. Nie jestem pewien, dlaczego to robisz, ale nie jest to konfiguracja, którą poleciłbym.W szczególności nie otrzymasz autoloadów pakietów z twoim podejściem, co oznacza, że początkowo żadne polecenia z żadnego pakietu nie będą dostępne.
Innymi słowy,
M-x
będzie oferować tylko wbudowane polecenia. Aby dodać poleceń z paczek trzeba by dodać wyraźne:commands
definicje wszystkich swoichuse-package
oświadczeniach, które sprowadza się do partii konserwacji wysiłku, szczególnie w przypadku dużych pakietów takich jak MAGIT-na zasadzie zerowy przyrost-package.el daje autoloads za darmo .Łączenie
use-package
z pakietem.el jest w rzeczywistości bardzo proste - cała konfiguracja oparta jest na tej kombinacji - ale o wiele lepiej jest pozwolić pakietowi.el faktycznie wykonać swoją pracę. Po prostu zainicjuj pakiet.el na samym początku pliku init:Dla wygody możesz później chcieć uruchomić
use-package
, jeśli nie jest jeszcze zainstalowany:To pozwoli ci rozpocząć sesję Emacsa w nowym systemie, a Twój plik init.el zostanie automatycznie zainstalowany
use-package
.Ostatecznie musisz załadować
use-package
:Teraz możesz użyć
use-package
do zainstalowania i skonfigurowania pakietów:Gdy Emacs oceni teraz ten formularz podczas uruchamiania,
use-package
sprawdzi, czy Magit jest już zainstalowany i automatycznie zainstaluje go, jeśli to konieczne.źródło
package-initialize
zajmuje trochę czasu, aby zapełnić ścieżkę, zdefiniować automatyczne ładowanie i zrobić resztę rzeczy. Wydaje mi się, że czytałem gdzieś, że sam Jon Wiegley (autoruse-package
) woli zadeklarować wszystkie automatycznie ładowane polecenia wuse-package
zwrotkach zamiast na nich polegaćpackage.el
.load-path
i dodać automatyczne ładowanie w obu przypadkach, zarówno przez, jakuse-package
i przezpackage.el
. Wątpię, aby istniała mierzalna różnica, szczególnie jeśli masz nowoczesny system z szybkim dyskiem.package-initialize
niż lista niestandardowaload-path
. Przypisuję to „eksploracji” systemu plików, który topackage.el
robi. Jednak nigdy nie mierzyłem żadnej znaczącej różnicy w wydajności między ładowaniemautoload
definicji z plików a umieszczaniem ich wuse-package
sekcjach.package.el
systemu, powiedziałbym, że tylko wyłączonepackage-initialize
! Powodem jest to, że chociaż lubięlist-packages
przeglądać nowe pakiety, a szczególnie aktualizować wszystkie aktualnie zainstalowane pakiety, myślę, że wolę ukierunkowane ładowanieuse-package
. Dla mnie posiadającego automatyczne ładowanie tylko dla poleceń używam dźwięków jak dobrą rzecz!