Najprostszym sposobem na obniżenie wersji pakietu zainstalowanego za pośrednictwem MELPA

22

Czasami aktualizacje pakietów z MELPA mogą uszkodzić część emacsa, a kiedy to się stanie, chciałbym móc wrócić do korzystania ze starszej wersji pakietu.

W tej chwili mogę to zrobić na dwa sposoby:

  • Ustawiłem emacsa, aby usuwał pliki, przenosząc do kosza, a kiedy aktualizuję pakiet, starsza wersja jest niszczona. Mogę pobrać starszą wersję i wymienić ją w ~/.emacs.d/elpa.

  • Przejdź do repozytorium github pakietu, które zepsuło funkcjonalność, pobierz starszą wersję pakietu, zastąp tę ~/.emacs.d/elpaz gitub, ponownie skompiluj bajt (-y) pliku (ów).

Oba te sposoby wymagają dużej ilości pracy ręcznej podczas przenoszenia rzeczy. Czy istnieje łatwiejszy (najlepiej automatyczny) sposób obniżenia poziomu pakietów zainstalowanych z MELPA?

Chakravarthy Raghunandan
źródło
4
Możesz zainstalować najnowszą wersję tylko za pomocą ELPA / package.el, Melpa i Melpa-stable nawet nie zachowują starych wersji pakietów. Aby ręcznie zainstalować pakiet, 1) pobierz kod źródłowy 2) M-x package-install-file. Istnieją również inne sposoby zarządzania pakietami poza ELPA / package.el, takie jak el-get i quelpa , wydaje się, że można ich używać bez ELPA, może mogą zrobić to, co chcesz.
xuchunyang,
2
Jeśli nie otrzymasz prostej , wykonalnej odpowiedzi na to pytanie, rozważ wysłanie prośby o ulepszenie do Emacsa: M-x report-emacs-bug(dotyczy to również próśb o ulepszenie).
Drew

Odpowiedzi:

9

Po zaktualizowaniu pakietów za pomocą M-x list-packagesinterfejsu po pomyślnej instalacji pakietu pojawi się pytanie, czy chcesz usunąć stary pakiet. Nie usuwaj ich, aby pozostały na miejscu, a później możesz usunąć nowszy pakiet za pośrednictwem tego interfejsu.

Moja obecna lista pakietów pokazuje 4 wersje magit zainstalowane w moim drzewie katalogów ~ / .emacs.d / elpa /.

  magit              20160827.1549 obsolete              A Git porcelain inside Emacs
  magit              20160907.945  obsolete              A Git porcelain inside Emacs
  magit              20161001.1454 obsolete              A Git porcelain inside Emacs
  magit              20161123.617  installed             A Git porcelain inside Emacs

Możesz wyczyścić stare wersje później za pomocą klawisza ~(pakiet-menu-znak-przestarzałe-do-usunięcia), aby zaznaczyć wszystkie przestarzałe pakiety. Aby usunąć pewną starą wersję, przejdź do jej linii i naciśnij, daby zaznaczyć je do usunięcia. Po zaznaczeniu pakietów, których użyjesz xdo wykonania akcji w zwykły sposób.

W Emacsie 25 zaznacz wszystkie pakiety dla Ufunkcji pgrade automatycznie ustawia wszystkie stare pakiety do usunięcia i nie wyświetla monitu o potwierdzenie po instalacji. Musisz poszukać linii rozpoczynających się od dużej litery „D”, którą możesz po prostu odznaczyć (najlepiej za pomocą poniższego makra)

Wpisz klucz lub akord po lewej stronie myślnika w następujących wierszach.

<F3>  - start macro recording
C-s   - isearch-forward
C-q   - quoted-insert
C-j   - linefeed character
D     - the mark at the start of the line
<Ret> - stops the isearch on the line with the "D"
u     - unmark the package for deletion
<F4>  - stops macro recording - the first package is now unmarked
<F4>  - executes the macro for the next upgraded package

Jeśli nie ma dalszych dopasowań do wyszukiwania, makro zadzwoni i zatrzyma się, aby można było C-u 0 <F4>odznaczyć wszystkie pakiety oznaczone do usunięcia. Następnie możesz xwykonać instalację.

Funkcja, którą zadeklarowałem jako zmienioną w moim komentarzu, musi zostać zmieniona w sposób, którego nie mogę jeszcze uchwycić, ponieważ ważne jest, aby ostatni blok (warunkowy) odniósł sukces, aby nie zapętlał się w nieskończoność.

p_wiersig
źródło
O, hej, nie prosi o potwierdzenie usunięcia w moich emacsach. Po prostu usuwa stary pakiet: / myślę, że kiedyś pytał w emacs 24? nie pamiętam
Chakravarthy Raghunandan
w rzeczy samej. Emacs 24 wyświetla monity, 25 wydaje się oznaczać stare do usunięcia, co uruchomi się po wykonaniu znaków. Możesz oznaczyć paczki do instalacji ręcznie, odznaczyć usunięcia lub zmienić te (t (package-menu-mark-delete))wiersze, package-menu--mark-upgrades-1aby pierwszy wiersz był testem zmiennej konfiguracyjnej lub czymś, co zwraca, nilgdy nie chcesz natychmiast usuwać starych pakietów
p_wiersig
Czy możesz dodać odpowiednie wiersze do edycji w package.eloryginalnej odpowiedzi, aby zaakceptować odpowiedź? Dzięki
Chakravarthy Raghunandan
Pewnie. Zauważyłem, że nie mogę sprawić, by funkcja robiła to, co chcę, więc wyjaśniłem, jak odznaczyć wszystko za pomocą makra.
p_wiersig
7

Opcję „jądrowy”, jak to było, byłoby porzucić package.elcałkowicie i zamiast użyć menedżera pakietów, które napisałem straight.el. Zaletą byłoby to, że straight.elinstaluje pakiety poprzez klonowanie repozytoriów Git, dzięki czemu korzystanie z dowolnej wersji jest proste. Ponadto straight.elzapewnia funkcjonalność do czynienia z plików blokujących rewizyjnych, które pozwalają nagrywać dokładny stan konfiguracji zarządzania pakietami w najdrobniejszych szczegółach. Następnie, w nagłych przypadkach, możesz po prostu przywrócić wszystkie pakiety do ich znanych dobrych wersji.

Tego rodzaju operacje są na ogół niemożliwe package.eli zawsze będą niemożliwe ze względu na ogólny projekt.

W odpowiedzi na Twoją chęć unikania dokonywania zmian przy każdej aktualizacji pakietów, nie jest to konieczne straight.el. Chciałbym polecić napisanie wersji pliku blokującego i popełnienie że za każdym razem zaktualizować pakietów, ponieważ to sprawia, że nie da się kiedykolwiek dostać się do stanu, w którym konfiguracja Emacs jest łamany po aktualizacji i nie wiesz, jak przywrócić. Ale nie musisz tego robić, jeśli lubisz żyć na krawędzi.

Radon Rosborough
źródło
4

Znajduję prosty sposób na obniżenie wersji: zarządzanie własnym archiwum Melpa.

  1. Clone melpa repo.
  2. Śledź niestandardową stronę wiki archiwum melpy, aby usunąć wszystkie przepisy.
  3. Znajdź zatwierdzenie pakietu, do którego chcesz obniżyć ocenę, i utwórz nowy przepis z tym zatwierdzeniem dla pakietu. (zobacz readmę Melpy o tym, jak określić zatwierdzenie)
  4. Uruchom, makeaby zbudować obniżony pakiet
  5. Dodaj do listy własne archiwum melpa, które może być katalogiem lokalnym package-archives.
  6. Zainstaluj obniżony pakiet za pomocą menu pakietu. Możesz też użyć, package-pinned-packagesaby ograniczyć archiwum, z którego pakiet powinien zostać pobrany.
chunfengd
źródło
3

Wiele osób decyduje się nie zobowiązać pakietów ELPA do kontroli wersji, ale jest to przykład, dlaczego uważam, że powinieneś to zrobić.

Cofanie czegokolwiek jest trywialne, jeśli wszystko zostało popełnione.

W zależności od stanu wcześniejszych pakietów ELPA istnieje ryzyko.

phils
źródło
Oznaczałoby to jednak, że musiałbym pamiętać o dokonywaniu zmian przy każdej aktualizacji pakietów. Nie tego chcę. LUB czy istnieje sposób, aby emacs automatycznie ustawiał etapy i zatwierdzał zaktualizowane pakiety za każdym razem, gdy przeprowadzam aktualizację pakietu?
Chakravarthy Raghunandan
1
Nie rozumiem, dlaczego nie chcesz, aby zmiany w konfiguracji były celowymi decyzjami. Jeśli chodzi o automatyczne zatwierdzanie, jestem pewien, że można to zautomatyzować, ale nie mam na to rozwiązania. Poszukiwanie takich rozwiązań może jednak zapewnić produktywność.
phils