如何通过指定包名列表自动安装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)