আমি কি কোনও লাইব্রেরি পুনরায় লোড করতে এবং ডিভভারের পুনরায় নিয়োগের মানগুলি রাখতে পারি?


10

আমি একটি লাইব্রেরি বিকাশ করছি এবং Emacs ছাড়াই সম্পাদনা করার পরে এটিকে পুনরায় লোড করতে চাই (ধরে নিই যে এটি চালু আছে load-path):

(load-library "myname")

যখন আমি এটি করি, ইমাসগুলি- defvarবাউন্ডের ভেরিয়েবলগুলিতে পরিবর্তনগুলি গ্রহণ করে না ।

আমি ফোন করতে চাই না eval-defun( C-M-xম্যানুয়ালি প্রতিটি শীর্ষ স্তরের ফর্মে)। কি M-x eval-bufferসম্মান defvar/ defcustom?


1
(unload-feature 'myname)প্রথম হতে পারে ?
npostavs

এটি চেষ্টা করেই এবং না, এর বিপরীতে eval-defunপরিবর্তনগুলি বাছাই করে না defvar
জিনপিয়ের

1
@ কাউশালমোদি: আমি মনে করি এটি কোনও সদৃশ নয়। এই প্রশ্নটি defvarকোনও ফাইল বা বাফারে সমস্তর উপর অভিনয় সম্পর্কে , যদি আমি সঠিকভাবে বুঝতে পারি।
ড্র হয়েছে

1
সাধারণত একটিকে কখনই কেবল ডিফভরদের আবিষ্কার করতে হবে না । এছাড়াও ওপি ব্যবহার করে load-fileবোঝা যায় যে ডিফভারগুলি পুনরায় মূল্যায়ন করা হয়েছে তা নিশ্চিত করে তিনি পুরো ফাইলটি মূল্যায়ন করতে চান।
দক্ষ মোদী

2
আমি মানগুলি পরিবর্তন করার সাথে সাথে আমার নিজের পদ্ধতির ইওল-ডিফন করা। এটি আমার পক্ষে ব্যবহারের জন্য যথেষ্ট কম। YMMV।
ইয়ংফ্রোগ

উত্তর:


3

(progn (unload-feature 'your-lib) (load-library "your-lib"))

এই যতদিন কাজ করবে হিসাবে আপনি প্রথম Emacs মাধ্যমে গ্রন্থাগার লোড, এবং ব্যবহার করছেন না দ্বারা defvars লোড eval-defun, eval-bufferইত্যাদি

আপনি যখন ইত্যাদি ব্যবহার করেন require, load-libraryইমাসগুলি আপনার লাইব্রেরির কোন ভেরিয়েবল এবং ফাংশনগুলি তা ট্র্যাক করে রাখে এবং আপনি যখন ব্যবহার করবেন তখন এগুলি সম্পূর্ণরূপে সরিয়ে ফেলবে unload-feature

প্যাকেজগুলি লেখার সময়, আমি দেখতে পেয়েছি যে উপরের কোডটি ব্যবহার eval-defunকরা আপনি নতুন কোড লেখার সাথে সাথে চলার চেয়ে ভাল সমাধান যা আপনি মধ্যবর্তী অবস্থায় প্রবেশ করবেন না।


(info "(elisp) Loading"), (info "(elisp) Unloading")এবং গ্রন্থাগার অন্য লাইব্রেরির জন্য নির্ভরতা যদি যুক্তি unload-featureপ্রয়োজন force। দুর্দান্ত উত্তর! আমি ভাবছি যে
ইমাস

3

defvarকোনও ভেরিয়েবলের মান, যেমন বলুন setqবা ঠিক তেমনভাবে পুনরায় বরাদ্দ করে না setf। একবার ভেরিয়েবলের মান হয়ে গেলে defvar এটি স্পর্শ করবে না।

থেকে defvarএর docstring:

(defvar SYMBOL &optional INITVALUE DOCSTRING)

SYMBOL কে একটি ভেরিয়েবল হিসাবে সংজ্ঞায়িত করুন এবং SYMBOL ফিরিয়ে দিন।

...

INITVALUE alচ্ছিক আর্গুমেন্টটি মূল্যায়ন করা হয় এবং SYMBOL সেট করতে ব্যবহৃত হয়, যদি কেবল SYMBOL এর মান বাতিল হয়। যদি SYMBOL বাফার-স্থানীয় হয় তবে এর ডিফল্ট মান সেট করা হয়; বাফার-স্থানীয় মান প্রভাবিত হয় না। যদি INITVALUE অনুপস্থিত থাকে তবে সিমবোলের মান সেট করা নেই।

...

যেহেতু আপনি defvarপ্রথমটি লাইব্রেরিটি লোড করার সময় তাদের মানগুলি দেওয়ার জন্য প্রশ্নে ভেরিয়েবলগুলি সম্ভবত সম্পাদনা করেছেন তাই লাইব্রেরিটি পুনরায় লোড করা মানগুলি পরিবর্তন করবে না।

গ্লোবাল ভেরিয়েবলগুলি সংজ্ঞায়িত করতে এলিজপ ম্যানুয়াল নোডটিও দেখুন ।

নির্ভর করার পরিবর্তে defvar, আপনি সর্বদা মানগুলি পুনরায় বরাদ্দ করতে পারেন setq। বিকল্প হিসাবে, চতুর বিকল্প হিসাবে, আপনি uninternপ্রতীকগুলি যাতে defvarএটিগুলি পুনরায় লোড করার সময় তাদের খুঁজে না পান:

(defvar test-1 "test this")
(defvar test-2 "test this one, too")

test-1                                  ; => "test this"
test-2                                  ; => "test this one, too"

(defvar test-1 "trying to redefine")
(defvar test-2 "trying to redefine, too")

test-1                                  ; => "test this"
test-2                                  ; => "test this one, too"

(mapc #'unintern '(test-1 test-2))

test-1                                  ; => error!
test-2                                  ; => error!

(defvar test-1 "trying to redefine")
(defvar test-2 "trying to redefine, too")

test-1                                  ; => "trying to redefine"
test-2                                  ; => "trying to redefine, too"

2
এই প্রসঙ্গে যেমন, যখন এলিস্প প্যাকেজ বিকাশ করা defvarহয় তখন ব্যবহার করা সঠিক জিনিস। setqপৃথক ব্যবহারকারীদের দ্বারা সেট ক্লোবার কাস্টমাইজেশন হবে। ওপি প্যাকেজ বিকাশের সময়defvar ভেরিয়েবলের ওভাররাইটিংকে বলপূর্বক বলার উপায় চাইছে । স্যুইচ করতে প্যাকেজটি প্রকাশিত হলে ফিরে যেতে হবে । setqdefvar
টাইলার 21

@ টাইলার, হ্যাঁ, আমি একমত যে defvarএটি প্যাকেজ বিকাশের জন্য উপযুক্ত। আমি কেবল ইঙ্গিত করছি যা defvarমানগুলি পুনরায় বরাদ্দ করে না, যখন setqতা করে।
ড্যান

2

এটা চেষ্টা কর:

(defun foo ()
  "(Re-)evaluate all `defvar's in the buffer (or its restriction)."
  (interactive)
  (save-excursion
    (goto-char (point-min))
    (while (not (eobp))
      (when (re-search-forward "\\s-*(defvar \\([^ \t\n(\"]+\\)[ \t\n]+[^)]" nil 'MOVE)
        (let ((old-value (make-symbol "t"))
              new-value value)
          (let ((debug-on-error old-value))
            (setq value (eval-defun-2))
            (setq new-value debug-on-error))
          (unless (eq old-value new-value)
            (setq debug-on-error new-value))
          value)))))

এটি ঠিক একই কোড eval-defunব্যবহার করে যা একটিতে ব্যবহার করে defvar। এটি বাফারকে (বা সংকীর্ণকরণের মাধ্যমে তার বিধিনিষেধে) অনুসরণ করে, প্রতিটিটি থামিয়ে defvarএবং এতে eval-defunকোড ব্যবহার করে ।


1

আমি শুনেছি যে বাফার পুনরায় মূল্যায়নের জন্য কোনও সুবিধাজনক সমাধান নেই এর পুনরায় নির্ধারণের সাথে defvarআমি সহজ ফাংশন করেছি যা এর সাথে সম্পর্কিত eval-defun:

(defun my/eval-buffer ()
  "Evaluate entire buffer with re-assigning values to `defvar' / `defcustom'.
Useful during package development."
  (interactive)
  (save-excursion
    (beginning-of-buffer)
    (while (not (eobp))
      (eval-defun nil)
      (end-of-defun))))

কোড কাঠামো eval-defun-2বাস্তবায়নে অনুপ্রাণিত । এটি কীভাবে আমি একটি ডিভভারের পুনঃমূল্যায়নকে বাধ্য করব? সমাধান।

মূলত আমি বিল্ড স্ক্রিপ্টের মাধ্যমে পুনরায় ইনস্টল করা লাইব্রেরিটির পুনরায় মূল্যায়ন করতে উচ্চ স্তরের ফাংশনটি চাই:

(defun my/load-library (library)
  "Evaluate entire library with re-assigning values to `defvar' / `defcustom'.
Useful during package development."
  (interactive
   (list (completing-read "Load library: "
                          (apply-partially 'locate-file-completion-table
                                           load-path
                                           '("" ".el")))))
  (with-temp-buffer
    (insert-file-contents (locate-file library load-path '("" ".el")))
    (my/eval-buffer)))

ড্র সমাধানটি নেস্টেড এ এমনকি কাজ করে defvarতবে কোডটি সম্পূর্ণরূপে বোঝা শক্ত।

আমি uninternপ্রতীক উপসর্গ / রেজেক্সের উপর ভিত্তি করে সমস্ত চিহ্নগুলি সম্পর্কেও চিন্তা করি ( ড্যান যেমন পরামর্শ দিয়েছিল) তবে আমি প্রতিবার উপসর্গটি টাইপ করতে অলস আছি ... দেখুন কীভাবে আমি একটি নির্দিষ্ট উপসর্গের সাথে সমস্ত প্রতীক সংজ্ঞাটি আবদ্ধ করতে পারি?

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