请问use-package到底是干什么用的?

我自己没有使用use-package,但是看到很多网友的配置都是用use-package。

我看了下作者的github:他说开发use-package的原因是因为他有超过80个package非常难以管理。

说实话,我不太理解。。。

  1. 安装package有package.el,用不着use-package
  2. 当init.el文件过大,需要切分不同package的配置时,我们采用文件的方式(比如:init-xxx.el)
  3. 对于特定mode的配置一般都有hook

那么use-package究竟是干什么用的,现在大家都装它吗?

可以延迟加载package,加快启动速度。 另外很多 package 只需要简单配置,use-package提供的很多东西让配置看起来更整洁了。

这个 emacs 用户把 use-package 用得很棒。

这个 emacs 用户觉得用子模块更符合一个 emacs 用户的最终选择。

use-package-always-ensure 都不知道,满眼的 :ensure t ,我不觉得这是用到了极致……

可能和我一样看到:ensure nil:defer nil觉得比较恶心。。

我知道有 use-package-always-ensure,但也没用它。一来这是后加入的,我用 use-package 的时候还没有;二来明显 Overkill 了吧,(use-package isearch) 也要安装么?

2 个赞

用过来组织 Package 配置的。把一个 Package 的所有的配置放到一个表达式中,看起来清晰,便于管理。比如我的 Magit 配置:

(use-package magit
  :ensure t
  :about A Git porcelain inside Emacs
  :homepage https://github.com/magit/magit
  :info (info "(magit) Top")
  :bind (("C-x g"   . magit-status))
  :config
  (setq-default magit-diff-refine-hunk t)
  (setq magit-save-repository-buffers 'dontask)
  ;; M-x `magit-list-repositories'
  (setq magit-repository-directories
        '(("~/.emacs.d"                . 0)
          ("~/.emacs.d/straight/repos" . 1)
          ("~/src"                     . 1))))

这一个表达式说明了:

  1. 确保安装 Magit (package.el 没这个功能);
  2. Magit 的简介、网址、文档;
  3. 设置按键;
  4. 设置变量。

当然不是了,怎么可能呢!不清楚它是干嘛的或者压根就不用它,完全没必要焦虑。

2 个赞

我的理解是这个包提供了一种抽象机制,提供对包配置的通用模板,对不必要的细节进行封装。 好处是不用在配置包的时候想:咦,lazy load是怎么实现来着?(特别是在几个月没写elisp的情况下。。。)

我觉得use-package很好用可能是我所有的包都是自己维护的(不用package.el),所以单独的配置比较复杂。

这个看各人爱好, 并不是必须品。

1 个赞

多谢。

请问确保是什么意思?是不是指如果没有这个包的话就会自动下载?

和require-package的功能类似?(require-package是我从purcell那里抄的函数)

(defun require-package (package &optional min-version no-refresh)
  "Install given PACKAGE, optionally requiring MIN-VERSION.
If NO-REFRESH is non-nil, the available package lists will not be
re-downloaded in order to locate PACKAGE."
  (if (package-installed-p package min-version)
      t
    (if (or (assoc package package-archive-contents) no-refresh)
        (if (boundp 'package-selected-packages)
            ;; Record this as a package the user installed explicitly
            (package-install package nil)
          (package-install package))
      (progn
        (package-refresh-contents)
        (require-package package min-version t)))))

是,没安装的话就安装。

我和你正好相反——我用的第三方package明显多于built-in package。所以我会把那个变量设为t,然后在不需要的地方添加:ensure nil


然后我感觉use-package做的事情还是以package为最小单位组织你的配置

无论是写通用配置还是个人化的配置,这样都会方便和整洁不少。毕竟有那些宏在就不用让配置散落得到处都是了……

5 个赞

愿闻其详。有没有更好的纯使用 use-package 的配置文件?

t 比 nil 多就不 overkill。 哦对了,我那句话是反驳“用到了极致”这个第三方给你加的定语,没有任何说这个配置本身乐色的意思。

我不明白什么叫“更好”……我自己只是照着 use-package 的 README 组织而已

他又不是bbatsov

如果没改前面的选项,为什么还要用 nil?况且如果这个选项改成 t 「这么好」,为什么默认值就不是 t,还有用户自己设置。

还是不太理解,比如:

这个``:`bind``` 和我直接写

(define-key tuareg-mode-map (kbd "<f8>") 'caml-types-show-type)

有什么区别呢?

比方说,我直接写的话还可以hook到特定mode下面:

(add-hook 'tuareg-mode-hook
          (lambda ()
            (define-key tuareg-mode-map (kbd "<f8>") 'caml-types-show-type)
            ))

use-package这么写它作用范围是多少呢?是Emacs启动就绑定吗?

如果写在config里呢?他们仅仅是分类好看吗?

不好意思, “更好”不太准确。

我不觉得这是用到了极致

只是想了解更极致的用法。

能提供一下 use-package-always-ensure:ensure t 区别的文档么?

我查到这个:

The ‘:ensure’ keyword causes the package(s) to be installed automatically if not already present on your system (set ‘(setq use-package-always-ensure t)’ if you wish this behavior to be global for all packages):

我看到了:

if you wish this behavior to be global for all packages

(defcustom use-package-always-ensure nil
  "Treat every package as though it had specified using `:ensure SEXP'.
See also `use-package-defaults', which uses this value."
  :type 'sexp
  :group 'use-package-ensure)

纯新手,这个 :type 'sexp 是什么?

请问 nykma 在需求的情况下会用到?

我自己的理解是用:

(require 'use-package-ensure)
(setq use-package-always-ensure t)

之后的 package 都不用写 :ensure t了。 请问是这样的么?

有没有什么副作用呢?

;; Version: 2.4

都是绑定按键、添加 Hook,只是写法不一样,怎么会可能会有区别呢!

Use-package 没有魔法,究竟起什么作用完全看你的代码。你的后续问题缺少代码,不清楚怎么回答。

是,我没用过这个选项,但我也是怎么认为的。

可能 (use-package isearch) 也会试图安装 isearch,但压根就没这个包

1 个赞