有没有优雅的方法可以合并require-package和maybe-require-package?

我现在在用旧版的purcell的require-packagemaybe-require-package来自动安装packages.

(defun require-package (package &optional min-version)
  "Install PACKAGE if it's not installed.
Optionally require MIN-VERSION."
  (or (package-installed-p package min-version)
      (if (assoc package package-archive-contents)
          (package-install package)
        (progn
          (package-refresh-contents)
          (package-install package)))))

(defun maybe-require-package (package &optional min-version)
  "Try to install PACKAGE, and return non-nil if successful or PACKAGE exists.
In the event of failure, return nil and print a warning message.
Optionally require MIN-VERSION."
  (condition-case err
      (require-package package min-version)
    (error
     (message "Failed to install optional package `%s': %S" package err)
     nil)))

但是我在想,有没有啥优雅的方法能把这俩合成一个?还是说我这想法本身是愚蠢的?

我更倾向于我自己很蠢,因为这两个东西的功能是不一样的。但是我总管不住我的强迫症啊……

谢谢各位

  • require-package 安装没有安装的包,失败则抛出异常
  • maybe-require-package 使用 require-package 安装包,捕获异常,转换成一般的 message 打印出来

看你是要模糊这两者的区别,还是合并但保留两者的区别:

(cl-defun require-package (package &key min-version ignore-error)
  ...)

(require-package foo-package) ;; 必须安装的包,却少则无法正常使用
(require-package bar-package :ignore-error t) ;; 可有可无的包,不安装也不影响使用
1 个赞

……所以我为什么说我的想法很蠢……

模糊带来的问题是要么我需要很多额外的判断来确保运行正常(我不能再假设package已经存在),要么就是非得所有的package都装上,才能正常启动。

保留区别的话……我不想搞得那么复杂(否则我干嘛不去用use-package……)。


等等……use-package似乎做的就是“捕获异常,转换成一般的 message 打印出来”?也就是(when (maybe-require-package ...) ...)的结合体?