আমাকে কেন প্রতিটি প্যাকেজ লোড-পাথে যুক্ত করতে হবে? (অথবা আমার ডিআইডি ফাইলে প্যাকেজ প্রয়োজনের সাথে সমস্যা)


17

আমি যখনই প্যাকেজ মেনু থেকে প্যাকেজ ইনস্টল করি, আমি requireআমার ডিআইডি ফাইলে চেষ্টা করে দেখি যদি আমি নিজে লোড-পাথটিতে না যোগ করি তবে আমি একটি ত্রুটি পেয়ে যাব:

(add-to-list 'load-path "/home/nick/.emacs.d/elpa/use-package-20141220.1645")

(require 'use-package-autoloads)
(require 'use-package)

এটা ক্লান্তিকর। এবং সাধারণত প্যাকেজ পথে সংস্করণ-সংখ্যা থাকে। যদি কোনও প্যাকেজ আপডেট করা থাকে তবে আমাকে নিজেই লোড-পাথ সম্পাদনা করতে হবে।

এটি স্বয়ংক্রিয় করার কোনও উপায় আছে?

উত্তর:


23

টি এল; ডিআর:

আপনার init ফাইলের ( .emacs.d/init.elঅথবা .emacs) শীর্ষে নিম্নলিখিত লাইনটি যুক্ত করুন :

(package-initialize)

ব্যাখ্যা

ইমাকরা যে ফাইলগুলি ব্যবহার করতে পারে তার বেশি ফাইল তৈরি user-init-fileকরা অবশ্যই সঠিক পন্থা নয়। কারণ ম্যানুয়ালটি কোনও বিরোধের ক্ষেত্রে কোনটিকে প্রাধান্য দেয় তা বলে না, কমপক্ষে আপনি যে অংশটি উদ্ধৃত করেছেন তাতে নয়, এই সমস্ত কাজটি বিভ্রান্তি যোগ করার জন্য - এখন আমরা জানি না আসলে আসলে কোনটি user-init-file(যার মূল্য আপনি চাইতে পারেন) পরিদর্শন করার জন্য)।

সুতরাং ~/.emacs.d/init.elসাধারণত প্রার্থীদের বাদ দিয়ে সমস্ত প্রার্থীকে অপসারণ করে শুরু করুন (ব্যবহারকারীরা) কারণ এটি অপরিষ্কার জগাখিচিতে অবদান রাখে না $HOMEএবং এটি কেবলমাত্র একটি সংগ্রহস্থল ব্যবহার করে সংস্করণ নিয়ন্ত্রণের অধীনে সবথেকে গুরুত্বপূর্ণ ইমাম কনফিগারেশন ফাইল রাখার অনুমতি দেয় allows এ গিয়ে emacs।

ডিফল্টরূপে ইমাস কলগুলি ব্যবহারকারীর আরআইডি ফাইল লোড package-initialize হওয়ার পরে এটি তাই করে এ সব কারণ আজকাল অধিকাংশ ব্যবহারকারীদের ব্যবহার করে তাদের প্যাকেজগুলি ইনস্টল package.elতাই তারা কিছু করতে জন্য এই প্যাকেজ উপলব্ধ করা আছে করা উচিত নয় -।

অন্যদিকে সবাই তা করে না, তাই কল না করাও উচিত package-initialize। সেই ফাংশনটি ডাকা হওয়া থেকে বিরত রাখা (setq package-enable-at-startup nil)ব্যবহারকারীর টিআইএন ফাইলে যুক্ত করে করা হয় (আপনি এটি আর কোথায় রাখতে পারেন?)।

package-initializeইমাককে এটি না করতে বলার জন্য ব্যবহারকারীর পরিবর্তন হওয়ার আগে ডাকা যাবে না, এবং তাই init ফাইলটি লোড করার পরে এটি করতে হবে । যতক্ষণ না ব্যবহারকারী কেবল প্যাকেজ ইনস্টল করে এবং তারপরে সেগুলি সেগুলি হিসাবে ব্যবহার করে বা কাস্টম ইন্টারফেস যা কেবল সূক্ষ্মভাবে কাজ করে তা ব্যবহার করে তাদের কাস্টমাইজ করে। তবে আপনি যদি এলিসপ ব্যবহার করে আপনার প্যাকেজগুলি কাস্টমাইজ করতে চান তবে আপনাকে নিশ্চিত করতে হবে যে load-pathতারা সংজ্ঞায়িত ফাংশনগুলি ব্যবহার করার আগে তারা আসলে ছিল ।

এটি করা বেশ সহজ এবং সঠিকভাবে নথিভুক্ত করা হয়েছে (যদি আমি এটি আগে দেখতাম তবে উপরের বেশিরভাগটিই আমাকে লিখতে হত না: - /

প্যাকেজিং সিস্টেমকে প্রভাবিত করে এমন ব্যবহারকারী বিকল্পগুলি সহ init ফাইলটি লোড করার পরে স্বয়ংক্রিয় প্যাকেজ লোড হওয়ার কারণটি হ'ল ব্যবহারকারী বিকল্পগুলি কেবল থিম ফাইলটি লোড করার পরে তাদের কাস্টমাইজড মানগুলি গ্রহণ করে। কিছু পরিস্থিতিতে, আপনি আপনার init ফাইলে স্পষ্টভাবে প্যাকেজগুলি লোড করতে চাইতে পারেন (সাধারণত কারণ আপনার init ফাইলে অন্য কোনও কোড একটি প্যাকেজের উপর নির্ভর করে)। সেক্ষেত্রে আপনার init ফাইলটির ফাংশনটি কল করা উচিত package-initialize। কল package-load-listকরার আগে প্রাসঙ্গিক ব্যবহারকারীর বিকল্পগুলি যেমন (নীচে দেখুন) সেট আপ করা হয়েছে তা নিশ্চিত করা আপনার উপর package-initializeনির্ভর করে। আপনারও সেট package-enable-at-startupকরা উচিত nil, init ফাইলটি প্রক্রিয়া করার পরে প্যাকেজগুলি আবার লোড করা এড়াতে। বিকল্পভাবে, আপনি শুরুতে প্যাকেজ লোড সম্পূর্ণরূপে বাধা চয়ন করতে পারেন, এবং আপনার প্যাকেজগুলি ম্যানুয়ালি লোড করতে `এমএক্স প্যাকেজ-আরিনিয়েশন 'কমান্ডটি প্রার্থনা করতে পারেন।

তাই:

;;; .emacs.d/init.el -- the `user-init-file'

(package-initialize)
(setq package-enable-at-startup nil)

(require 'use-package)

(use-package some-package
  :init (setq some-package-variable "foobar")

    ...

;;; .emacs.d/init.el ends here

অবশ্যই সমস্যা (বা কোনও অতিরিক্ত সমস্যা) হতে পারে যে Symbol's function definition is void: use-packgeটাইপ-ইনটি আপনার init ফাইলটিতে রয়েছে এবং আপনি এটি ইম্যাকস.এস-এ টাইপ না করা পর্যন্ত ঘটেনি।


1
এছাড়াও এ আবৃত stackoverflow.com/questions/11127109/...
phils

এটি (require 'use-package)আগে ব্যবহার ঠিক আছে (package-initialize)?
29 力

3

আমি মনে করি এই স্ট্যাক ওভারফ্লো উত্তরেafter-init-hook উল্লিখিত সমাধানটির উল্লেখ করা উচিত:

(defun my-packages-init ()
  (require 'some-great-package))

(add-hook 'after-init-hook 'my-packages-init)

আমি ভেবেছিলাম যে এটি করা উচিত ছিল ঠিক সেভাবেই হয়েছিল, তবে অন্যান্য উত্তরগুলি এটি করার অন্যান্য উপায়গুলির তথ্য সরবরাহ করে।


0

নিম্নলিখিতটি ~/.emacs.d/site-lispলোডের পথে সমস্ত ডায়ার যুক্ত করে, যাতে আপনি কেবল requireপ্যাকেজটি করতে পারেন এবং আপনার কাজটি সম্পন্ন হয়েছে:

(let* ((my-lisp-dir "~/.emacs.d/site-lisp/")
       (default-directory my-lisp-dir)
       (orig-load-path load-path))
  (setq load-path (cons my-lisp-dir nil))
  (normal-top-level-add-subdirs-to-load-path)
  (nconc load-path orig-load-path))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.