ইনস্টল ও আপডেট করতে প্যাকেজ.এল ব্যবহার করা হচ্ছে তবে লোড এবং কনফিগার করার জন্য ব্যবহার-প্যাকেজ


15

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

আমি সাধারণত সিস্টেমের use-packageসাথে লোকেরা কীভাবে একত্রিত হয় তা শিখতে আগ্রহী package.el, তবে আরও নির্দিষ্ট প্রশ্নের জন্য, পড়া চালিয়ে যান।

আমি যা চাই তা এখানে:

  1. প্যাকেজ ম্যানেজার দ্বারা প্যাকেজ ইনস্টল করা যাতে আমি সহজেই প্যাকেজগুলির জন্য ব্রাউজ করতে পারি এবং সেগুলি আপডেট করে রাখতে পারি list-packages
  2. একচেটিয়াভাবে প্যাকেজগুলি কনফিগার করতে এবং লোড করতে use-package, যাতে আমি সহজেই আমার আর ডি ফাইলে দেখতে পাচ্ছি যে আমি কী লোড করছি এবং এটি কীভাবে কনফিগার করা হয়েছে।
  3. বৈকল্পিকভাবে, আমিও মাধ্যমে প্যাকেজ ইনস্টল করতে পারবেন হতে চাই use-package'র :ensureশব্দ।

আমি যদি সঠিকভাবে বুঝতে পারি তবে আমি যা করি তার খুব কমই চাই package-initialize, মূলত এটি যেভাবে সেট আপ করে load-path। বর্তমানে আমার কনফিগারেশনে এটি রয়েছে:

;(package-initialize)
(setq package-enable-at-startup nil)
(let ((default-directory "~/.emacs.d/elpa"))
  (normal-top-level-add-subdirs-to-load-path))
(require 'use-package)

প্রথমটি, মন্তব্য করা হয়েছে, রেখাটি তাই ইমাস 25 (package-initialize)আমার সহায়ক ফাইলটিতে সহায়কভাবে যোগ করে না । সঙ্গে বিট normal-top-level-add-subdirs-to-load-pathকি প্রায় সঠিক পরিমাপ package-initializeকরতে হবে load-path, একটি পড়তা যথেষ্ট মনে হচ্ছে যে।

এই যদি আমি ব্যবহার করার চেষ্টা আমার ইচ্ছেগুলোর 1 এবং 2, কিন্তু না 3. অর্জন বলে মনে হয় :ensure, আমি এই বলে যে একটি ত্রুটির বার্তা পেতে package.elসক্রিয়া করা হয় না। কলিং package-initializeএটির সমাধান করে দেবে, তবে আমি এগুলি এড়াতে চাই all ক) আমি চাই না যে সমস্ত অগণিত অটোল্যাড লোড করা হোক (আমি use-packageআমার প্রয়োজনের সাথে অটোলোডগুলি তৈরি করতে অবশ্যই পছন্দ করি), এবং খ) আমি সহজেই সক্ষম হতে চাই আমি যখনই চাই নির্দিষ্ট কিছু ইনস্টল করা প্যাকেজ লোড করা এড়াতে (যা করা সহজ use-package)।

কীভাবে এটি করবেন তার জন্য কারও কাছে সুপারিশ রয়েছে?

উত্তর:


11

IIUC আপনি যা করতে চান তা হ'ল:

(package-initialize t)

tআর্গুমেন্টটি নোট করুন , এটি এখানে আপনার সুখের মূল কারণ যেহেতু এটি ইনস্টল করা সমস্ত প্যাকেজগুলি সক্রিয় না করে প্যাকেজ.েলটি শুরু করবে (বা হওয়া উচিত)।


1
এটি আমার প্রশ্নের উত্তর দেয়, যদিও এখন আমি ব্যবহারের দিকে package-initializeঝুঁকছি যা আমার প্রশ্নটিকে বাতলে দেয়।
ওমর

15

আপনার বর্তমান কনফিগারেশন সহ, আপনি কার্যকরভাবে প্যাকেজ.এল অক্ষম করেছেন, কারণ আপনি প্যাকেজ পরিচালককে আরম্ভ করেন না এবং ইমাকগুলি এটি স্বয়ংক্রিয়ভাবে আরম্ভ করতে বাধা দেয়। পরিবর্তে আপনি load-pathযা করেন তা হ'ল ইপিপি যুক্ত করা, তবে এটি প্যাকেজ.এল যা করে তার কেবল একটি ছোট উপসেট। আপনি কেন এটি করেন তা সম্পর্কে আমি নিশ্চিত নই, তবে এটি প্রস্তাবিত কোনও সেটআপ নয়।

বিশেষত, আপনি আপনার পদ্ধতির সাথে প্যাকেজ অটোলোডগুলি পাবেন না, যার অর্থ প্রাথমিকভাবে কোনও প্যাকেজ থেকে কোনও আদেশ পাওয়া যাবে না।

অন্য কথায়, M-xকেবল আপনাকে অন্তর্নির্মিত কমান্ড সরবরাহ করবে। আপনার প্যাকেজগুলি থেকে আদেশগুলি যুক্ত করতে আপনাকে আপনার সমস্ত ঘোষণাপত্রের স্পষ্ট :commandsসংজ্ঞা যুক্ত করতে হবেuse-package , যা রক্ষণাবেক্ষণের প্রচুর পরিমাণে বিশেষত ম্যাগিট-এর মতো বড় প্যাকেজগুলির জন্য যা মূলত শূন্য লাভের জন্য — প্যাকেজ.েল আপনাকে বিনামূল্যে অটোলোড দেয় ।


মিশ্রন use-packagepackage.el সঙ্গে আসলে খুব সহজ-Y সমগ্র সেটআপ এই উপর ভিত্তি করে তৈরি সমন্বয়-কিন্তু এটি অনেক ভালো তার কাজ করার আসলে package.el দিন আছে। আপনার init ফাইলের একেবারে শুরুতে প্যাকেজ.এল শুরু করুন:

(require 'package)
(setq package-enable-at-startup nil)   ; To prevent initialising twice
(add-to-list 'package-archives '("melpa" . "https://stable.melpa.org/packages/"))

(package-initialize)

সুবিধার জন্য আপনি পরে বুটস্ট্র্যাপ করতে চাইতে পারেন use-package, যদি এটি ইতিমধ্যে ইনস্টল করা না থাকে:

(unless (package-installed-p 'use-package)
  (package-refresh-contents)
  (package-install 'use-package))

এটি আপনাকে একটি নতুন সিস্টেমে একটি ইম্যাকস অধিবেশন শুরু করতে দিন এবং আপনার init.el স্বয়ংক্রিয়ভাবে ইনস্টল হবে use-package

শেষ পর্যন্ত আপনাকে লোড করতে হবে use-package:

(eval-when-compile
  (require 'use-package))

এখন আপনি use-packageপ্যাকেজ ইনস্টল ও কনফিগার করতে ব্যবহার করতে পারেন :

(use-package magit                      ; The one and only Git frontend
  :ensure t
  :bind (("C-c v c" . magit-clone)
         ("C-c v v" . magit-status)
         ("C-c v g" . magit-blame)
         ("C-c v l" . magit-log-buffer-file)
         ("C-c v p" . magit-pull))
   :config (setq magit-save-repository-buffers 'dontask))

use-packageইমাকস যখন এখন প্রারম্ভের সময় এই ফর্মটি মূল্যায়ন করে তখন Magit ইতিমধ্যে ইনস্টল রয়েছে কিনা তা যাচাই করবে এবং প্রয়োজনে স্বয়ংক্রিয়ভাবে এটি ইনস্টল করবে।


3
"আপনি কেন এটি করেন তা আমি নিশ্চিত নই": আমি দেখতে পেলাম কেবলমাত্র কারণটি শুরু হওয়ার সময়গুলি: package-initializeপথটি জনপ্রিয় করতে, অটোলোড সংজ্ঞায়িত করতে এবং এর বাকি জিনিসগুলি করতে কিছুটা সময় নেয়। আমার মনে হয় আমি কোথাও পড়েছি যে জন উইগেলি নিজেই (এর লেখক use-package) use-packageনির্ভর করে না করে স্টাঞ্জগুলিতে সমস্ত অটোভোলাড কমান্ড ঘোষণাকে পছন্দ করেন package.el
ফ্রান্সোয়েস ফ্যাভোত্তে

গতবার আমি দেখেছি তিনি প্যাকেজ.এল মোটেও ব্যবহার করেন নি, এবং কোনও ক্ষেত্রেই, আপনি খুব বেশি উপকার পাবেন বলে আমি মনে করি না। আপনাকে load-pathপপুলেট করতে হবে এবং উভয় ক্ষেত্রেই অটোলোড যুক্ত করতে হবে, যাই হোক না কেন এর মাধ্যমে use-packageবা এর মাধ্যমে package.el। আমি সন্দেহ করি যে একটি পরিমাপযোগ্য পার্থক্য রয়েছে, বিশেষত যদি আপনি একটি দ্রুত ডিস্ক সহ একটি আধুনিক সিস্টেম পেয়ে থাকেন।
চাঁদবার্তা

3
একমত। সময় নিজেই করলাম। দ্রুত ডিস্কের সাহায্যে আপনি কার্যকরভাবে কোনও পার্থক্য দেখতে পাবেন না। ধীর গতির ডিস্কের সাহায্যে শুল্কটি package-initializeকাস্টম তালিকার চেয়ে কম ধীরে ধীরে (0.2 এর মতো কিছু) হতে পারে load-path। আমি এটি ফাইল সিস্টেমের "এক্সপ্লোরেশন" এর জন্য দায়ী করি package.el। যাইহোক, autoloadফাইলগুলি থেকে সংজ্ঞাগুলি লোড করা এবং সেগুলি use-packageস্টানজায় রাখার মধ্যে আমি পারফরম্যান্সের মধ্যে কোনও উল্লেখযোগ্য পার্থক্য কখনই মাপলাম না।
ফ্রান্সোয়েস ফ্যাভোত্তে

আচ্ছা, আমি বলবো না আমি করেছি অক্ষমpackage.el সিস্টেম, আমি শুধুমাত্র প্রতিবন্ধী বলতে চাই package-initialize! কারণটি হ'ল আমি যখন list-packagesনতুন প্যাকেজগুলি ব্রাউজ করতে চাই এবং বিশেষত আমার বর্তমানে ইনস্টল করা সমস্ত প্যাকেজ আপডেট করতে চাই, আমি মনে করি আমি লক্ষ্যযুক্ত লোডিং পছন্দ করি use-package। আমার কাছে কেবল কমান্ডের জন্য অটোলোড থাকার জন্য আমি শব্দটি ব্যবহার করি ভাল জিনিস!
ওমর

1
@ ওমরআন্তোলন-কামারেনা কেন নয়? অটোল্যাডগুলি মূলত কোনও ব্যবহারকারী-মুখোমুখি প্যাকেজটির সর্বজনীন ইন্টারফেস এবং প্যাকেজ.el যেহেতু প্যাকেজ বিতরণ করার মানক উপায় হয়ে দাঁড়িয়েছে আমরা তাদের উপস্থিতির উপর নির্ভর করতে পারি।
চন্দ্রালগ্ন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.