আমি কি পুরানো বাইট-সংকলিত এলিস্প ফাইলগুলি এড়াতে পারি?


27

মাঝে মাঝে আমি যখন ইমাস শুরু করি তখন আমার মতো একটি বার্তা আসে।

উত্স ফাইল `/home/USER/.emacs.d/elpa/…el 'বাইট-সংকলিত ফাইলের চেয়ে নতুন

এছাড়াও, আমি কখনও কখনও আমি তৈরি করি এমন একটি প্যাকেজ সম্পাদনা করি এবং এটি পুনরায় সংকলন করতে ভুলে যাই। আমি যখন নতুন ফাইলটি লোড করার চেষ্টা করি তখন বুঝতে পারি যে ইমাসগুলি এখনও পুরানো সংকলিত ফাইলটি ব্যবহার করছে।

আমি ইমাক্সকে তাদের নিজ নিজ উত্স ফাইলগুলির চেয়ে পুরানো বাইট-সংকলিত ফাইলগুলি সম্পূর্ণ এড়ানোর জন্য বলতে পারি কি?

উত্তর:


35

ইমাস 24.3 বা নীচে

এই পুরানো ফাইলগুলি লোড হওয়া থেকে রোধ করার কোনও অন্তর্নির্মিত উপায় নেই তবে এগুলি থেকে মুক্তি পাওয়ার সহজ উপায় রয়েছে।

  • আপনি কল করে সমগ্র elpa ডিরেক্টরির কম্পাইল করতে পারেন:
    M-x byte-recompile-directory RET ~/.emacs.d/elpa/
    এটি পুরানো ফাইলগুলি থেকে মুক্তি পাওয়া উচিত।
  • আপনি স্বতঃ-সংকলন প্যাকেজটি ব্যবহার করতে পারেন এবং সক্রিয় auto-compile-on-load-modeকরতে পারেন যা ফাইলগুলি লোড হওয়ার আগে সংকলন করতে পারে।

ইমাস 24.4

হ্যাঁ, এবং এটি বরং সহজ হতে দেখা যাচ্ছে। load-prefer-newer পরিবর্তনশীল অবিকল এই উদ্দেশ্যে কাজ করে।

(setq load-prefer-newer t)

দুর্ভাগ্যক্রমে, যখন কোনও কোড নির্দিষ্টভাবে .elcফাইলটিকে লক্ষ্য করে তখন এটি কাজ করবে না (load "server.elc")। তবে এটি যতক্ষণ না আপনি ব্যবহার করছেন requireবা loadপ্রত্যয় ছাড়াই কল করছেন যতক্ষণ না আপনার উচিত উচিত।

ডক থেকে:

লোড-পছন্দ-নবতর lread.c এ সংজ্ঞায়িত একটি পরিবর্তনশীল।
এর মান শূন্য

ডকুমেন্টেশন:
অ-নিল মানে বোঝা কোনও ফাইলের নতুন সংস্করণটিকে পছন্দ করে।
এটি যখন প্রয়োগ হয় যখন কোনও ফাইল নাম প্রত্যয় স্পষ্টভাবে নির্দিষ্ট না করা হয় এবং লোড বিভিন্ন সম্ভাব্য প্রত্যয় চেষ্টা করে (লোড-প্রত্যয় এবং লোড-ফাইল-পুনরায় প্রত্যয় দেখুন)। সাধারণত, এটি উপস্থিত থাকে এমন প্রথম ফাইলটিতে থেমে থাকে যা আপনি স্পষ্টভাবে একটি বা অন্যটিকে নির্দিষ্ট না করে। যদি এই বিকল্পটি অ-শূন্য থাকে তবে এটি সমস্ত প্রত্যয় পরীক্ষা করে এবং যে কোনও ফাইল সর্বাধিক ব্যবহার করে uses
নোট করুন যে আপনি যদি এটি কাস্টমাইজ করেন তবে অবশ্যই এটি আপনার কাস্টমাইজেশনগুলি পড়ার আগে লোড হওয়া ফাইলগুলিকে প্রভাবিত করবে না!


1
আমি লোকদের অনুরোধ করব যে auto-compileইমাম 24.4+ তে পাশাপাশি (নীচে !) লাইব্রেরিটি ব্যবহার করুন । এটি একটি আসল কনফিগার-ও-ভুলে যাওয়া সমাধান। load-prefer-newerকেবলমাত্র তা নিশ্চিত করে যে আপনার সংকলিত কোডটি পুরানো হয়ে যাওয়ার পরে আপনি ধীর অমীমাংসিত কোড চালাবেন
ফিল্ড

1
@ ফিলস আজকাল বাইট কোডটি সরল উত্স কোডের চেয়ে বেশি দ্রুত নয়, আগ্রহী ম্যাক্রো প্রসারণের জন্য ধন্যবাদ।
চন্দ্রালাই

আমি org-এজেন্ডা-বাছাই-কৌশল (org-এজেন্ডা.এল) এ পরিবর্তনগুলি পুনরায় আরম্ভের পরে প্রতিফলিত হচ্ছিল না, তবে উত্তরটিতে বর্ণিত .elc ফাইলগুলি পুনরায় সংশোধন করে সমস্যার সমাধান হয়েছে।
ইয়ারলিও

17

আপনি যদি কেবল সেট load-prefer-newer(যেখানে উপলভ্য) সেট করেন , সঠিক কোডটি লোড হয়ে যাবে, তবে এটি বাইট-সংকলন করা নাও থাকতে পারে, তাই সামান্য পারফরম্যান্স পেনাল্টিও হতে পারে।

এই সমস্যাটি না ঘটে তা নিশ্চিত করতে আপনি জোনাস বার্নৌলির দুর্দান্ত স্বয়ং-সংকলন গ্রন্থাগারটি ব্যবহার করতে পারেন। বিশেষত, auto-compile-on-load-modeপুরানো .elcফাইলগুলি লোড করার আগে তাদের পুনরায় কম্পাইল করবে ।


3

আমি ইন্টারনেটে এটির অনেক আগে দেখা হয়েছিল:

;; If you're saving an elisp file, likely the .elc is no longer valid:
(add-hook 'emacs-lisp-mode-hook 'esk-remove-elc-on-save)
(defun esk-remove-elc-on-save ()
  "If you're saving an elisp file, likely the .elc is no longer valid."
  (make-local-variable 'after-save-hook)
  (add-hook 'after-save-hook
            (lambda ()
              (if (file-exists-p (concat buffer-file-name "c"))
                  (delete-file (concat buffer-file-name "c"))))))

আপনি যদি FILEইমাস-লিস্প-মোডে কাজ করেন এবং আপনি এটি সংরক্ষণ করেন - উপরের কোডটি FILEcউপস্থিত থাকলে তা সরিয়ে দেয় ।


0

এছাড়াও, আমি কখনও কখনও আমি তৈরি করি এমন একটি প্যাকেজ সম্পাদনা করি এবং এটি পুনরায় সংকলন করতে ভুলে যাই। আমি যখন নতুন ফাইলটি লোড করার চেষ্টা করি তখন বুঝতে পারি যে ইমাসগুলি এখনও পুরানো সংকলিত ফাইলটি ব্যবহার করছে।

আমি কি আপনার init ফাইলটিতে একটি হুক যুক্ত করার পরামর্শ দিতে পারি?

(add-hook 'after-save-hook 'byte-compile-current-buffer)

অথবা, আপনি যদি কেবল এল ফাইলগুলিতে হুক প্রয়োগ করতে চান:

(add-hook 'emacs-lisp-mode-hook (lambda () (add-hook 'after-save-hook 'byte-compile-current-buffer nil t)))

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