ইউজ-প্যাকেজটিতে init এবং কনফিগারেশনের মধ্যে পার্থক্য


16

আমার এইরকম একটি কনফিগারেশন রয়েছে:

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

এখন আমি যখন কোনও এইচটিএমএল ফাইল auto-fillঘুরে দেখি, তখন আমি পর্যবেক্ষণ করি যে এটি বন্ধ নেই। কিন্তু যদি আমি ব্যবহার :initপরিবর্তে :config, auto-fillবন্ধ পরিণত হয়। সুতরাং আমার প্রশ্ন হ'ল আদেশগুলি কখন :configকার্যকর করা হয়?

উত্তর:


16

প্যাকেজটি মুলতুবি করা থাকলে এগুলি পৃথক, অর্থাৎ প্রয়োজন না হওয়া পর্যন্ত লোড করা হয় না। যে ক্ষেত্রে :initসময় আপনার Emacs ফাইল প্রথম পড়া হয় এ মৃত্যুদন্ড কার্যকর করা হবে, কিন্তু :configসময় প্যাকেজ আসলে লোড হয় এ মৃত্যুদন্ড কার্যকর করা হবে না।

আপনার উদাহরণস্বরূপ, modeপ্যাকেজটি লোড করা সুস্পষ্টরূপে ডিফার্স করে। আপনি এইচটিএমএল ফাইলটি প্রথমবার দেখার জন্য প্যাকেজটি লোড করার জন্য কনফিগার করেছেন।

আপনি ব্যবহার করতে পারে :demandনিশ্চিত প্যাকেজ সবসময় স্টার্টআপে লোড হয় করতে, কিন্তু সম্ভাবনা বেশি তুমি এখানে কি কাজ করতে চান আপনার হুক করা হয় :init

ডক্টরসিং থেকে:

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

যেহেতু আপনি এটি আপনার ব্যবহারকারী-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প্যাকেজটি কখনই লোড হয় কিনা তা বিবেচনা না করেই ডিগ্রি কোডটি সর্বদা মূল্যায়ন করা হয় কারণ একই অভিব্যক্তিটি কাজ করে।



@ এনপোস্টাভস ধন্যবাদ, লক্ষ্য করার মতো আমি নিজেই এখনও ব্যবহার-প্যাকেজ ২.০ এ সরানো হয়নি। একটি কিছুর জন্য, আমি :idleবেশ বিস্তৃতভাবে ব্যবহার করি এবং ": নিষ্ক্রিয়তা সরানো হয়েছে" এর প্রভাবের দিকে নজর রাখি না।
গ্লুকাস

1
আমি এখনও বুঝতে পারি না যে, যখন তিনি কোনও এইচটিএমএল ফাইল পরিদর্শন করেন এবং প্যাকেজটি লোড করার জন্য ট্রিগার করেন তখন auto-fillতা বন্ধ করা হয় না, অর্থাৎ কনফিগার কোডটি চালিত হয়নি। আমি একই সমস্যা আছে।
কেন উইলিয়ামস

@ কেনউইলিয়ামস আপনার সমস্যাটি এইচটিএমএল-মোডেও রয়েছে? আমি মনে করি এখানে আসল সমস্যাটি html-modeপ্যাকেজ নয়। কমপক্ষে আমার বর্তমান ভার্সন ইমাসের html-modeপ্যাকেজে সংজ্ঞায়িত করা হয়েছে sgml-mode। সুতরাং যদি আপনি use-packageকিছু করতে বলুন যখন নামের প্যাকেজটি html-modeলোড করা হয় যে কোডটি কখনই চলবে না কারণ এই জাতীয় কোনও প্যাকেজ কখনও লোড হয় না। আপনাকে একটিতে এইচটিএমএল-মোড সেটআপ লাগাতে হবে (use-package sgml-mode ....)
গ্লুকাস

দুঃখিত - আমার সমস্যাটি আছে 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")))

এখন আপনার ইম্যাকগুলি খুলুন এবং *Messages*কোনও hello worldবার্তা আছে কিনা তা দেখতে বাফারে দেখুন । প্যাকেজ স্থগিত হওয়ায় আপনি কোনওটিই আবিষ্কার করতে পারবেন না। এখন থেকে পরিবর্তন configকরুন init:

(use-package ace-window
  :ensure t
  :defer t
  :init
  (progn
    (message "ace window: hello world")))

এখন ইম্যাকগুলি বন্ধ করুন এবং পুনরায় খুলুন এবং *Messages*বাফারটি পরীক্ষা করুন । আপনি বার্তাটি দেখতে পাবেন ace window: hello worldকারণ কোডটি :initকখনই দেওয়া হয় তা বিবেচ্য নয়। configএটির ক্ষেত্রে কেবল তখনই চালানো হবে যখন সেই প্যাকেজটি লোড হবে।


যে সাহায্য করে মাত্র একটি পার্শ্ব প্রশ্ন কি পার্থক্য শব্দ মধ্যে তারপর :initএবং :prefaceআপনার উদাহরণ উপর ভিত্তি করে?
ডক্টরেট

@ ডক্টরেট: :prefaceচালানো হয় এমনকি যদি প্রশ্নে থাকা প্যাকেজটি অক্ষম থাকে তবে :initকেবল তখনই চালিত হয় যখন কোনও প্যাকেজ সক্ষম থাকে।
bbenne10
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.