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

如何通过指定包名列表自动安装Emacs包?,emacs,installation,package,Emacs,Installation,Package,我正在使用package管理我的Emacs扩展。为了在不同的计算机上同步我的Emacs设置,我想在.Emacs文件中指定一个包名列表,然后package可以自动搜索并安装包,这样我就不需要通过调用M-x package list packages手动安装包了。如何执行此操作?使用软件包名称作为符号调用软件包安装。通过交互调用软件包安装并在名称上完成,可以找到软件包的软件包名称。功能package-installed-p将告诉您是否已安装 例如: (mapc (lambda (package)

我正在使用
package
管理我的Emacs扩展。为了在不同的计算机上同步我的Emacs设置,我想在
.Emacs
文件中指定一个包名列表,然后
package
可以自动搜索并安装包,这样我就不需要通过调用
M-x package list packages
手动安装包了。如何执行此操作?

使用软件包名称作为符号调用
软件包安装。通过交互调用
软件包安装
并在名称上完成,可以找到软件包的软件包名称。功能
package-installed-p
将告诉您是否已安装

例如:

(mapc
 (lambda (package)
   (or (package-installed-p package)
       (package-install package)))
 '(package1 package2 package3))
(source melpa)
(depends-on "expand-region")
(depends-on "goto-last-change")
; ... etc

根据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)
以下是我使用的代码:

如果您不使用MELPA,您不需要它(如果您使用
MELPA.el
必须位于
加载路径上(或通过MELPA安装)。包db不会每次刷新(因为这会显著降低启动速度)-仅当存在已卸载的软件包时。

还没有人提到,但它非常适合此任务

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

(mapc
 (lambda (package)
   (or (package-installed-p package)
       (package-install package)))
 '(package1 package2 package3))
(source melpa)
(depends-on "expand-region")
(depends-on "goto-last-change")
; ... etc
从命令行运行
cask
将为您安装这些软件包以及它们所需的任何依赖项


另外,您可以使用
cask update

自动更新已安装的软件包。我喜欢检查用户是否希望按照中的步骤首先安装软件包。此外,在安装任何东西之前,我会刷新一次软件包内容。我不确定这是否是最好的方法,但我不认为最重要的答案适合我

(setq required-pkgs '(jedi flycheck cider clojure-mode paredit markdown-mode jsx-mode company))

(require 'cl)

(setq pkgs-to-install
      (let ((uninstalled-pkgs (remove-if 'package-installed-p required-pkgs)))
        (remove-if-not '(lambda (pkg) (y-or-n-p (format "Package %s is missing. Install it? " pkg))) uninstalled-pkgs)))

(when (> (length pkgs-to-install) 0)
  (package-refresh-contents)
  (dolist (pkg pkgs-to-install)
    (package-install pkg)))

Emacs 25.1+将在可自定义的
软件包选定软件包
变量中自动跟踪用户安装的软件包。
软件包安装
将更新自定义变量,您可以使用
软件包安装选定软件包
功能安装所有选定软件包

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


来源:

这是我的,比较短:)


.emacs
中添加
(package install'org)
后,我遇到了一个问题,即什么也没有发生。我想安装最新版本的
org mode
,而内置的
org mode
非常旧

我从Emacs 25.3.1中找到了
软件包安装的源代码。函数自身已检查是否安装了软件包,如果软件包已安装,则拒绝安装。因此,事实上,没有必要检查答案中的
(除非(package-installed-p package))

(defun软件包安装(打包&可选,不选择)
“安装软件包PKG。
PKG可以是一个包描述或一个命名一个可用包的符号
在“包存档”中的存档中。以交互方式提示输入其名称。
如果以交互方式调用或不选择nil,则将PKG添加到
`“打包选定的包”。
如果PKG是一个包desc,并且已经安装,请不要尝试
安装,但仍将其标记为选中。“
(互动
(项目
;初始化包系统以获取包列表
完成的符号。
(除非包已初始化)
(包初始化(t))
(除非包装存档内容
(包刷新内容))
(名单(实习生)(完成阅读)
“安装程序包:”
(德尔克零
(地图车(兰姆达(elt)
(除非(已安装包-p(车辆elt))
(符号名称(汽车elt)))
软件包存档内容)
零(t))
零))
(添加hook“post命令hook#”包菜单--post刷新)
(let)((名称)(如果(包装说明-p包装)
(包装说明名称包装)
(包装)
(除非(或不选择(包--用户选择的p名称))
(软件包--保存选定的软件包)
(cons名称包选定包)))
(如果出租((交易)
(如果(包装说明-p包装)
(除非(已安装的p包)
(包计算事务(列表包)
(包装说明要求包装)))
(包计算事务()(列表(列表包()()())))
(包下载事务)
(消息“`%s'已安装”name)))
内置的
org模式
也被视为已安装,并且
软件包安装
拒绝从ELPA安装较新版本。在花了一些时间阅读package.el之后,我提出了以下解决方案

(数据包(数据包)计算事务
()(列表(列表“python”(0 25 1))
(列出“组织”(20171211(())))
包下载交易可能更适合这里和
我没有时间检查
(软件包安装软件包)
它工作的原因是
package-*
族函数根据参数是符号还是
package desc
对象来处理参数。您只能通过
package desc
对象指定
软件包安装的版本信息。

还有另一种方法

;; assure every package is installed
(defun ensure-package-installed (&rest packages)
  (let ((user-required-packages
         (seq-remove
          (lambda (package) (package-installed-p package))
          packages)))
    (when user-required-packages
      (package-refresh-contents)
      (dolist (package user-required-packages)
        (package-install package)))))

;; list of packages to install
(ensure-package-installed
 'try
 'which-key)

谢谢,但是我得到一个错误
error:Package
dired+“不可用于安装”。dired+是我用你的代码尝试的一个包。当你运行
包列表包时,
dired+
是否显示?我相信你需要加上e
(package-initialize)
(unless package-archive-contents
  (package-refresh-contents))
(package-install-selected-packages)
(mapc
 (lambda (package)
   (unless (package-installed-p package)
     (progn (message "installing %s" package)
            (package-refresh-contents)
            (package-install package))))
 '(browse-kill-ring flycheck less-css-mode tabbar org auto-complete undo-tree clojure-mode markdown-mode yasnippet paredit paredit-menu php-mode haml-mode rainbow-mode fontawesome))
;; assure every package is installed
(defun ensure-package-installed (&rest packages)
  (let ((user-required-packages
         (seq-remove
          (lambda (package) (package-installed-p package))
          packages)))
    (when user-required-packages
      (package-refresh-contents)
      (dolist (package user-required-packages)
        (package-install package)))))

;; list of packages to install
(ensure-package-installed
 'try
 'which-key)