使用MELPA自动安装emacs软件包

时间:2014-01-11 16:39:42

标签: emacs elisp packages

我想在 init.el 文件中声明我想在emacs中使用的所有包。我想知道是否有可能加载丢失的包,例如当我启动emacs而不通过列表并标记我要安装的那些时,MELPA?

6 个答案:

答案 0 :(得分:40)

新答案:

虽然我的原始答案仍然有效,但我现在使用方法suggested by Jordonuse-package是整洁Emacs配置的绝佳工具。事实上,当我写完原始答案时,我已经将它用于干净的包装加载。

那时,我忽略了一直读到the bottom of its README,因此没有意识到它也可以处理包安装:

  

对于package.el用户

     

您可以使用use-package使用package.el从ELPA加载包。如果您在多台计算机之间共享.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))

如果您发现这些信息有用,请给Jordon一个upvote。

原始答案:

查看CaskPallet,它们共同解决此问题。

来自Cask网站:

  

Cask for Emacs是Bundler与Ruby的关系。它旨在使Emacs中的ELPA依赖管理变得无痛(尽可能无痛)。这包括您的本地Emacs安装和Emacs包开发。

installing Cask之后,您需要在Emacs配置中添加以下内容:

(require 'cask)
(cask-initialize)

Cask为elisp依赖项定义了一个特定于doman的语言。要安装软件包,您需要like what is outlined here

(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,您无需手动维护上述文件。

答案 1 :(得分:34)

所有这些答案都有效,但我强烈建议您使用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

每个use-package块将安装指定的包,如果它不存在,它将封装我所有的附加设置,如keybindings,hooks和其他自定义。

答案 2 :(得分:6)

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

(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

答案 3 :(得分:5)

除了上面建议的优秀选项,您还可以查看el-get。我将它用于我的emacs设置并且非常满意。

有什么不同?

el-get的两个主要优点是

1)它可以从各种来源获取包,该网站列出了以下可能的来源

  

github,emacswiki,GNU ELPA或Marmalade,私人托管页面,git,bzr,CVS等

2)如果在安装包期间需要,可以使用它来运行make之类的OS命令。这使得安装具有非elisp部件的包更容易,例如。 emacs-jedi,ropemacs等

安装el-get

安装非常简单,您需要将他们网站上提供的以下引导代码添加到您的init文件中。

(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)

OR

您始终可以通过el-get-install <package-name> RET手动安装软件包,我怀疑您是否希望以这种方式安装许多不同的软件包,但这是可能的。

更新套件

更新软件包只需要el-get-update更新特定软件包或el-get-update-all更新所有已安装软件包。

答案 4 :(得分:2)

以下是我对类似问题的回答:https://stackoverflow.com/a/14838150/245173。代码将自动安装缺少的软件包,但不会更新现有软件包,因此只有第一次启动才会很慢。

答案 5 :(得分:0)

我喜欢@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 "Still not installed: %s" still-not-installed-packages)
            (message "Successfully installed: %s" not-installed-packages)))
        ))