如何通过指定包名列表自动安装Emacs包?

RNA*_*RNA 119 emacs install package

package用来管理我的Emacs扩展.为了在不同的计算机上同步我的Emacs设置,我想要一种在.emacs文件中指定包名列表的方法,然后package可以自动搜索和安装包,这样我就不需要通过调用手动安装它们M-x package-list-packages.怎么做?

Nic*_*out 101

; list the packages you want
(setq package-list '(package1 package2))

; list the repositories containing them
(setq package-archives '(("elpa" . "http://tromey.com/elpa/")
                         ("gnu" . "http://elpa.gnu.org/packages/")
                         ("marmalade" . "http://marmalade-repo.org/packages/")))

; activate all the packages (in particular autoloads)
(package-initialize)

; fetch the list of packages available 
(unless package-archive-contents
  (package-refresh-contents))

; install the missing packages
(dolist (package package-list)
  (unless (package-installed-p package)
    (package-install package)))
Run Code Online (Sandbox Code Playgroud)

  • 我更喜欢:(或(file-exists -p package-user-dir)(package-refresh-contents))来自接受的答案.此处的软件包刷新会增加已安装软件包的系统的启动时间.然而,这个答案的其余部分是完美的. (7认同)
  • @rfinz 你是什么意思?看起来只有在未安装软件包的情况下才会运行“package-refresh-contents”?`(or (file-exists-p package-user-dir))` 更好/它如何检查软件包是否已安装? (3认同)
  • 如果您已经在使用`use-package`,则可以使用`:ensure`关键字自动安装包.如果您需要通过自定义或以编程方式访问包列表,这也会设置`package-selected-packages`. (2认同)

RNA*_*RNA 45

根据Profpatsch的评论和以下答案:

(defun ensure-package-installed (&rest packages)
  "Assure every package is installed, ask for installation if it’s not.

Return a list of installed packages or nil for every skipped package."
  (mapcar
   (lambda (package)
     ;; (package-installed-p 'evil)
     (if (package-installed-p package)
         nil
       (if (y-or-n-p (format "Package %s is missing. Install it? " package))
           (package-install package)
         package)))
   packages))

;; make sure to have downloaded archive description.
;; Or use package-archive-contents as suggested by Nicolas Dudebout
(or (file-exists-p package-user-dir)
    (package-refresh-contents))

(ensure-package-installed 'iedit 'magit) ;  --> (nil nil) if iedit and magit are already installed

;; activate installed packages
(package-initialize)
Run Code Online (Sandbox Code Playgroud)

  • 那么我们在哪里列出我们想要安装的软件包呢? (3认同)
  • 这是......有副作用的地图吗?并且滥用"或"的懒惰?哦,哇 (2认同)

Nic*_*rdy 40

Emacs 25.1+将自动跟踪可自定义package-selected-packages变量中用户安装的包.package-install将更新自定义变量,您可以使用该package-install-selected-packages功能安装所有选定的包.

这种方法的另一个方便的优点是,您可以使用package-autoremove自动删除未包含的包package-selected-packages(尽管它将保留依赖项).

(package-initialize)
(unless package-archive-contents
  (package-refresh-contents))
(package-install-selected-packages)
Run Code Online (Sandbox Code Playgroud)

资料来源:http://endlessparentheses.com/new-in-package-el-in-emacs-25-1-user-selected-packages.html


Boz*_*sov 17

这是我用于Emacs Prelude的代码:

(require 'package)
(require 'melpa)
(add-to-list 'package-archives
             '("melpa" . "http://melpa.milkbox.net/packages/") t)
(package-initialize)

(setq url-http-attempt-keepalives nil)

(defvar prelude-packages
  '(ack-and-a-half auctex clojure-mode coffee-mode deft expand-region
                   gist haml-mode haskell-mode helm helm-projectile inf-ruby
                   magit magithub markdown-mode paredit projectile
                   python sass-mode rainbow-mode scss-mode solarized-theme
                   volatile-highlights yaml-mode yari yasnippet zenburn-theme)
  "A list of packages to ensure are installed at launch.")

(defun prelude-packages-installed-p ()
  (loop for p in prelude-packages
        when (not (package-installed-p p)) do (return nil)
        finally (return t)))

(unless (prelude-packages-installed-p)
  ;; check for new packages (package versions)
  (message "%s" "Emacs Prelude is now refreshing its package database...")
  (package-refresh-contents)
  (message "%s" " done.")
  ;; install the missing packages
  (dolist (p prelude-packages)
    (when (not (package-installed-p p))
      (package-install p))))

(provide 'prelude-packages)
Run Code Online (Sandbox Code Playgroud)

如果你不使用MELPA你不必要求它(如果你这样做melpa.el一定是你的load-path(或通过MELPA安装).包DB是不是每次刷新(因为这将启动显著放缓) - 仅限存在已卸载软件包的地方.


Ala*_*air 7

还没有人提到Cask,但它非常适合这项任务.

基本上,您创建~/.emacs.d/Cask列出要安装的软件包.例如:

(source melpa)
(depends-on "expand-region")
(depends-on "goto-last-change")
; ... etc
Run Code Online (Sandbox Code Playgroud)

cask从命令行运行将为您安装这些软件包,以及它们所需的任何依赖项.

此外,您可以使用自动更新已安装的软件包cask update.

  • python 脚本是 cask-cli.el 的一个薄包装,如果您愿意,可以直接调用它: `/path/to/emacs -Q --script /path/to/cask/cask-cli.el -- [参数]` (2认同)