使用包中init和config之间的区别


16

我有这样的配置:

(use-package html-mode
  :mode "\\.html\\'"
  :config
  (progn
    (add-hook 'html-mode-hook 'turn-off-auto-fill)))

现在,当我去访问HTML文件时,我发现auto-fill它没有关闭。但是,如果使用:init的不是:configauto-fill关断。所以我的问题是命令何时:config执行?

Answers:


16

如果推迟包装(即直到需要时才加载),则它们是不同的。在这种情况下,: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之所以使用相同的表达式,是因为始终评估初始化代码,而不管是否加载了软件包。



@npostavs谢谢,值得注意。我还没有自己使用过使用包2.0。一方面,我使用了:idle相当多的内容,而没有研究“:idle已被删除”的影响。
glucas 2015年

1
我仍然不明白为什么当他访问HTML文件并触发程序包加载时auto-fill没有关闭,即配置代码未运行。我也有同样的问题。
肯·威廉姆斯

@KenWilliams您的问题也是html-mode吗?我认为这里的实际问题html-mode不是包装。至少在我当前的Emacs版本中html-mode是在包中定义的sgml-mode。因此,如果告诉您use-packagehtml-mode加载名为的软件包时执行某些操作,则该代码将永远不会运行,因为从未加载过此类软件包。您需要将html模式设置放入(use-package sgml-mode ....)
glucas

对不起-我的问题是关于org-mode,不是html-mode。还有一个类似的问题,即调用了该程序包org-mode,但调用了ELPA程序包org。也许这使我(或我)感到困惑?
肯·威廉姆斯

7

这个例子让我多容易理解之间的差异: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消息。由于推迟了包裹,您将找不到任何东西。现在从更改configinit

(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
博士学位

@doctorate::preface即使禁用:init了相关软件包,也将运行,而仅当启用软件包时才运行。
bbenne10 '18年
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.