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

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

нет .elc необходимо перекомпилировать для новой версии Emacs? Почему это не является особенностью пакета.Эл?

4 ответов


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

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


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

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

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

это работает для меня на 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)))))

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

  1. in .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))