Emacs init.el 和 Elisp 以及普通 lisp every-p 函数的等价物
Emacs init.el and Elisp and equivalent of common lisp every-p function
我正在处理我的 init.el 并希望进行设置,以便它检查是否安装了我定义的包,如果没有,则刷新包内容并安装它们。
我可以很好地自动安装,但我只想在有未安装的包时刷新包列表。
我想出了一些适用于普通 lisp 的东西,但似乎 elisp 没有 every-p,这是最简单的方法。
(defparameter *my-packages* '(evil evil-leader helm))
(defparmeter *installed-pkgs* '())
;fake package-installed-p
(defun package-installed-p(pkg)
(member pkg *installed-pkgs*))
;fake package-install
(defun package-install(pkg)
(format t "Installing package: ~a~%" pkg))
(defun check-installed-p()
(every #'package-installed-p *my-packages*))
(defun mytest()
(unless (check-installed-p)
(package-refresh-contents)
(dolist (pkg *my-packages*)
(unless (package-installed-p pkg)
(package-install pkg)))))
我想出的另一种方法是使用 return-from,但似乎这不是 elisp 的一部分。通过一些搜索,我似乎可以用 catch 和 throw 来模拟它。
(defun check-installed-p()
(dolist (pkg *my-packages*)
(unless (package-installed-p(pkg)
(return-from check-installed-p NIL)))
(return-from check-installed-p T))
最好的方法是什么?
编辑#1
使用 cl-lib 和 cl-extra
(require 'package)
(require 'cl-lib)
(require 'cl-extra)
(push '("melpa" . "http://melpa.org/packages/") package-archives )
(package-initialize)
(defconst *my-packages* '(evil evil-leader helm))
(defun my-package-check()
(unless (cl-every #'package-installed-p *my-packages)
(package-refresh-contents)
(dolist (pkg *my-packages*)
(unless (package-installed-p pkg)
(package-install pkg)))))
(my-package-check)
(require 'evil)
(require 'evil-leader)
(require 'helm-config)
编辑 #2
如果不需要常用的 lisp 库,请按照 Drew 的建议答案将 cl-every 替换为 my-every。
感谢帮助!
(defun my-every (pred list)
(while (and list (funcall pred (car list)))
(setq list (cdr list)))
(null list))
我在Bookmark+中使用这个:
(defun bmkp-every (predicate list)
"Return t if PREDICATE is true for all elements of LIST; else nil."
(while (and list (funcall predicate (car list))) (setq list (cdr list)))
(null list))
seq-every-p
来自 seq.el,可从 GNU ELPA 获得,也将成为 25.1 的内置包。
(seq-every-p #'package-installed-p '(helm helm-ls-git helm-ag))
=> t
我正在处理我的 init.el 并希望进行设置,以便它检查是否安装了我定义的包,如果没有,则刷新包内容并安装它们。
我可以很好地自动安装,但我只想在有未安装的包时刷新包列表。
我想出了一些适用于普通 lisp 的东西,但似乎 elisp 没有 every-p,这是最简单的方法。
(defparameter *my-packages* '(evil evil-leader helm))
(defparmeter *installed-pkgs* '())
;fake package-installed-p
(defun package-installed-p(pkg)
(member pkg *installed-pkgs*))
;fake package-install
(defun package-install(pkg)
(format t "Installing package: ~a~%" pkg))
(defun check-installed-p()
(every #'package-installed-p *my-packages*))
(defun mytest()
(unless (check-installed-p)
(package-refresh-contents)
(dolist (pkg *my-packages*)
(unless (package-installed-p pkg)
(package-install pkg)))))
我想出的另一种方法是使用 return-from,但似乎这不是 elisp 的一部分。通过一些搜索,我似乎可以用 catch 和 throw 来模拟它。
(defun check-installed-p()
(dolist (pkg *my-packages*)
(unless (package-installed-p(pkg)
(return-from check-installed-p NIL)))
(return-from check-installed-p T))
最好的方法是什么?
编辑#1 使用 cl-lib 和 cl-extra
(require 'package)
(require 'cl-lib)
(require 'cl-extra)
(push '("melpa" . "http://melpa.org/packages/") package-archives )
(package-initialize)
(defconst *my-packages* '(evil evil-leader helm))
(defun my-package-check()
(unless (cl-every #'package-installed-p *my-packages)
(package-refresh-contents)
(dolist (pkg *my-packages*)
(unless (package-installed-p pkg)
(package-install pkg)))))
(my-package-check)
(require 'evil)
(require 'evil-leader)
(require 'helm-config)
编辑 #2
如果不需要常用的 lisp 库,请按照 Drew 的建议答案将 cl-every 替换为 my-every。
感谢帮助!
(defun my-every (pred list)
(while (and list (funcall pred (car list)))
(setq list (cdr list)))
(null list))
我在Bookmark+中使用这个:
(defun bmkp-every (predicate list)
"Return t if PREDICATE is true for all elements of LIST; else nil."
(while (and list (funcall predicate (car list))) (setq list (cdr list)))
(null list))
seq-every-p
来自 seq.el,可从 GNU ELPA 获得,也将成为 25.1 的内置包。
(seq-every-p #'package-installed-p '(helm helm-ls-git helm-ag))
=> t