मुझे एक आलसी आरंभीकरण कहां शामिल करना चाहिए?


13

मैं लेटेक्स-मोड में एक विशिष्ट कुंजी बाइंडिंग जोड़ना चाहता हूं:

(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-modeया hl-line-modeहुक में लोड करेंगे । अपने में init.elमैं with-eval-after-loadलगभग 160 बार और add-hook110 बार उपयोग करता हूं । एक आलसी init एक अच्छा init (IMO) है।
रासमुस

अगर आपके पास समय है तो @rasmus एक उत्तर की तरह लगता है :) कोड कितनी बार चलाया जाता है, इस पर विचार करने के लिए मुख्य विचार है। (यह भी केवल एक ही
चीज है जिसके

मोड हुक में कुंजी बाइंडिंग बदलने के लिए एक बुरा विचार क्यों है, इसके लिए emacs.stackexchange.com/questions/990/…
tarsius

जवाबों:


18

एक आलसी init एक अच्छा init है।

(IMO)

कब इस्तेमाल करें with-eval-after-load

with-eval-after-loadभरी हुई है एक बार जब कोई खास सुविधा या फ़ाइल है पहले , भरी हुई तो एक कीमैप-परिवर्तन स्पष्ट रूप से अंदर इनमें से किसी एक हो जाता है। कम से कम नहीं क्योंकि कीमैप को init-time [कुछ ऐसा प्रयास करें ] (define-key message-mode-map (kbd "C-c f") 'Footnote-add-footnote)में नहीं जाना जा सकता है emacs -q। एक हुक एक अच्छा समाधान नहीं है क्योंकि यह एक कुंजी को हर बार हुक शुरू होने पर बांधता है। के रूप में tarsius नोट, आप कर सकते हैं और अधिक पढ़ क्यों के बारे में नहीं करने के लिए local-set-keyहुक में।

अंत में, ध्यान दें कि with-eval-after-loadGNU Emacs 24.4 एक 2 लाइन आवरण है, eval-after-loadजहाँ पर bodyउद्धृत नहीं किया जाना चाहिए।

जब हुक का उपयोग करें

हुक हर बार एक मानदंड पूरा होने पर लोड किए गए कार्यों की सूची है, उदाहरण के लिए एक निश्चित मोड शुरू किया गया है। हुक का एक सामान्य उपयोग मामूली-मोड को लोड करना है, जैसे कि 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 को अपनी फ़ाइल में किसी अन्य फ़ाइल में रख सकते हैं 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

और, ईमानदारी से, व्यक्तिगत डिफॉन ज्यादातर समय के लिए इनट टाइम के लिए ज्यादा मायने नहीं रखता है। व्यक्तिगत दोषों की 1150 पंक्तियाँ (84 अवगुण) मेरे init.elवनिला एमएसीएस से 0.02 से अधिक हैं।

आरंभीकरण समय मापने

घुसपैठ के समय को अनुमानित करने का एक आसान तरीका है

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

(के खिलाफ बेंचमार्क emacs -q

लेकिन आरंभिक अड़चनें दूर करने के लिए और अधिक विस्तृत अनुमान प्राप्त करने के लिए जो शेफ़र्स की जाँच करें esup

अंत में, लोडिंग समय जादुई रूप से गायब नहीं होता है। आप इसे केवल आगे बढ़ा रहे हैं (इस विस्तार तक कि आप प्रत्येक सत्र में सभी सुविधाओं का उपयोग करें)।


1
आपको ऐड-हुक को इनवैलिवल-आफ्टर-लोड के साथ रखने की आवश्यकता नहीं है, क्योंकि ऐड-हुक वैरिएबल को बाँध देगा यदि यह पहले से ही वहाँ है।
Rémi

तुम सही हो! हालांकि अभी भी इससे गति प्राप्त हो सकती है? [मैं इसे प्रतिबिंबित करने के लिए बाद में उत्तर को अपडेट करने की कोशिश करूंगा]
रासुस

इस बारे में क्या कहा जाता है कि बाद में मैं हुक या कुंजी बंधन से बंधना चाहूंगा। क्या मुझे with-eval-after-loadबिना आलस्य आरंभीकरण के फायदे के बिना एक डिफेन को परिभाषित करना चाहिए ?
२०:०२ पर jrbalderrama

5

eval-after-loadहुक के उपयोग और उपयोग के अपने सुझावों के अलावा , मुझे सुझाव दें use-package.el। आप वह कर सकते हैं, जिसकी आपको जरूरत है

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

आपके अनुरोध के बाद तक LaTeX लोड नहीं किया जाएगा ।

एक साइड नोट के रूप में: सावधानी से उपयोग use-packageने मेरे स्टार्टअप को एक सेकंड से कम समय तक काट दिया है। (इसमें लगभग चार सेकंड लगते थे।)


आपका सुझाव देने के लिए धन्यवाद। मैंने उपयोग-पैकेज का उपयोग करने पर भी विचार किया है, लेकिन मैं वास्तव में यह पता लगाना चाहता हूं कि इसे अतिरिक्त पैकेज के बिना कैसे किया जाए।
जलभद्रमा

1
@jrbalderrama नोट जो use-packageEmacs 25 के साथ जहाज बनाने के लिए तैयार है।
सीन एलाड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.