Хотя мой первоначальный ответ остается в силе, сейчас я использую метод , предложенный Джордоном . use-package
- фантастический инструмент для аккуратных конфигураций Emacs. На самом деле, я уже использовал его для чистой загрузки пакетов, когда писал свой оригинальный ответ.
В то время я не читал полностью до нижней части его README , и поэтому не понимал, что он также может справиться с установкой пакета:
] Для
package.el
пользователейВы можете использовать
use-package
для загрузки пакетов из ELPA с package.el. Это особенно полезно, если вы разделяете ваш .emacs между несколькими машинами; соответствующие пакеты будут загружены автоматически после размещения в вашем .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:
Бочка для 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
.
Pallet обновляет файл Cask с помощью пакетов, установленных интерактивно, например, через M-x package-list-packages
, так что вам не нужно вручную поддерживать вышеуказанный файл.
Вот мой ответ на похожий вопрос: https://stackoverflow.com/a/14838150/245173 . Код автоматически установит отсутствующие пакеты, но не обновит существующие, поэтому только первый запуск будет медленным.
Часть кода в вашем файле инициализации может сделать это довольно легко:
(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
. Все эти ответы будут работать, но я настоятельно рекомендую использовать 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's 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
каждый блок пакета использования будет устанавливать указанный пакет, если его там нет, и он инкапсулирует все мои дополнительные настройки для таких пакетов, как привязки клавиш, перехватчики и другие настройки.
В дополнение к превосходным вариантам, предложенным выше, вы также можете взглянуть на el-get . Я использую его для своей установки emacs и был очень доволен этим.
Чем он отличается?
Два основных преимущества el-get:
1) Он может получать пакеты из различных источников, на сайте перечислены следующие возможные источники
github, emacswiki, GNU ELPA или Marmalade, частные страницы, git, bzr, CVS и т. д.
2) Может использоваться для запуска таких команд ОС, как make
если требуется во время установки пакета. Это облегчает установку пакетов, которые имеют не-elisp части, например. 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
для обновления всех установленных пакетов.