Answers:
是否存在被用户可以确定封装配置是否需要任何规则
: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界面来弄清楚放置特定设置的位置。
我不确定是否有一个通用规则(除了“ :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
较早进行评估:))
:config
为时已晚-延迟加载不会应用我的绑定。并且:bind
with :map
并没有实际绑定它。
: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-ranger
using :after
。
:bind
为此使用关键字,或在:config
块中修改键绑定。