use-packageの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実行されているのはいつですか?

回答:


16

パッケージが延期される場合、つまり、必要になるまでロードされない場合、それらは異なります。その場合:init、emacsファイルが最初に読み込ま:configれたときに実行されますが、パッケージが実際にロードされたときに実行されます。

あなたの例ではmode、パッケージのロードを暗黙的に延期します。htmlファイルが初めてアクセスされたときにパッケージがロードされるように設定しました。

:demandパッケージが起動時に常にロードされるようにするために使用できますが、ここでやりたいことはフックをに入れることです:init

docstringから:

:init Code to run when `use-package' form evals.

これをuser-initファイルに入れているため、基本的には起動時に実行されます。

: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パッケージがロードされたかどうかに関係なく、initコードは常に評価されるため、同じ式を動作するように移動します。



@npostavsありがとう、注目に値します。私はまだuse-package 2.0に移行していません。一つには、私は:idleかなり広範囲に使用しており、「:idle has been removed」の影響については調べていません。
グルーカス

1
彼がHTMLファイルにアクセスしてパッケージのロードをトリガーしたときに、auto-fillオフにならない、つまり構成コードが実行されなかった理由は、まだわかりません。私は同じ問題を抱えています。
ケンウィリアムズ

@KenWilliamsあなたの問題はhtmlモードにもありますか?ここでの実際の問題html-modeは、パッケージではないことだと思います。少なくとも私の現在のバージョンのEmacsではhtml-mode、パッケージで定義されていますsgml-mode。そのため、指定されuse-packageたパッケージhtml-modeがロードされたときに何かを行うように指示すると、そのようなパッケージはロードされないため、コードは実行されません。にhtmlモードのセットアップを配置する必要があります(use-package sgml-mode ....)
グルーカス

申し訳ありませんが、私の問題はorg-modeにありhtml-modeます 同様の問題として、パッケージが呼び出されますorg-modeが、ELPAパッケージが呼び出されorgます。たぶんそれが混乱しているのでしょうか(または私)?
ケンウィリアムズ

7

この例により、との違いを理解しやすく:initなりました:configace-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例の違いは何ですか?
博士号

@doctorate::preface問題のパッケージがされていても実行されて無効のに対し、:initパッケージが有効になっている場合にのみ実行されます。
-bbenne10
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.