Как пересобрать пакеты ELPA после обновления Emacs

Я только что обновил GNU Emacs с 23 до 24 на MacOS, и некоторые установленные пакеты ELPA перестали работать. Одним из них является AucTeX. Удаление и переустановка через диспетчер пакетов заставило его снова работать, но я не хочу делать это вручную для каждого пакета. Я немного запутался, что ничего не нахожу в интернете.

Не нужно ли перекомпилировать.elc для новой версии Emacs? Почему это не функция package.el?

4 ответа

Решение

Вам не нужно переустанавливать все пакеты. Сами пакеты, вероятно, в порядке, но их нужно перекомпилировать, потому что байт-код Emacs Lisp обычно несовместим с основными версиями.

Чтобы перекомпилировать все пакеты, введите M-: (byte-recompile-directory package-user-dir nil 'force), После перезапуска Emacs пакеты должны снова работать нормально.

Это работает для меня на Emacs 25.1 и 26:

(defun package-reinstall-all-activated-packages ()
  "Refresh and reinstall all activated packages."
  (interactive)
  (package-refresh-contents)
  (dolist (package-name package-activated-list)
    (when (package-installed-p package-name)
      (unless (ignore-errors                   ;some packages may fail to install
                (package-reinstall package-name))
        (warn "Package %s failed to reinstall" package-name)))))

Переменная package-activated-list содержит список пакетов, которые нас интересуют. Поэтому нам просто нужно установить каждый из них снова. Нам не нужно явно удалять их; призвание package-install сдует старую версию.

Поместите этот код в чистый буфер и оцените его (то есть поместите курсор в конец и нажмите C-x C-e):

(dolist (package-name package-activated-list)
  (package-install package-name))

Мой рецепт после emacs 25:

  1. в.emacs (определите список пакетов):
(custom-set-variables
 '(package-selected-packages
   (quote
      (browse-kill-ring helm undo-tree use-package)))
  1. в терминале:
$ rm -rf ~/.emacs.d/elpa/*
  1. в Emacs:
(progn (package-refresh-contents)
    (package-install-selected-packages)
    (byte-recompile-directory package-user-dir nil 'force))
Другие вопросы по тегам