Używam package
do zarządzania rozszerzeniami Emacsa. Aby zsynchronizować moje ustawienia Emacsa na różnych komputerach, chciałbym określić listę nazw pakietów w .emacs
pliku, a następnie package
móc automatycznie wyszukiwać i instalować pakiety, aby nie musieć instalować ich ręcznie, dzwoniąc M-x package-list-packages
. Jak to zrobić?
123
Odpowiedzi:
źródło
package
.package-refresh-contents
że zostanie uruchomiony tylko wtedy, gdy pakiet nie jest zainstalowany? Co jest(or (file-exists-p package-user-dir))
lepsze / jak to w ogóle sprawdza, czy pakiety są zainstalowane?package-refresh-contents
. Prawdopodobnie zostanie to uruchomione tylko przy pierwszym otwarciu emacsa na nowym komputerze i nie przeszkadza mi to. Jeśli pakiet wymaga aktualizacji, można to zrobić ręcznie.use-package
, możesz użyć:ensure
słowa kluczowego, aby automatycznie zainstalować pakiety. Jest to również konfigurowane,package-selected-packages
jeśli chcesz uzyskać dostęp do listy pakietów poprzez dostosowywanie lub programowo.Na podstawie komentarzy Profpatscha i odpowiedzi poniżej:
źródło
or
? Och, wow.mapc
dotyczy skutków ubocznych. Ale dlaczego nie użyćunless
?(package-initialize)
przed odniesieniem dopackage-user-dir
Emacs 25.1+ automatycznie śledzi pakiety zainstalowane przez użytkownika w dostosowywalnej
package-selected-packages
zmiennej.package-install
zaktualizuje zmienną dostosowywania i będzie można zainstalować wszystkie wybrane pakiety za pomocą tejpackage-install-selected-packages
funkcji.Inną wygodną zaletą tego podejścia jest to, że można go użyć
package-autoremove
do automatycznego usuwania pakietów, które nie są uwzględnionepackage-selected-packages
(choć zachowa zależności).Źródło: http://endlessparentheses.com/new-in-package-el-in-emacs-25-1-user-selected-packages.html
źródło
Oto kod, którego używam do Emacs Prelude :
Jeśli nie używasz MELPY, nie musisz tego wymagać (a jeśli tak, to
melpa.el
musi być na twoimload-path
(lub zainstalowanym przez MELPA). Pakiet db nie jest odświeżany za każdym razem (ponieważ to znacznie spowolniłoby uruchamianie ) - tylko w przypadku obecności odinstalowanych pakietów.źródło
Nikt jeszcze nie wspomniał o Cask , ale nadaje się do tego zadania.
Zasadniczo tworzysz
~/.emacs.d/Cask
listę pakietów, które chcesz zainstalować. Na przykład:Uruchomienie
cask
z wiersza poleceń spowoduje zainstalowanie tych pakietów i wszelkich potrzebnych im zależności.Możesz także automatycznie aktualizować zainstalowane pakiety za pomocą
cask update
.źródło
/path/to/emacs -Q --script /path/to/cask/cask-cli.el -- [args]
Zadzwoń
package-install
podając nazwę pakietu jako symbol. Możesz znaleźć nazwy pakietów dla swoich pakietów, wywołującpackage-install
interaktywnie i uzupełniając nazwę. Funkcjapackage-installed-p
poinformuje Cię, czy została już zainstalowana.Na przykład:
źródło
error: Package
dired + „nie można zainstalować”. dired + to pakiet, który wypróbowałem z twoim kodem.dired+
się podczas bieganiapackage-list-packages
? Myślę, że będziesz musiał dodać do swojego marmoladę lub melpępackage-archives
. Jeśli tak, czy możesz biec(package-install 'dired+)
?(package-installed-p 'dired+)
powinien powrócićt
i zostanie pominięty w powyższym kodzie.package-installed-p
działa dobrze, ale cały blok kodu nie. Wypróbowałem kilka pakietów.źródło
Lubię sprawdzać, czy użytkownik chce najpierw zainstalować pakiety, jak to zrobiono w tej odpowiedzi . Odświeżam również zawartość pakietu przed zainstalowaniem czegokolwiek. Nie jestem pewien, czy to najlepszy sposób, ale nie sądzę, że najlepsze odpowiedzi robiły to za mnie.
źródło
Pobiegłem na problem, że nic się nie stało, po dodaniu
(package-install 'org)
do.emacs
. Chciałem zainstalować aktualną wersję programu,org-mode
a wbudowanyorg-mode
jest dość stary.package-install
Wygrzebałem kod źródłowy z Emacsa 25.3.1. Funkcja self już sprawdza, czy pakiet jest zainstalowany, czy nie, i odmawia instalacji, jeśli pakiet jest już zainstalowany. Tak więc czek(unless (package-installed-p package) ...)
z odpowiedzi 10093312 jest w rzeczywistości niewskazany .Wbudowany
org-mode
również liczy się jako zainstalowany ipackage-install
odmawia zainstalowania nowszej wersji firmy ELPA. Po spędzeniu trochę czasu na czytaniu package.el wpadłem na następujące rozwiązanie.Powodem, dla którego to działa, jest to, że
package-*
funkcje rodzinne różnie obsługują argumenty w zależności od tego, czy jest to symbol, czypackage-desc
obiekt. Informacje o wersji można określić tylko zapackage-install
pośrednictwempackage-desc
obiektu.źródło
Oto moje, jest krótsze :)
źródło
Oto inny sposób.
źródło