遅延初期化をどこに含める必要がありますか?


13

latexモードに特定のキーバインディングを追加したい:

(define-key latex-mode-map (kbd "<f6>") 'my-latex-defun)

同時に、特定のモードがロードされたときにのみ設定したいです。そのため、適切なフック(latex-mode-hook)を使用してそれを達成するか、句(with-eval-after-load "tex-mode" ...を使用してキーバインディング定義をラップするか、どちらが優先されるか(ベストプラクティス)を知りたいと思います。私は両方をテストしましたが、うまく動作しますが、どちらが正しい方法なのでしょうか。


2
with-eval-after-load一度ロードされると、キーマップの変更がそこに行きます。フックは、モードが実行されるたびにロードされます。たとえば、モードに関連付けられた新しいファイルのロード、またはフックが定義されているときです。あなたは、例えばロードでしょうflyspell-modehl-line-modeフックインチ 私init.elではwith-eval-after-load約160回とadd-hook110回使用しています。遅延initは良いinit(IMO)です。
ラスマス14年

時間があれば、@ rasmusは答えのように聞こえます:)私の意見では、コードを実行する回数の違いが主な考慮事項です。(それも私が考えることができる唯一のものです…)
ショーンオールレッド14年

モードフックでキーバインドを変更するのが悪い考えである理由については、emacs.stackexchange.com
questions /

回答:


18

遅延initは良いinitです。

(IMO)

使用する場合 with-eval-after-load

with-eval-after-load特定の機能またはファイル最初にロードされるときに1回ロードされるため、キーマップの変更は明らかにこれらの1つに含まれます。なく、少なくともキーマップが初期化時に知られていない可能性があるため、[のような何かしてみてくださいで]を。フックは、フックが開始されるたびに関数をキーにバインドするため、ここでは良い解決策ではありません。以下のようメガネザルのノート、あなたがすることができます続きを読む理由についてではないにフックでを。(define-key message-mode-map (kbd "C-c f") 'Footnote-add-footnote)emacs -qlocal-set-key

最後に、ノートそのwith-eval-after-loadGNU Emacsの24.4は約2ラインラッパーであるの引用符で囲む必要はありません。eval-after-loadbody

フックを使用する場合

フックは、特定のモードが開始されるなど、基準が満たされるたびにロードされる関数のリストです。フックの一般的な用途は、以下のようなマイナーモード、ロードすることであるflyspell-modeかをhl-line-mode。例(add-hook 'org-agenda-mode-hook 'hl-line-mode)。以下のようレミは指摘し、add-hooksスマートで、フック変数がまだには、ロードされている場合でも、正しいことを行います。それにもかかわらず、私は次のような多くの節を持っています。これらは速度向上にとっては無視できるかもしれませんが、組織と依存関係構造の感覚を与えます:

(with-eval-after-load 'org-agenda
  (add-hook 'org-agenda-mode-hook 'hl-line-mode))

後にフックに追加するのはなぜorg-agendaですか?いつものように、C-h v org-agenda-mode-hook C-j配信します。フックはにorg-agenda.el示すように定義されています*help*

追加機能の読み込み with-eval-after-load

with-eval-after-load追加の機能をロードするためにも重要です。おそらく(with-eval-after-load 'org (require 'org-inlinetask))組織のインラインタスクをロードするようなものが必要でしょう。理由を見るために(find-library "org-inlinetask")。以来org-inlinetasks.el、直接(require 'org)、素敵なすべてのautoloadあなたのやさしいEmacsのメンテナを提供するために、細心の注意を取ったことは、「無視」され、すべてのorg.el(c)ロードされます。

しかし、(個人的な)defun複数の場所が必要な場合はどうでしょうか?あなたが本当にうるさいなら、defunsをあなたの別のファイルに入れてcookie load-pathを追加するautoloadか、Emacsに関数で関数を見つける場所を伝えることができautoloadます。次に、このような何かが動作します:

(autoload 'org-cdlatex-mode "org" "cdlatex mode from org.")
(with-eval-after-load "latex"
  (add-hook 'TeX-mode-hook 'org-cdlatex-mode))

またはrequire org、順番に引っ張るのと同じようにできますcdlatex

そして、正直なところ、個人的なdefunは、ほとんどの場合、初期化時間にとっては重要ではありません。私の1150行の個人的なdefuns(84 defuns)は、init.elバニラEmacsに対して0.02秒追加されています。

初期化時間の測定

初期化時間を概算する簡単な方法は

time emacs --eval "(kill-emacs)"

(に対するベンチマークemacs -q

しかし、初期化のボトルネックがどこにあるかについて、より詳細な概算を得るには、Joe Schaferのをご覧くださいesup

最後に、ロード時間は魔法のように消えません。プッシュするだけです(各セッションですべての機能を使用する範囲まで)。


1
add-hookは変数がまだない場合にバインドするため、with-eval-after-loadにadd-hookを配置する必要はありません。
レミ14年

あなたが正しいです!それでも速度は向上しますか?[これを反映するために、後で回答を更新してみます]
ラスマス14年

フックまたはキーバインドに後でバインドしたいdefunsはどうですか。with-eval-after-load遅延初期化の利点を失うことなく、外部でdefunを定義する必要がありますか?
jrbalderrama 14年

5

eval-after-loadフックの提案と使用に加えて、提案させてくださいuse-package.el。必要なことを行うことができます

(use-package latex
  :ensure auctex
  :bind ("<f6>" . my-latex-defun))

LaTeXのは、まではロードされませんした後、あなたがそれを要求します。

念のため、注意して使用するとuse-package、起動時間が1秒未満に短縮されました。(以前は約4秒かかりました。)


提案ありがとう。use-packageを使用することも考えていますが、追加のパッケージなしでそれを行う方法を本当に知りたいです。
jrbalderrama 14年

1
@jrbalderramaノートuse-packageのEmacs 25に付属するように設定されている
ショーンオールレッド
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.