Answers:
如果推迟包装(即直到需要时才加载),则它们是不同的。在这种情况下,:init
将在首次读取emacs文件时:config
执行,但在实际加载软件包时执行。
在您的示例中,使用mode
隐式延迟加载程序包。您已将包配置为在首次访问html文件时加载。
您可以:demand
用来确保程序包始终在启动时加载,但是更有可能在此处执行的操作是挂入:init
。
从文档字符串:
:init Code to run when `use-package' form evals.
由于将其放入用户初始文件中,因此基本上意味着它将在启动时运行。
:config Runs if and when package loads.
因此,在实际加载软件包之前,请不要运行。
:defer Defer loading of package -- automatic if :commands, :bind, :bind*, :mode or :interpreter are used.
请注意会自动使软件包延迟的事项列表。基本上,如果您说出use-package
需要此软件包的条件,它将假定您不希望在这些条件出现之前加载它。
:demand Prevent deferred loading in all cases.
无论您指定了什么其他选项,请确保在启动时加载了程序包。
更新资料
根据最近的评论重新讨论一下……我上面说的都是正确的,但我认为它不能正确回答问题。这里的根本问题实际上html-mode
不是包,而是包定义的模式sgml-mode
。这对我来说是预期的:
(use-package sgml-mode
:mode ("\\.html\\'" . html-mode)
:config (add-hook 'html-mode-hook 'turn-off-auto-fill))
在原始示例中,:config
永远不会对表达式求值,因为名为html-mode
永不加载的程序包。:init
之所以使用相同的表达式,是因为始终评估初始化代码,而不管是否加载了软件包。
:idle
相当多的内容,而没有研究“:idle已被删除”的影响。
auto-fill
没有关闭,即配置代码未运行。我也有同样的问题。
html-mode
不是包装。至少在我当前的Emacs版本中html-mode
是在包中定义的sgml-mode
。因此,如果告诉您use-package
在html-mode
加载名为的软件包时执行某些操作,则该代码将永远不会运行,因为从未加载过此类软件包。您需要将html模式设置放入(use-package sgml-mode ....)
。
org-mode
,不是html-mode
。还有一个类似的问题,即调用了该程序包org-mode
,但调用了ELPA程序包org
。也许这使我(或我)感到困惑?
这个例子让我多容易理解之间的差异:init
和:config
。让我们以ace-window
包为例(但这可以是任何包)。把它放在你的init.el
文件中:
(use-package ace-window
:ensure t
:defer t
:config
(progn
(message "ace window: hello world")))
现在打开您的emacs,然后在*Messages*
缓冲区中查看是否有任何hello world
消息。由于推迟了包裹,您将找不到任何东西。现在从更改config
为init
:
(use-package ace-window
:ensure t
:defer t
:init
(progn
(message "ace window: hello world")))
现在关闭并重新打开emacs并检查*Messages*
缓冲区。您将看到此消息,ace window: hello world
因为无论:init
给出什么时间,代码都会运行。在这种情况下,config
它将仅在加载该程序包时运行。
:init
和关键字之间有什么区别:preface
?
:preface
即使禁用:init
了相关软件包,也将运行,而仅当启用软件包时才运行。