[Elisp]关于对leaf.el的一层简单包装求优解

最近在翻新自己的配置,打算从use-package切换到leaf,但是leaf貌似还没有支持类似于use-pakcage-always-ensure的参数,所以我包装一个宏出来,但是本人elisp太菜了,所以来看看各位大佬有没有更优解。

菜鸡代码如下:

(defmacro leaf! (name &rest plist)
  "This is wrapper around `leaf', The function is similar to use-package-always-ensure."
  (declare (indent 1))
  `(leaf ,name ,@(append `(:ensure t) plist)))
(setq leaf-defaults '(:package t))

谢谢,这个假如说存在内置包的话,需要设置:ensure nil吗?

是的zsbd

我还是打算实现这个宏,我想干脆内置和melpa/elpa的包分开管。 我虽然想要use-package-always-ensure的功能,但我实在不想看到一堆的:ensure nil了 :grinning:

so,在了解elisp全局变量动态绑定可以用let临时修改之后,我参照leaf的宏又写了一个。

(defmacro leaf! (name &rest plist)
  "This is wrapper around `leaf', The function is similar to use-package-always-ensure."
  (declare (indent 1))
  (if (package-built-in-p 'name)
      `(leaf ,name ,@plist)
    (let* ((leaf-defaults '(:package t))
       (args* (leaf-sort-values-plist
	       (leaf-normalize-plist
	        (leaf-apply-keyword-alias
	         (leaf-append-defaults plist)) 'merge 'eval)))
       leaf--autoload)
      `(prog1 ',name
     ,@(leaf-process-keywords name args* args*)))))