Я хочу объявить все пакеты, которые я хочу использовать в emacs в файле init.el. Интересно, можно ли загрузить недостающие пакеты, например. MELPA, когда я запускаю emacs, не просматривая список и не отмечая те, которые я хочу установить?
Автоматическая установка пакетов emacs с помощью MELPA
Ответ 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/.... Код будет автоматически устанавливать отсутствующие пакеты, но не будет обновлять существующие, поэтому только первый запуск медленный.