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

Автоматическая установка пакетов emacs с помощью MELPA

Я хочу объявить все пакеты, которые я хочу использовать в emacs в файле init.el. Интересно, можно ли загрузить недостающие пакеты, например. MELPA, когда я запускаю emacs, не просматривая список и не отмечая те, которые я хочу установить?

4b9b3361

Ответ 1

Новый ответ:

Пока мой первоначальный ответ по-прежнему действителен, теперь я использую метод предложенный Jordon. use-package - фантастический инструмент для аккуратных конфигураций Emacs. Фактически, я уже использовал его для загрузки чистого пакета, когда я написал свой первоначальный ответ.

В то время я пренебрегал прочтением до нижней части README и, следовательно, не понимал, что это может также выполните установку пакета:

Для package.el пользователей

Вы можете использовать use-package для загрузки пакетов из ELPA с помощью пакета package.el. Это особенно полезно, если вы делитесь своими .emac между несколькими машинами; соответствующие пакеты будут загружаться автоматически после размещения в вашем .emacs. Клавиша :ensure автоматически установит пакет, если он еще не присутствует:

(use-package tex-site
  :ensure auctex)

После загрузки package.el и инициализации моих репозиториев пакетов моя конфигурация содержит

(if (not (package-installed-p 'use-package))
    (progn
      (package-refresh-contents)
      (package-install 'use-package)))

(require 'use-package)

а затем много таких фрагментов:

;;; Expand-region
(use-package expand-region
  :ensure expand-region
  :bind ("C-=" . er/expand-region))

Если вы найдете эту информацию полезной, пожалуйста, предоставьте Джордону надпись.

Оригинальный ответ:

Посмотрите Cask и Pallet, которые работают вместе для решения этой проблемы.

На веб-сайте Cask:

Cask для Emacs - это то, что Bundler для Ruby. Он нацелен на то, чтобы беззаботно (как безболезненно, как безболезненно) управлять зависимостями ELPA в Emacs. Это включает в себя как локальную установку Emacs, так и разработку пакета Emacs.

После установки Cask вам нужно добавить что-то подобное в конфигурацию Emacs:

(require 'cask)
(cask-initialize)

Cask определяет язык, зависящий от doman для зависимостей elisp. Для установки пакетов вам понадобится что-то как то, что описано здесь:

(source melpa)

(depends-on "auto-complete")
(depends-on "dash")
(depends-on "f")
(depends-on "flycheck")
(depends-on "helm")
(depends-on "magit")
(depends-on "popup")
(depends-on "projectile")
(depends-on "s")
(depends-on "smartparens")
(depends-on "yasnippet")

Обратите внимание, что это не входит в конфигурационный файл Emacs, а скорее в ~/.emacs.d/Cask.

Палет обновляет файл Cask с помощью пакетов, установленных в интерактивном режиме, например. через M-x package-list-packages, поэтому вам не нужно вручную поддерживать вышеуказанный файл.

Ответ 2

Все эти ответы будут работать, но я настоятельно рекомендую использовать use-package

найдено здесь: https://github.com/jwiegley/use-package

use-package не только автоматически установит ваши недостающие пакеты, но значительно упростит ваш init.el.

Вот пример из моего init.el

;; initial package setup
(push "path/to/use-package" load-path)
(require 'use-package)
(require 'package)
(mapc (lambda(p) (push p package-archives))
      '(("marmalade" . "http://marmalade-repo.org/packages/")
        ("melpa" . "http://melpa.milkbox.net/packages/")))
(package-refresh-contents)
(package-initialize)

;; this will install undo-tree if it not there
;; and it will set it up how I want
(use-package undo-tree
  :init (global-undo-tree-mode 1)
  :bind (("C-c j" . undo-tree-undo)
         ("C-c k" . undo-tree-redo)
         ("C-c l" . undo-tree-switch-branch)
         ("C-c ;" . undo-tree-visualize))
  :ensure t)

Взгляните на мой init.el здесь: https://github.com/jordonbiondo/.emacs.d/blob/master/init.el

каждый блок use-package будет устанавливать указанный пакет, если он там отсутствует, и он инкапсулирует все мои дополнительные настройки для пакетов, таких как привязки клавиш, перехваты и другие настройки.

Ответ 3

Немного кода в вашем файле инициализации может сделать это довольно легко:

(setq my-onlinep nil)
(unless
    (condition-case nil
        (delete-process
         (make-network-process
          :name "my-check-internet"
          :host "elpa.gnu.org"
          :service 80))
      (error t))
  (setq my-onlinep t))

(setq my-packages
      '(ack-and-a-half
        ac-nrepl
        ... more packages here ...
        web-mode
        yaml-mode
        yari
        yasnippet))

(when my-onlinep
  (package-refresh-contents)
  (cl-loop for p in my-packages
           unless (package-installed-p p)
           do (package-install p)))

Онлайн-проверка на самом деле не нужна, но помогает избежать заклинивания Emacs при отсутствии подключения к Интернету.

Для моей полной конфигурации см. здесь: http://steckerhalter.co.vu/steckemacs.html#sec-2-5

Ответ 4

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

Как это отличается?

Двумя основными преимуществами el-get являются

1) Он может извлекать пакеты из разных источников, на веб-сайте перечислены следующие возможные источники

github, emacswiki, GNU ELPA или Marmalade, страницы с частным размещением, git, bzr, CVS и т.д.

2) Он может использоваться для запуска команд ОС, таких как make, если это необходимо при установке пакета. Это упрощает установку пакетов с неэлементными частями, например. emacs-jedi, ropemacs и т.д.

Установка el-get

Установка довольно проста, вам нужно будет добавить следующий код начальной загрузки, указанный на их веб-сайте, в ваш файл инициализации.

(add-to-list 'load-path "~/.emacs.d/el-get/el-get")

(unless (require 'el-get nil 'noerror)
  (with-current-buffer
      (url-retrieve-synchronously
       "https://raw.github.com/dimitri/el-get/master/el-get-install.el")
    (goto-char (point-max))
    (eval-print-last-sexp)))

(el-get 'sync)

Это установит el-get, если он еще не установлен.

Установка пакетов

Затем вы можете объявить пакеты, которые хотите установить, и el-get установить

;; List of packages you want to install
(defvar my-packages '(auto-complete flycheck smart-parens...))
;; This will install any package from my-packages which is not already installed
(el-get 'sync my-packages)

ИЛИ

Вы всегда можете устанавливать пакеты вручную, делая el-get-install <package-name> RET, я сомневаюсь, что вам захочется установить ваши десятки разных пакетов таким образом, но это возможно.

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

Обновление пакетов - это просто вопрос el-get-update для обновления определенного пакета или el-get-update-all для обновления всех установленных пакетов.

Ответ 5

Вот мой ответ на аналогичный вопрос: fooobar.com/info/55583/.... Код будет автоматически устанавливать отсутствующие пакеты, но не будет обновлять существующие, поэтому только первый запуск медленный.