আপনি যখন নাবালিক মোড সংজ্ঞাটি বিকাশ করেন তখন এটি কীভাবে আপডেট করবেন?


13

কিছু কী-বাইন্ডিং সরবরাহ করতে আমি একটি ছোটখাটো মোডে কোডিং শুরু করেছি। আমার প্রথম প্রয়াসে একটি টাইপ ছিল:

(define-minor-mode borked-mode
  "A mode defined with a broken key binding"
  nil nil
  '(([b] . 'previous-line)))

আমি bকীটি ব্যবহার করার ইচ্ছা করেছিলাম এবং ততক্ষনে বুঝতে পারি যে এর "b"পরিবর্তে আমার ব্যবহার করা উচিত ছিল [b]। সুতরাং আমি গৌণ মোডটিকে নতুনভাবে সংজ্ঞায়িত করেছি:

(define-minor-mode borked-mode
  "A mode defined with a broken key binding"
  nil nil
  '(("b" . 'previous-line)))

তবে, এটি কার্যকর হয়নি didn't এটি আমাকে বাইন্ডিং কীগুলি (যেমন, (কেবিডি ...), [...], ইত্যাদি) বিভিন্ন উপায়ের মাধ্যমে বুনো হাঁস তাড়া করে ফেলেছে। অবশেষে আমি বুঝতে পেরেছিলাম যে কেবল (define-minor-mode ...)ফর্মটির পুনরায় মূল্যায়ন করা কোনও পরিবর্তন করছে না, আমি মূল, ভাঙা কী মানচিত্রের সাথে আটকে আছি। আমি তখন সরাসরি ম্যাপের মাধ্যমে কী-ম্যাপটি পরিবর্তন করার চেষ্টা করেছি (define-key borked-mode-map ...)এবং এখনও সংশোধিত কীম্যাপটি লোড করতে পারিনি। অবশেষে আমি ইমাক্স পুনরায় চালু করেছি এবং আমার ছোটখাটো মোডটি সঠিকভাবে লোড হয়েছে।

আমার প্রশ্ন হ'ল: আপনি যখন একটি ছোটখাটো মোড সংজ্ঞাটি বিকাশ করবেন তখন কীভাবে আপডেট করবেন? ভাঙা সংজ্ঞাটি ফ্লাশ করার কোনও উপায় আছে, বা ভাঙা বিটগুলি সরিয়ে ফেলতে আপনার কি ইমাস পুনরায় চালু করতে হবে?

উত্তর:


11

আপনি যখন প্রথমবার define-minor-modeএটি মূল্যায়ন করেন তখন আপনার borked-mode-mapনির্দিষ্ট কী বাইন্ডিংগুলির সাথে একটি পরিবর্তনশীল সংজ্ঞায়িত করা হয় । একবার প্রতীকটি সংজ্ঞায়িত হয়ে গেলে, আপনার পুনরায় মূল্যায়ন define-minor-modeকরলে এটি পরিবর্তন হবে না।

আপনি বিভিন্ন borked-mode-xxxচিহ্ন ব্যবহার করে মুছতে পারেন uninternএবং তারপরে আপনার কোডটি পুনরায় মূল্যায়ন করতে পারেন। চেষ্টা করুন:

(unintern 'borked-mode-map)

define-minor-modeম্যাক্রোটি আসলে কী করছে তা দেখার জন্য আপনি আগ্রহী হতে পারেন। শেষে পয়েন্ট দিন এবং কল করুন M-x pp-macroexpand-last-sexp। এটি প্রসারিত ম্যাক্রো দেখিয়ে একটি নতুন বাফার খুলবে। সেখানে আপনি defvarআপনার মোড ভেরিয়েবলগুলি সেট আপ করতে কলগুলি দেখতে পাবেন । আপনি যদি সহায়তাটি পড়েন তবে defvarআপনি দেখতে পাবেন যে প্রাথমিক মানটি কেবলমাত্র তখনই ব্যবহৃত হয় যখন সংজ্ঞায়িত চিহ্নটি শূন্য থাকে - এটি উপস্থিত থাকলে, পরবর্তী defvarকলগুলি এর মান পরিবর্তন করে না।


13

আমি মনে করি আমি যে সর্বোত্তম উত্তর দিতে পারি তা হ'ল "ইনলাইন কী-বাইন্ডিং বৈশিষ্ট্য" থেকে দূরে থাক define-minor-mode। ব্যবহার

(defvar borked-mode-map
  (let ((map (make-sparse-keymap)))
    (define-key map [b] 'previous-line)
    ...
    map))

(define-minor-mode borked-mode
  "A mode defined with a broken key binding"
  :global nil
  ...)

পরিবর্তে. তারপরে আপনি C-M-xএই সংজ্ঞাগুলি পুনরায় মূল্যায়ন করতে ব্যবহার করতে পারেন ।


1
defvarএর পরে আবার এর মানটি মূল্যায়ন করবে না C-M-x:) আপনার প্রয়োজন defparameterবা আলাদা প্রয়োজন setf
wvxvw

@Wvxvw যেমন উল্লেখ করেছে, এটি আসলে সমস্যাটির সমাধান করে না। আপনার উদাহরণ কোডটি define-minor-modeম্যাক্রোর মতো একই কাজ করছে : defvarমানচিত্র সংজ্ঞায়িত করার জন্য কল করা। দ্বিতীয়বার এই ডিভভারকে মূল্যায়নের কোনও প্রভাব নেই।
গ্লুকাস

7
@wvxvw আপনি যদি পুনরায় মূল্যায়ন করতে C-M-x( eval-defun) ব্যবহার করেন defvarতবে ভেরিয়েবলটি আপডেট হয়। এটি একটি বিশেষ ক্ষেত্রে eval-defun; আপনি যদি কল করেন eval-bufferবা eval-regionতারপরে বিদ্যমান মান পরিবর্তিত হয় না।
গিলস 'অশুভ হওয়া বন্ধ করুন'

আহ - এটি মূল পয়েন্ট মত মনে হচ্ছে।
গ্লুকাস

1
মনে রাখবেন যে, C-M-xউপর defvarফর্ম শুধুমাত্র আপডেট মোড মানচিত্রে পরিবর্তনশীল নিজেই। এছাড়াও আপনি আছে C-M-xউপর define-minor-modeপরিবর্তিত মানচিত্র গৌণ মোডে 'ইনস্টল' পেতে ফর্ম। আমি ম্যাক্রোগুলি প্রসারিত করে কেন তা জানার চেষ্টা করেছি, তবে এটি আমার বাইরে।
টাইলার

0

আপনি আপনার মোড মানচিত্রটিকে এভাবে সংজ্ঞায়িত করতে পারেন:

(defvar dnd-mode-map
  (let ((map (make-sparse-keymap)))
    (prog1 map
      (define-key map "q" 'dnd-quit)
      (when (eq this-command 'eval-defun)
        (let ((mmap (assq 'dnd-mode minor-mode-map-alist)))
          (when mmap
            (setcdr mmap map)))))))

এখন আপনি ব্যবহার করে মানচিত্রের সংজ্ঞাটি পুনরায় মূল্যায়ন করতে সক্ষম হবেন eval-defunএবং এটি স্বয়ংক্রিয়ভাবে সঞ্চিত মানচিত্রটিকে অভ্যন্তরে আপডেট করবে minor-mode-map-alist

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