Найпростіший спосіб понизити пакет, встановлений через MELPA


22

Іноді оновлення пакунків від MELPA можуть зламати частину emacs, і коли це станеться, я хотів би повернутися до використання старішої версії пакету.

Зараз я можу це зробити двома способами:

  • Я встановив emacs для видалення файлів, переміщуючись у кошик, і коли я оновлюю пакет, старіша версія завантажується в кошик. Я можу завантажити старішу версію і замінити версію в ~/.emacs.d/elpa.

  • Перейдіть до репозиторію github пакета, який порушив функціональність, знайдіть старішу версію пакета, замініть цю ~/.emacs.d/elpaна іншу з gitub, байт-перекомпілюйте файл (и).

Обидва ці способи передбачають багато ручної роботи, що рухає речі. Чи є простіший (бажано автоматичний) спосіб зменшення кількості пакунків, встановлених з MELPA?


4
Встановити останню версію можна лише через ELPA / package.el, Melpa та Melpa-stable навіть не зберігають старі версії пакетів. Щоб встановити пакет вручну, 1) завантажте вихідний код 2) M-x package-install-file. Окрім ELPA / package.el, є й інші способи керування пакетами, такі як el-get та quelpa , вони, здається, можуть використовуватись без ELPA, можливо, вони можуть робити все, що ви хочете.
xuchunyang

2
Якщо ви не отримаєте простий , працездатний відповідь на це питання, будь ласка , розглянути питання про направлення запиту аксесуара до Emacs: M-x report-emacs-bug(також для запитів поліпшення).
Дрю

Відповіді:


9

Коли ви оновлюєте ваші пакунки через M-x list-packagesінтерфейс, після успішного встановлення пакета вам буде запропоновано видалити старий пакет. Не видаляйте їх, щоб вони залишалися на місці, а потім зможете пізніше видалити новий пакет через цей інтерфейс.

Мій поточний список пакетів містить 4 версії magit, встановлені в моєму дереві ~ / .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

Пізніше можна очистити старі версії за допомогою ключа ~(пакунок-меню-марка-застаріле-для-видалення), щоб позначити всі застарілі пакети. Щоб видалити певну стару версію, перейдіть до її рядка та натисніть, dщоб позначити їх для видалення. Після того, як ви позначили пакунки, які використовуєте xдля виконання дій, як зазвичай.

У Emacs 25 позначте всі пакети для Uфункціональності pgrade автоматично встановлює всі старі пакети для видалення та не вимагає підтвердження після встановлення. Ви повинні шукати рядки, які починаються з великої літери "D", яку ви можете просто відмітити (найкраще за допомогою наступного макросу)

Введіть ключ або акорд зліва від тире з наступних рядків.

<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

Якщо подальших збігів для пошуку не буде, макрос подзвонить у дзвінок і зупиниться, тому ви можете C-u 0 <F4>зняти позначку для всіх пакетів, позначених для видалення. Після цього ви можете xвиконати встановлення.

Функцію, яку я оголосив зміненою у своєму коментарі, слід змінити таким чином, що я поки не можу зрозуміти, оскільки важливо, щоб останній (умовний) блок був успішним, щоб не втрачати цикл.


О, ей, це не просить підтвердження видалити в моїх емаках. Він просто видаляє старий пакет: / я думаю, він раніше запитував у emacs 24? я не пам’ятаю
Чакраварті Рагунандан

дійсно. 24 підказки Emacs, 25 видає, що старі для вилучення старі, і це спровокує виконання знаків. Ви можете відзначити пакунки для встановлення вручну або відмітити позначення видалень або змінити (t (package-menu-mark-delete))рядки package-menu--mark-upgrades-1так, щоб перший рядок був тестом для змінної конфігурації або чогось, що повертається, nilколи ви не хочете видаляти старі пакунки негайно
p_wiersig

Чи можете ви додати відповідні рядки для редагування в package.elоригінальній відповіді, щоб я міг прийняти відповідь? Спасибі
Чакраварті Рагунандан

Звичайно. Я помітив, що я не можу змусити функцію робити те, що я хочу, тому я пояснив, як відмітити все за допомогою макросу.
p_wiersig

7

«Ядерний варіант», як це було, було б угробити package.elповністю , і замість цього використовувати менеджер пакетів , який я написав, straight.el. Перевагою буде те, що straight.elвстановлює пакети, клонуючи їх сховища Git, тим самим, тривіально використовувати ту версію, яку ви хочете. Також straight.elпередбачено функціональність для роботи з блоками перегляду версій, які дозволяють записувати точний стан конфігурації вашого пакета до найменших деталей. Тоді, в разі надзвичайної ситуації, ви можете просто повернути всі пакунки до їх відомих версій.

В основному такі операції неможливі package.el, і вони завжди будуть неможливі завдяки загальній конструкції.

У відповідь на ваше бажання уникати взяття на себе зобов'язань щоразу, коли ви оновлюєте ваші пакети, це не потрібно straight.el. Я рекомендую написати файл блокування версій і зобов’язатись кожного разу, коли ви оновлюєте ваші пакунки, оскільки це унеможливлює потрапляння в стан, коли ваша конфігурація Emacs порушена після оновлення, і ви не знаєте, як відновити. Але вам не доведеться цього робити, якщо вам подобається жити життя на краю.


4

Я знаходжу простий спосіб пониження версії: керування власним архівом melpa.

  1. Клон melpa repo.
  2. Дотримуйтесь melpa в сторінці архіву вікі призначеного для користувача melpa видалити всі рецепти.
  3. Знайдіть фіксацію пакету, який ви хочете знизити, і створіть новий рецепт з цим коміктом для пакету. (див. рецензію melpa про те, як вказати комісію )
  4. Запустіть, makeщоб створити знижений пакет
  5. Додайте до списку власний архів melpa, який може бути локальним каталогом package-archives.
  6. Встановіть зменшений пакет за допомогою меню пакета. Або ви можете використовувати package-pinned-packagesобмеження архіву, з якого слід завантажувати пакет.

3

Багато людей вирішують не брати пакети ELPA для контролю версій, але це приклад, чому я вважаю, що ви повинні це зробити.

Повернення чого-небудь є тривіальним, якщо це все здійснено.

Залежно від стану пакетів ELPA, що проходять вище, є ризиком.


Але це означатиме, що я повинен пам’ятати, що потрібно робити кожен раз, коли я оновлюю пакунки. Це не те, що я хочу. АЛЕ Чи є спосіб я можу зробити Emacs автоматично поетапно та виконувати оновлені пакети щоразу, коли я роблю оновлення пакета?
Чакраварті Рагунандан

1
Я не розумію, чому ви не хочете, щоб зміни вашої конфігурації були навмисними рішеннями. Щодо автоматичних комісій, я впевнений, що це може бути автоматизовано, але у мене немає рішення для цього. Пошук таких рішень може принести результативність.
phils
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.