我希望在一个名为init.el的文件中声明所有我想要在emacs中使用的包。我想知道是否可能在启动emacs时使用例如MELPA加载缺失的包,而无需浏览列表并标记我想要安装的包?
虽然我的原始回答仍然有效,但我现在使用Jordon建议的方法。use-package
是整洁的Emacs配置的绝佳工具。事实上,当我写下我的原始答案时,我已经在使用它来进行清洁包加载。
那时,我没有仔细阅读README底部, 所以没有意识到它还可以处理软件包安装:
在加载了For
package.el
usersYou can use
use-package
to load packages from ELPA with package.el. This is particularly useful if you share your .emacs between several machines; the relevant packages will download automatically once placed in your .emacs. The:ensure
key will install the package automatically if it is not already present:
(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网站:
Cask for Emacs就像Bundler对于Ruby一样。它旨在使Emacs中的ELPA依赖项管理无痛(尽可能无痛)。这包括您的本地Emacs安装和Emacs软件包开发。
在安装Cask之后,您需要将类似以下内容添加到Emacs配置文件中:
(require 'cask)
(cask-initialize)
(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.d/Cask
。M-x package-list-packages
)更新Cask文件,因此您无需手动维护上述文件。use-package
。use-package
不仅会自动安装缺失的软件包,而且会大大简化你的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)
(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)))
make
。这使得安装具有非elisp部分的软件包更加容易,例如emacs-jedi、ropemacs等。(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
以更新所有已安装的软件包即可。
我喜欢@steckerhalter的答案,因为它不需要安装任何软件包。在此基础上,我进行了以下改进:
查看package-selected-packages
变量,以便无需手动指定软件包。当您通过软件包管理器安装软件包时,此变量将由custom-set-variables
填充。
仅在存在未安装的软件包时才进行网络检查。
(let ((not-installed-packages
(seq-remove 'package-installed-p package-selected-packages)))
(when (consp not-installed-packages)
(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))
(when my-onlinep
(package-refresh-contents)
(dolist (p not-installed-packages)
(package-install p)))
(let ((still-not-installed-packages
(seq-remove 'package-installed-p package-selected-packages)))
(if (consp still-not-installed-packages)
(message "仍未安装: %s" still-not-installed-packages)
(message "成功安装: %s" not-installed-packages)))
))
package.el
系统处理依赖关系。例如,在MELPA稳定版中查看cider
。安装cider
时,也会安装任何缺少的依赖项。 - Chrisreq-package
。除了一些微小的语法糖之外,我不认为它比带有:ensure
的use-package
更有优势。但是,也许我漏看了什么......el-get
部分还算有趣。 - Chris:ensure
的时候,它更有用。 - Martinsos