使用包-:init或:config


14

是否存在被用户可以确定封装配置是否需要任何规则:init:config

Answers:


13

是否存在被用户可以确定封装配置是否需要任何规则:init:config

没有适用于所有设置和程序包的通用规则。你只需要通过阅读这些关键字的含义,熟悉README文件use-package

总而言之,该:init块在启动时运行,就好像您已将其构成形式放在的顶层(即,在典型的to之外use-package)一样user-init-file。这意味着它们始终运行,而不管是否已加载相应的软件包。

:config另一方面,该块是通过相应的eval-after-load机制在相应的程序包加载后运行的。

这样,您可以通过将适用的长期运行的设置从:init移至来缩短启动时间:config。如果需要修改仅在加载特定程序包后定义的变量,则同样需要将其放置在:config块中。某些变量(例如gnus-home-directory)需要在加载相应包之前进行设置,因此应将它们放置在中:init。我强烈建议将所有适用的add-hook/ remove-hook调用放在该:init块中,因为即使未绑定钩子也可以对其进行修改,这为您的设置提供了更多的模块化。

您通常可以避免使用new :custom关键字或直接使用Easy Customization界面来弄清楚放置特定设置的位置。


2

我不确定是否有一个通用规则(除了“ :init在实际装入程序包之前用于预配置,而:config用于其他配置)”。

但是我自己使用:init,例如,当我想添加一些其他模式映射键绑定以使用“ this”包中的函数时。并且仍然希望“ this”包被延迟加载。

这是延迟加载的示例dired-ranger

(use-package dired-ranger
  :commands (dired-ranger-copy dired-ranger-paste dired-ranger-move)
  :init
  (add-hook 'dired-mode-hook
            (lambda ()
              (define-key dired-mode-map (kbd "M-w") 'dired-ranger-copy)
              (define-key dired-mode-map (kbd "C-y") 'dired-ranger-paste)
              (define-key dired-mode-map (kbd "C-c C-y") 'dired-ranger-move))))

PS:如果没有:defer:commands:mode和其他人,使封装加载懒惰,那么:init:config应或多或少相同(但:init较早进行评估:))


4
在模式挂钩中修改键绑定意味着每次在该模式下打开缓冲区都将运行它们。程序包加载后,只需修改一次键绑定。您可以:bind为此使用关键字,或在:config块中修改键绑定。
罗勒

确实,从未考虑过。但是:config为时已晚-延迟加载不会应用我的绑定。并且:bindwith :map并没有实际绑定它。
Maxim Kim

3
:config还不算太晚-这正是dired-mode-map首次定义的时间。你可能只是把它在错误use-package的形式dired-ranger代替dired,其中dired-mode-map定义。这也可以解释为什么您:bind不工作。基本上,您做错了或use-package有错误。不要混淆本地键绑定和eval-after-load自动加载的命令/键映射的全局键绑定。
罗勒

@罗勒,谢谢,你是对的。我的问题是我已经设置好了use-package-always-ensure,当我尝试使用打包的目录时,它无法从elpa取回它。但是在:ensure nil那里解决了问题,我可以设置链式包加载dired-> dired-rangerusing :after
Maxim Kim
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.