繁体   English   中英

使用 MELPA 自动安装 emacs 包

[英]Auto install emacs packages with MELPA

我想在init.el文件中声明我想在 emacs 中使用的所有包。 我想知道在启动 emacs 时是否可以使用 MELPA 加载丢失的包,而无需查看列表并标记我要安装的包?

新答案:

虽然我最初的答案仍然有效,但我现在使用Jordon 建议的方法。 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))

如果您觉得这些信息有用,请给 Jordon 点赞。

原答案:

看看CaskPallet ,它们共同解决了这个问题。

从木桶网站:

Emacs 的 Cask 就像 Bundler 之于 Ruby。 它旨在使 Emacs 中的 ELPA 依赖管理无痛(尽可能无痛)。 这包括本地 Emacs 安装和 Emacs 包开发。

安装 Cask 后,您需要在 Emacs 配置中添加如下内容:

(require 'cask)
(cask-initialize)

Cask 为 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 文件,例如通过Mx package-list-packages ,因此您不必手动维护上述文件。

所有这些答案都有效,但我强烈建议使用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 块将安装指定的包,并且它封装了我对包的所有附加设置,如键绑定、钩子和其他自定义。

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

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

有什么不同?

el-get 的两个主要优点是

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

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

2) 如果在软件包安装期间需要,它可用于运行诸如make类的操作系统命令。 这使得安装具有非 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)

或者

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

更新包

更新软件包只是执行el-get-update更新特定软件包或el-get-update-all更新所有已安装软件包的问题。

这是我对类似问题的回答: https : //stackoverflow.com/a/14838150/245173 代码会自动安装缺失的包,但不会更新现有的包,所以只有第一次启动比较慢。

我喜欢@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))) ))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM