首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Emacs init.el和Elisp及其等价于普通lisp的每个-p函数

Emacs init.el和Elisp及其等价于普通lisp的每个-p函数
EN

Stack Overflow用户
提问于 2015-06-14 01:37:23
回答 2查看 178关注 0票数 1

我正在编写我的init.el,并希望设置它,以便它检查是否安装了我定义的包,如果没有,则刷新包内容并安装它们。

我可以自动安装,但我只想刷新包列表,如果有包没有安装。

我想出了一种适用于普通lisp的方法,但似乎elisp并没有所有的-p,这是最简单的方法。

代码语言:javascript
复制
(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)))))

我想出的另一种方法是使用返回--但这似乎不是elisp的一部分。有了一些搜索,看起来我可以模仿这个接住和扔。

代码语言:javascript
复制
(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))

做这件事最好的方法是什么?

使用cl-lib和cl-编辑#1

代码语言:javascript
复制
(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库,请替换cl--每一个用我的--下面每一个都是Drew建议的答案。

谢谢你帮忙!

代码语言:javascript
复制
(defun my-every (pred list)
  (while (and list (funcall pred (car list)))
    (setq list (cdr list)))
  (null list))
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-14 06:46:04

我在Bookmark+中使用这个

代码语言:javascript
复制
(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))
票数 1
EN

Stack Overflow用户

发布于 2015-06-14 08:30:49

seq-every-p来自于seq.el,它可以从GNU获得,并且也将成为从25.1开始的内置包。

代码语言:javascript
复制
(seq-every-p #'package-installed-p '(helm helm-ls-git helm-ag))
=> t
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30825206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档