Einfachste Methode zum Downgrade eines über MELPA installierten Pakets

22

Manchmal können Paketaktualisierungen von MELPA einen Teil von Emacs beschädigen, und wenn dies passiert, möchte ich wieder auf eine ältere Version des Pakets zurückgreifen können.

Im Moment kann ich das auf zwei Arten tun:

  • Ich habe den Emacs so eingestellt, dass er Dateien löscht, indem er in den Papierkorb verschoben wird. Wenn ich ein Paket aktualisiere, wird die ältere Version in den Papierkorb verschoben. Ich kann die ältere Version abrufen und die in ersetzen ~/.emacs.d/elpa.

  • Gehen Sie zum Github-Repo des Pakets, das die Funktionalität ~/.emacs.d/elpaunterbrochen hat, rufen Sie eine ältere Version des Pakets ab, ersetzen Sie die in-Version durch die aus Github, und kompilieren Sie die Datei (en) per Byte-Neukompilierung.

Beide Methoden erfordern viel manuelle Arbeit, um Dinge zu bewegen. Gibt es eine einfachere (vorzugsweise automatische) Möglichkeit, von MELPA installierte Pakete herunterzustufen?

Chakravarthy Raghunandan
quelle
4
Sie können die neueste Version nur über ELPA / package.el installieren. Melpa und Melpa-stable behalten nicht einmal alte Versionen von Paketen. Um ein Paket manuell zu installieren, 1) laden Sie den Quellcode herunter 2) M-x package-install-file. Neben ELPA / package.el gibt es auch andere Möglichkeiten zum Verwalten von Paketen, z. B. el-get und quelpa . Diese scheinen ohne ELPA verwendet zu werden zu können. Vielleicht können sie tun, was Sie wollen.
Xuchunyang
2
Wenn Sie keine einfache und praktikable Antwort auf diese Frage erhalten, sollten Sie eine Erweiterungsanforderung an Emacs senden: M-x report-emacs-bug( Dies gilt auch für Erweiterungsanforderungen.)
Drew

Antworten:

9

Wenn Sie Ihre Pakete über die M-x list-packagesBenutzeroberfläche aktualisieren, werden Sie nach der erfolgreichen Installation des Pakets gefragt, ob Sie das alte Paket entfernen möchten. Löschen Sie sie nicht, damit sie an ihrem Platz bleiben und Sie das neuere Paket später über diese Schnittstelle entfernen können.

Meine aktuelle Paketliste enthält 4 Versionen von magit, die in meinem Verzeichnisbaum ~ / .emacs.d / elpa / installiert sind.

  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

Sie können alte Versionen später mit dem Schlüssel ~(Paketmenü-Veraltete zum Löschen markieren) bereinigen , um alle veralteten Pakete zu markieren. Um eine bestimmte alte Version zu löschen, gehen Sie zu ihrer Zeile und drücken Sie d, um sie zum Löschen zu markieren. Nachdem Sie die Pakete markiert haben x, führen Sie die Aktionen wie gewohnt aus.

In Emacs 25 werden durch das Markieren aller Pakete für die Upgrade-Funktion automatisch alle alten Pakete zum Löschen festgelegt, und nach der Installation werden Sie nicht zur Bestätigung aufgefordert. Sie müssen nach Zeilen suchen, die mit einem Großbuchstaben "D" beginnen und die Sie einfach entfernen können (am besten mit dem folgenden Makro)

Geben Sie die Tonart oder den Akkord links vom Bindestrich in den folgenden Zeilen ein.

<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

Wenn es keine weiteren Übereinstimmungen für die Suche gibt, läutet das Makro und stoppt, sodass Sie die C-u 0 <F4>Markierung aller zum Löschen markierten Pakete aufheben können. Danach können xSie die Installationen durchführen.

Die Funktion, die ich in meinem Kommentar als geändert deklariert habe, muss auf eine Weise geändert werden, die ich noch nicht erfassen kann, da es wichtig ist, dass der letzte (cond) Block erfolgreich ist, um keine Endlosschleife auszuführen.

p_wiersig
quelle
Oh hey, es wird nicht um Bestätigung gebeten, in meinem Emacs zu löschen. Es löscht nur das alte Paket: / Ich denke, es wurde in Emacs 24 gefragt? Ich erinnere mich nicht
Chakravarthy Raghunandan
tatsächlich. Emacs 24 fordert auf, 25 scheint das alte zum Löschen zu markieren und das wird beim Ausführen der Marken ausgelöst. Sie können die Pakete für die manuelle Installation markieren oder die Löschvorgänge aufheben oder die (t (package-menu-mark-delete))Zeilen package-menu--mark-upgrades-1so ändern , dass die erste Zeile ein Test für eine Konfigurationsvariable ist oder etwas zurückgibt, nilwenn Sie alte Pakete nicht sofort löschen möchten
p_wiersig
Können Sie bitte die entsprechenden Zeilen zur Bearbeitung in package.eldie ursprüngliche Antwort einfügen, damit ich die Antwort akzeptieren kann? Danke
Chakravarthy Raghunandan
Sicher. Mir ist aufgefallen, dass ich die Funktion nicht dazu bringen kann, das zu tun, was ich will, und deshalb habe ich erklärt, wie man alle Markierungen über ein Makro aufhebt.
p_wiersig
7

Die "nukleare Option" wäre sozusagen, package.elganz aufzugeben und stattdessen den Paketmanager zu verwenden, den ich geschrieben habe straight.el. Der Vorteil wäre, dass straight.elPakete installiert werden, indem ihre Git-Repositorys geklont werden, wodurch es trivial wird, die gewünschte Version zu verwenden. Außerdem straight.elbietet Funktionen für die Revision Lock - Dateien handelt, die Ihnen erlauben , den genauen Status Ihrer Paketverwaltung Konfiguration aufzeichnen bis ins kleinste Detail. Im Notfall können Sie dann einfach alle Pakete auf ihre als funktionierend bekannten Versionen zurücksetzen.

Diese Art von Operationen ist im Allgemeinen mit unmöglich package.el, und sie werden aufgrund der Gesamtkonstruktion immer unmöglich sein.

Dies ist nicht erforderlich, um zu vermeiden, dass Sie jedes Mal ein Commit ausführen, wenn Sie Ihre Pakete aktualisieren straight.el. Ich würde empfehlen , eine Versionssperrdatei zu schreiben und diese jedes Mal zu bestätigen, wenn Sie Ihre Pakete aktualisieren, da dies es unmöglich macht, jemals in einen Zustand zu geraten, in dem Ihre Emacs-Konfiguration nach einem Upgrade beschädigt ist und Sie nicht wissen, wie Sie zurücksetzen sollen. Aber Sie müssen das nicht tun, wenn Sie das Leben am Rande leben möchten.

Radon Rosborough
quelle
4

Ich finde einen einfachen Weg, ein Downgrade durchzuführen: Verwalten Ihres eigenen Melpa-Archivs.

  1. Clone Melpa Repo.
  2. Befolgen Sie die benutzerdefinierte Melpa-Archiv-Wiki-Seite von Melpa , um alle Rezepte zu entfernen.
  3. Suchen Sie das Commit des Pakets, auf das Sie eine Down-Note durchführen möchten, und erstellen Sie ein neues Rezept mit diesem Commit für das Paket. ( Informationen zum Festlegen des Commits finden Sie in der Readme-Datei von melpa. )
  4. Führen Sie aus make, um das heruntergestufte Paket zu erstellen
  5. Fügen Sie der package-archivesListe Ihr eigenes Melpa-Archiv hinzu, das ein lokales Verzeichnis sein kann .
  6. Installieren Sie das heruntergestufte Paket über das Paketmenü. Oder Sie können package-pinned-packagesdas Archiv einschränken, von dem das Paket heruntergeladen werden soll.
chunfengd
quelle
3

Viele Leute entscheiden sich dafür, ELPA-Pakete nicht zur Versionskontrolle zu verpflichten, aber dies ist ein Beispiel dafür, warum Sie dies meines Erachtens tun sollten.

Zurückkehren alles ist trivial , wenn es begangen wird .

Je nach Zustand der vorgelagerten ELPA-Pakete besteht ein Risiko.

Phils
quelle
Aber das würde bedeuten, dass ich mich jedes Mal, wenn ich Pakete aktualisiere, daran erinnern muss, ein Commit auszuführen. Das ist nicht was ich will. ODER gibt es eine Möglichkeit, dass Emacs die aktualisierten Pakete automatisch bereitstellt und festschreibt, wenn ich ein Paketupdate vornehme?
Chakravarthy Raghunandan
1
Ich verstehe nicht, warum Sie nicht möchten, dass Änderungen an Ihrer Konfiguration beabsichtigte Entscheidungen sind. In Bezug auf die automatische Commits, ich bin sicher , dass könnte automatisiert werden, aber ich habe keine Lösung dafür. Die Suche nach solchen Lösungen kann jedoch produktiv sein.
Phils