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