首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用MELPA自动安装emacs软件包

用MELPA自动安装emacs软件包
EN

Stack Overflow用户
提问于 2014-01-11 16:39:41
回答 6查看 11.6K关注 0票数 32

我想在init.el文件中声明我想在emacs中使用的所有包。我想知道是否有可能在启动emacs时加载缺少的软件包,例如MELPA,而不遍历列表并标记我想要安装的软件包?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2014-01-11 16:50:53

新答案:

虽然我最初的答案仍然有效,但我现在使用的方法是乔登use-package是一个非常棒的工具,用于整洁的Emacs配置。事实上,当我写我最初的答案时,我已经用它来加载干净的包了。

当时,我忽略了一直读到自述的底部,因此没有意识到它也可以处理包安装:

适用于package.el用户 您可以使用use-package从package.el加载包。如果您在多台机器之间共享您的.emacs,这尤其有用;相关的包一旦放在您的.emacs中就会自动下载。如果包尚未出现,:ensure键将自动安装: (使用-包装tex-站点:确保拍卖)

加载package.el并初始化包存储库之后,我的配置包含

代码语言:javascript
复制
(if (not (package-installed-p 'use-package))
    (progn
      (package-refresh-contents)
      (package-install 'use-package)))

(require 'use-package)

随后又出现了这样的片段:

代码语言:javascript
复制
;;; Expand-region
(use-package expand-region
  :ensure expand-region
  :bind ("C-=" . er/expand-region))

如果你觉得这个信息有用,请给若登投一票。

原来的答案:

看看木桶托盘,它们一起解决了这个问题。

从木桶网站上:

对于Emacs来说,木桶就像邦德勒之于Ruby一样。它的目标是使Emacs中的ELPA依赖管理无痛(尽可能无痛)。这包括本地Emacs安装和Emacs包开发。

安装木桶之后,需要将类似的内容添加到Emacs配置中:

代码语言:javascript
复制
(require 'cask)
(cask-initialize)

Cask为elisp依赖项定义了一种特定于doman的语言。要安装软件包,您需要一些就像这里概述的那样

代码语言:javascript
复制
(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,因此您不必手动维护上面的文件。

票数 42
EN

Stack Overflow用户

发布于 2014-01-24 21:33:09

所有这些答案都会有效,但我强烈建议使用use-package

在此发现:https://github.com/jwiegley/use-package

use不仅会自动安装丢失的软件包,而且大大简化了init.el。

下面是我的init.el的一个例子

代码语言:javascript
复制
;; 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

如果没有指定的包,每个use块都会安装它,并且它封装了我为包(如键绑定、钩子和其他自定义)所做的所有附加设置。

票数 34
EN

Stack Overflow用户

发布于 2014-01-11 17:47:59

init文件中的一些代码可以很容易地做到这一点:

代码语言:javascript
复制
(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

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21064916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档