Подтвердить что ты не робот

Обновление пакетов в Emacs

У меня есть следующая настройка для пакетов (не уверен, есть ли более рекомендуемая):

(require 'package)
(setq package-archives '(("ELPA" . "http://tromey.com/elpa/") 
                          ("gnu" . "http://elpa.gnu.org/packages/")
                          ("marmalade" . "http://marmalade-repo.org/packages/")))

; Apparently needed for the package auto-complete (why?)
(add-to-list 'package-archives
             '("melpa" . "http://melpa.milkbox.net/packages/") t)

(package-initialize)
(setq url-http-attempt-keepalives nil)

У меня есть три вопроса, связанные с установкой и обновлением пакетов.

Q1. Есть ли способ обновить список доступных пакетов (и самых последних версий) и обновить определенный пакет?

Q.2 В чем разница между следующими источниками пакетов?:

  • ELPA,
  • GNU
  • marmalade
  • melpa

Q.3 Имеет ли значение порядок, в котором они добавлены в package-archives?

4b9b3361

Ответ 1

  • Я использую следующее:

    (when (not package-archive-contents)
        (package-refresh-contents))
    

    Выполнение package-list-packages также обновит список пакетов.

Вы можете обновить все установленные пакеты с помощью U x в буфере *Packages*.

  1. ELPA - это оригинал. Я не думаю, что это действительно поддерживается, но я не уверен. Я не использую его.

    GNU является официальным. Он поддерживается вместе с Emacs, что означает, что все должно всегда работать, но обновления и новые пакеты не приходят очень часто.

    Marmalade - это в основном веб-сайт, на котором вы можете загрузить полный пакет, и он будет добавлен в ремарку мармелада. Вы не просто отправляете ссылку на пакет вверх по течению, и не полностью автоматизируете создание пакета полностью. Я думаю, что это правильная вещь, потому что вы не обязательно хотите отслеживать движение вверх по течению. К сожалению, он ненадолго остался ненадолго, но кто-то недавно взял его, поэтому в какой-то момент он должен вернуться и лучше.

    Melpa принимает URL-адрес, например. область EmacsWiki lisp или репозиторий github, и автоматически создает пакет из него. Таким образом, обычно, как правило, на целый день отстает от того, что он отслеживает. Несмотря на то, что он отслеживает восходящий поток, на практике у меня никогда не было проблем, и именно с этого и заканчиваются большинство моих пакетов. Существует также Melpa Stable, который похож на Melpa, но задерживает отмеченные изменения восходящего репо вместо последней версии. У Melpa stable меньше пакетов, чем у Melpa.

    Режим Org имеет свой собственный package.el repo (http://orgmode.org/elpa/).

    Все репозитории пакетов работают одинаково, вы просто добавляете их в свой package-archives.

    Здесь более подробно сообщение в блоге об этой теме, с которой я в основном согласен.

  2. Я не уверен, но я думаю, что если пакет дублируется в разных репозиториях, порядок, в котором репозитории появляются в package-archives, определяет приоритет. Я не знаю, есть ли более высокий приоритет в начале или конце списка.

    Обновление: в Emacs 25 существует переменная package-archive-priorities, которую вы можете использовать для определения приоритетов ваших репозиториев пакетов (например, предпочитаете ELPA через MELPA).


Вот соответствующий раздел моего init.el, если вам интересно:

(setq jpk-packages
      '(
        ac-dabbrev
        ...
        yasnippet
        ))

(package-initialize)
(add-to-list 'package-archives
             '("melpa" . "http://melpa.org/packages/"))
(add-to-list 'package-archives
             '("org" . "http://orgmode.org/elpa/"))

;; install any packages in jpk-packages, if they are not installed already
(let ((refreshed nil))
  (when (not package-archive-contents)
    (package-refresh-contents)
    (setq refreshed t))
  (dolist (pkg jpk-packages)
    (when (and (not (package-installed-p pkg))
             (assoc pkg package-archive-contents))
      (unless refreshed
        (package-refresh-contents)
        (setq refreshed t))
      (package-install pkg))))

(defun package-list-unaccounted-packages ()
  "Like `package-list-packages', but shows only the packages that
  are installed and are not in `jpk-packages'.  Useful for
  cleaning out unwanted packages."
  (interactive)
  (package-show-package-list
   (remove-if-not (lambda (x) (and (not (memq x jpk-packages))
                            (not (package-built-in-p x))
                            (package-installed-p x)))
                  (mapcar 'car package-archive-contents))))

Ответ 2

В Emacs используйте M-x list-packages для отображения всех пакетов, которые будут автоматически обновлять содержимое архива. Затем используйте U, чтобы отметить все обновляемые пакеты для обновления, и x для фактического выполнения новых обновлений. Затем Emacs извлечет и установит все обновления и попросит вас удалить впоследствии старые устаревшие версии.

Вы также можете взглянуть на Carton, который обеспечивает более удобный способ управления пакетами путем объявления их в отдельном файле и включает в себя удобный клиент командной строки для автоматической установки и обновления пакетов, объявленных таким образом.


Порядок package-archives имеет значение не. Emacs объединяет содержимое всех архивов в единый согласованный список доступных пакетов и их версий, хранящихся в package-archive-contents.

После package-install Emacs просто выберет самую новую версию пакета, независимо от исходного архива. Для большего контроля над происхождением пакета MELPA предоставляет пакет melpa, который позволяет использовать черные или белые списки из указанных архивов.

Ответ 3

Это более подробный комментарий к ответу jpkotta.

Это настройка, которую я экспериментирую для ответа jpkotta выше:

(setq n 0)                                  ; set n as 0
(dolist (pkg pkgs-2b-present)               ; for each pkg in list
  (unless (or                               ; unless
           (package-installed-p pkg)        ; pkg is installed or
           (assoc pkg                       ; pkg is in the archive list
                  package-archive-contents))
    (setq n (+ n 1))))                      ; add one to n
(when (> n 0)                               ; if n > 0, 
  (package-refresh-contents))               ; refresh packages

(заменяя (when (not package-archive-contents) (package-refresh-contents))).

Пакет-список недостаточно освежался для моего использования.

Я не рассматривал, есть ли более эффективное решение моей проблемы; во-первых, я должен проверить, не исчезла ли эта проблема с этой настройкой.

Ответ 4

В терминале:

emacs

M-x list-packages

это помещает вас в буфер * пакетов *

shift-u x

emacs спросит вас (y/n), дождитесь обновлений

C-x k <ret>

это убьет буфер * packages * и вернет вас к * scratch *

C-x-C-c

это приведет к выходу из emacs и позволит вам перезапустить, но вам придется отлаживать: (

emacs

my 2 ¢