কোথায় আমি একটি অলস সূচনা অন্তর্ভুক্ত করা উচিত?


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 বার ব্যবহার করি । অলস উদ্যোগটি একটি ভাল আরম্ভ (আইএমও)।
রাসমাস

আপনার কাছে সময় থাকলে @ রাসমাস একটি উত্তরের মতো মনে হয় :) কোডটি কতবার চালিত হয় তার পার্থক্যটি আমার মতে বিবেচনার জন্য মূল বিষয়। (এটি কেবলমাত্র আমিই ভাবতে পারি ...)
সান অলরেড ২

মোড হুকের কী বাইন্ডিংগুলি পরিবর্তন করা কেন খারাপ ধারণা তা এই জন্য দেখুন emacs.stackexchange.com/questions/990/…
তারাসিয়াস

উত্তর:


18

অলস উদ্যোগটি একটি ভাল উদ্যোগ।

(আইএমও)

কখন ব্যবহার করতে হবে with-eval-after-load

with-eval-after-loadলোড হয় একবার যখন একটি নির্দিষ্ট বৈশিষ্ট্য বা ফাইল হয় প্রথম , লোড তাই একটি কীম্যাপ-পরিবর্তন পরিষ্কারভাবে ভিতরে এই এক যায়। না অন্তত কারণ কীম্যাপ Init-টাইম [মত ব্যবহার করে দেখুন কিছু পরিচিত নাও হতে পারে (define-key message-mode-map (kbd "C-c f") 'Footnote-add-footnote)মধ্যে emacs -q]। একটি হুক একটি নয় চমৎকার সমাধান এখানে যেহেতু এটি একটি কী ফাংশন binds যে সময় হুক শুরু হয়। হিসাবে 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))org ইনলিনেটাস্কগুলি লোড করার মতো কিছু চান । কেন তা দেখতে হবে (find-library "org-inlinetask")। যেহেতু org-inlinetasks.elপ্রত্যক্ষভাবে (require 'org), autoloadআপনার বন্ধুত্বপূর্ণ ইমাস ম্যানেজাররা যে দুর্দান্ত যে সরবরাহের জন্য দুর্দান্ত যত্ন নিয়েছিল সেগুলি সমস্তই "উপেক্ষা করা" হবে এবং সমস্ত কিছু org.el(c)লোড হবে।

তবে যদি আপনার (ব্যক্তিগত) defunবেশ কয়েকটি জায়গার প্রয়োজন হয়? আপনি যদি সত্যিই বাছাই করেন, আপনি নিজের defunঅন্য কোনও ফাইলে গুলি রেখে কুকিগুলি load-pathযুক্ত autoloadকরতে পারেন, বা ফাংশনটির সাথে ফাংশনটি কোথায় পাবেন তা ইমাসকে বলতে পারেন 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
আপনাকে অ্যাড-হুক একটি-ইভাল-পরে-লোডের মধ্যে লাগানোর দরকার নেই, কারণ অ্যাড-হুকটি যদি ইতিমধ্যে না থাকে তবে চলকটিকে আবদ্ধ করবে।
রামি 7

তুমি ঠিক! এখনও এটি থেকে গতি লাভ হতে পারে? [আমি এর প্রতিফলন করার জন্য উত্তরটি পরে আপডেট করার চেষ্টা করব]
রাসমাস ২৮

Defuns সম্পর্কে কি যে পরে আমি একটি হুক বা কী বাঁধাই বাঁধতে চাই। with-eval-after-loadঅলস সূচনা সুবিধাগুলি না ছাড়িয়ে কি আমার বাইরে ডিফুন সংজ্ঞা দেওয়া উচিত ?
jrbalderrama

5

আপনার পরামর্শ eval-after-loadএবং একটি হুক ব্যবহার ছাড়াও , আমাকে পরামর্শ দিন use-package.el। আপনার যা প্রয়োজন তা করতে পারেন

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

ক্ষীর পর্যন্ত লোড করা হবে পরে আপনি এটা অনুরোধ।

পার্শ্ব নোট যেমন: সতর্কতার সাথে ব্যবহার use-packageআমার সূচনা বারকে এক সেকেন্ডের নীচে ফেলেছে। (এটি প্রায় চার সেকেন্ড সময় লাগত))


আপনার পরামর্শের জন্য ধন্যবাদ। আমি ব্যবহার-প্যাকেজটি ব্যবহার করার বিষয়ে চিন্তাও করেছি কিন্তু অতিরিক্ত প্যাকেজ ছাড়াই কীভাবে এটি করা যায় তা সত্যই আমি খুঁজে বের করতে চাই।
jrbalderrama

1
@ জার্বালদাররামার নোট যা ইমাস use-package25 সহ প্রেরণ করা হবে ।
সান অলরেড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.