ম্যাজিটে ব্যবহৃত পপআপ মেনুর অনুরূপ কীভাবে প্রয়োগ করা যায়


10

প্রশ্ন

আমি পপআপ মেনু আকারে ইউজার ইন্টারফেস তৈরি করতে চাই , ম্যাজিটে ব্যবহৃত অনুরূপ পপআপ মেনু

বৈশিষ্ট্য

পপআপ সংজ্ঞা

এই প্রশ্নের প্রসঙ্গে পপআপের অর্থ সামান্য অস্থায়ী উইন্ডো যা মেনু আইটেমগুলির সংকলন ধারণ করে যাতে ব্যবহারকারী এই আইটেমগুলির মধ্যে একটি এবং কেবল একটি নির্বাচন করতে পারেন।

পর্দায় অবস্থান

পপআপটিকে স্ক্রিনের যে কোনও অংশে উপস্থিত হওয়ার অনুমতি দেওয়া হয়েছে, তবে এটি আকাঙ্ক্ষিত যে এটি বেশ সুস্পষ্ট হওয়া উচিত এবং সুতরাং এটি বর্তমানে সক্রিয় উইন্ডোর পাশে উপস্থিত হওয়া উচিত।

পপআপ বাফারের সামগ্রী

আইটেমগুলি সুন্দর টেবিল আকারে প্রদর্শিত হবে। সুন্দর হ'ল প্রশ্নের প্রসঙ্গ অর্থ দৃষ্টি আকর্ষণীয়, এই প্রভাবটি খুব সহজেই মেনু আইটেমগুলিকে সোজা সারিগুলিতে স্থাপন করে অর্জন করা যায়, complete--insert-stringউদাহরণস্বরূপ দেখুন। এই অনুচ্ছেদটি অতিরিক্ত স্পষ্টতার জন্য পরিবেশন করে, আপনি এটি নিজের উপায়ে করতে পারেন, এটি আপনার উত্তরকে ভুল রেন্ডার করবে না।

মেনু আইটেম নির্বাচন

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

এনবি মাউসটি বিভিন্ন উপায়ে ব্যবহার করা যেতে পারে এবং কোনও বিকল্প চিহ্নিত করার বিকল্প উপায়গুলিও স্বাগত।

পপআপ নির্মূল

একবার ব্যবহারকারী উপরে বর্ণিত উপায়ে মেনু আইটেমটি নির্বাচন করে নিলে বাফার এবং এর উইন্ডোটি দৃশ্য থেকে বাদ দেওয়ার পাশাপাশি হত্যা করা উচিত। পপআপ মেনু আহ্বানের আগে যে উইন্ডোটি সক্রিয় ছিল সেটি আবার ফোকাস করা উচিত (যা সক্রিয় হয়ে ওঠে)।

প্রত্যাবর্তিত মান এবং তর্কগুলি

অগ্রাধিকার হিসাবে, ক্রিয়াগুলির এই পরিণতির ফলে লিস্প অবজেক্টটি ফিরে আসতে পারে। লিস্প অবজেক্টটি হতে পারে:

  • nil- এটি নির্দেশ করে যে ব্যবহারকারী পপআপ মেনুটি টিপে C-gবা অন্য কোনও উপায়ে † বাতিল করে দিয়েছে †

  • string- স্ট্রিং (এটি একটি প্রতীক ব্যবহারের অনুমতি দেওয়া) string-equal আসল আইটেমগুলির সংগ্রহ হিসাবে পপআপ মেনুতে সরবরাহ করা স্ট্রিংগুলির একটিতে হওয়া উচিত ।

ব্যবহারকারীদের পছন্দ বা সম্ভবত এর অনুপস্থিতিটি প্রোগ্রামের বাকি অংশগুলিকে জানানোর বিকল্প উপায়গুলি গ্রহণযোগ্য। তবে, যদি এটি পরিষ্কার হয় না তবে কীভাবে এটি সম্পাদন করা যেতে পারে আমি সমস্ত উত্তরদাতাকে অসম্পূর্ণ জিজ্ঞাসা করি এবং আমাকে এই দিকটির আরও ব্যাখ্যা দেওয়ার জন্য জিজ্ঞাসা করি না।

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

গ্রহণযোগ্য উত্তরসমূহ

প্রত্যাশিত উত্তর নিম্নলিখিত ফর্মগুলির হতে পারে:

  • পর্যাপ্ত কোড স্নিপেট যা শিক্ষিত পাঠককে উপরের বর্ণনার মতো ফাংশন লিখতে দেয়; এটি সম্পূর্ণ কাজের ফাংশন লিখতে প্রত্যাশিত বা প্রয়োজনীয় নয়। তবে, অনিশ্চয়তা এড়াতে (কোডের উল্লেখযোগ্য অংশগুলি বাদ দেওয়া যেতে পারে?), আমার নোট করা উচিত যে স্নিপেটের অনুপস্থিত অংশগুলি উত্তরের পাঠ্য উপাদানগুলিতে বর্ণনা করা উচিত।

  • বিদ্যমান গ্রন্থাগারের একটি লিঙ্ক যা একই কার্যকারিতা প্রয়োগ করে। অনিশ্চয়তা এড়ানোর জন্য, আমার নোট করা উচিত যে আমাদের ক্ষেত্রে একই রকমের অর্থ গ্রন্থাগারটি পপআপ তৈরি করতে ব্যবহার করা যেতে পারে (উপরে সংজ্ঞাটি দেখুন) যার উপরে বর্ণিত কমপক্ষে 2 বা 3 বৈশিষ্ট্য রয়েছে। প্রস্তাবিত গ্রন্থাগার যদি পূর্বের বর্ণিত শর্তটি পূরণ করা যায় না এমন বিন্দু থেকে পৃথক হয়, তবে এই জাতীয় প্রতিটি ক্ষেত্রেই স্বাধীনভাবে বিচার করা হবে এবং ওপি যদি এটি কার্যকর মনে করে তবে সর্বদা উন্নীত হবে।

  • অন্তর্নির্মিত ইমাস ফাংশন বা তৃতীয় পক্ষের বিবরণ যা বিভাগ «বৈশিষ্ট্যগুলি described এ বর্ণিত কোনও বৈশিষ্ট্য প্রয়োগ করতে ব্যবহার করা যেতে পারে, উপরে দেখুন। এড়ানোর অনিশ্চয়তা করা, রাষ্ট্রীয় পরিষ্কারভাবে কিভাবে আপনার উত্তর ভবিষ্যৎ পাঠক যারা বাস্তবায়ন করতে চান তাদের জন্য উপযোগী হতে পারে পপআপ , পপ-আপ মেনু Magit ব্যবহৃত অনুরূপ


The পপআপ মেনুটি বাতিল করার বিকল্প উপায়গুলির মধ্যে নিম্নলিখিতগুলি অন্তর্ভুক্ত থাকতে পারে (তবে এগুলিতে সীমাবদ্ধ নয়):

  • পপআপ মেনু উইন্ডোর বাইরে ক্লিক করা;

  • কোনও পছন্দ না করে পপআপ সমেত বাফার হত্যা করা।

উত্তর:


8

magit-popupএটা নিজস্ব ম্যানুয়াল আছে ! তবে আপনি যদি পপআপে আর্গুমেন্টগুলি সেট করতে না চান যা ততক্ষণে অনুরোধ করা অ্যাকশনে প্রেরণ করা হয় তবে আপনি সম্ভবত hydraপরিবর্তে ব্যবহার করা ভাল are

আরও লক্ষ করুন যে আমার আরও বিকাশের ইচ্ছা নেই magit-popup। পরিবর্তে আমি স্ক্র্যাচ থেকে অনুরূপ প্যাকেজ লিখব। বর্তমান বাস্তবায়নে কেবলমাত্র দুর্ঘটনাজনিত জটিলতা রয়েছে। (তবে এর অর্থ এই নয় যে এটি magit-popupকেবল অদৃশ্য হয়ে যাবে It এটি সম্ভবত অনেকগুলি নতুন বৈশিষ্ট্য দেখতে পাবেন না, তবে বর্তমান বাস্তবায়ন যদি আপনি যা চান তা করেন তবে কেন এটি ব্যবহার করবেন না?)

বা যেহেতু আপনিও এটি "স্ক্র্যাচ থেকে" করতে চান, তাই দেখুন read-char-choiceএবং সেখান থেকে যান। ভিজ্যুয়াল অংশটি বাস্তবায়নের lvজন্য হাইড্রা ভান্ডারগুলির একটি অংশ রয়েছে তা একবার দেখুন ।


অন্যান্য পাঠকদের জন্য: নোট করুন যে @ পার্সিয়াস সেই প্রতিস্থাপনটি অনুসরণ করে লিখেছেন magit-popup। নতুন প্যাকেজটি বলা transientহয় এবং বর্তমান সংস্করণগুলিতে এটি ব্যবহৃত হয় magit। ডকুমেন্টেশনের জন্য Magit.vc/manual/transient দেখুন ient
ফিল্ডস

5

হাইড্রাস লিখতে বেশ সহজ:

(defhydra hydra-launcher (:color blue :columns 2)
   "Launch"
   ("h" man "man")
   ("r" (browse-url "http://www.reddit.com/r/emacs/") "reddit")
   ("w" (browse-url "http://www.emacswiki.org/") "emacswiki")
   ("s" shell "shell")
   ("q" nil "cancel"))

(global-set-key (kbd "C-c r") 'hydra-launcher/body)

হাইড্রা হ'ল একটি কীবোর্ড কেন্দ্রিক ইন্টারফেস এবং এর মূল আকারে এটি easy-menu-define(অন্তর্নির্মিত) থেকে বেশি শক্ত নয় । আপনি যদি আরও জটিল জিনিস এটি করতে চান তবে এটি যথেষ্ট এক্সটেনসিবল।

এই টুইটারিং ইন্টারফেসটি দেখুন, নীচের উইন্ডোটি একটি কাস্টম হাইড্রা, উপরে লেখাটির চেয়ে বেশি শক্ত লেখা নয়:

Hydra-twittering.png

এর জন্য কোডটি আরও অনেক উদাহরণ সহ উইকিতে উপলভ্য ।


দুর্দান্ত, আমি অবশ্যই এই জিনিসটি সম্পর্কে আরও জানার জন্য সময় পাব!
মার্ক কার্পভ

1

কিছু গবেষণার পরে আমি একটি আইডিয়াম খুঁজে পেয়েছি যা বর্তমানে সক্রিয় উইন্ডোর নীচে (বা প্রকৃতপক্ষে যে কোনও জায়গায়) উইন্ডো তৈরি করতে ব্যবহার করা যেতে পারে। এটি নিজেই অস্থায়ী, সহায়ক উইন্ডোটির প্রভাব ফেলে:

(let ((buffer (get-buffer-create "*Name of Buffer*")))
  (with-current-buffer buffer
    (with-current-buffer-window
     ;; buffer or name
     buffer
     ;; action (for `display-buffer')
     (cons 'display-buffer-below-selected
           '((window-height . fit-window-to-buffer)
             (preserve-size . (nil . t))))
     ;; quit-function
     (lambda (window _value)
       (with-selected-window window
         (unwind-protect
             ;; code that gets user input
           (when (window-live-p window)
             (quit-restore-window window 'kill)))))
     ;; Here we generate the popup buffer.
     (setq cursor-type nil)
     ;; …
     )))

আপনি যদি পপআপটি পর্দার বিভিন্ন অংশে প্রদর্শিত হতে চান তবে আপনি actionযুক্তি দিয়ে কিছুটা খেলতে with-current-buffer-windowপারেন।

প্রস্থান ফাংশন ডক-স্ট্রিংয়ে বর্ণিত হয়েছে with-current-buffer-window, এটি ব্যবহারকারীর কাছ থেকে ইনপুট পেতে ব্যবহার করা যেতে পারে। যেমন @ টারশিউস প্রস্তাবিত, read-char-choiceপরীক্ষার জন্য ভাল প্রার্থী।

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

যদি আপনার পপআপটি সামান্য অ্যাড-হক হয় এবং আপনার এটির একাধিকবার প্রয়োজন হয় না, আপনি এই সমাধানটি সরিয়ে নিতে পারেন। এছাড়াও, একবার দেখুন completion--insert-strings। আমি মেনু আইটেমগুলির চমত্কার সারিগুলি কীভাবে তৈরি করতে পারি তার উদাহরণ হিসাবে এটি বেশ দরকারী বলে মনে হয়েছে, আপনার যদি বিশেষ কোনও কিছুর প্রয়োজন না হয় তবে আপনি এটি আনল্টারড ব্যবহার করতে পারেন।


4
আমার মনে হয় আপনার মাথায় থাকা প্রশ্নটি ভাল good আপনি যে প্রশ্নটি লিখেছিলেন তা বরং অস্পষ্ট, আমি দেখতে পাচ্ছি না যে এইরকম উত্তরের পরে কেউ কীভাবে জানতে পারত।
npostavs

1

আইসিকেলস ব্যবহার করে এখানে একটি তৃতীয় পক্ষের সমাধান দেওয়া হয়েছে ।

  • আপনার কোডটি উইন্ডোটিকে পপ আপ করে দেয় প্রার্থীদের সাথে মেনু হিসাবে ঝরঝরে সাজানো। কিভাবে, নীচে দেখুন।

  • আপনি প্রতিটি মেনু আইটেমকে একটি অনন্য চরিত্র সহ উপস্থাপন করেন। উদাহরণস্বরূপ, ক, খ, সি ... বা 1, 2, 3 ... ব্যবহারকারীর আইটেমটি বেছে নেওয়ার জন্য চরকে আঘাত করে।

  • আপনি কোনও কলটির চারপাশে কয়েকটি ভেরিয়েবল বাঁধেন completing-read। আপনি এটি আপনার মেনু আইটেমের একটি তালিকা পাস করুন। আপনি ডিফল্ট হিসাবে আইটেমগুলির মধ্যে একটিতে specifyচ্ছিকভাবে সুনির্দিষ্ট করে উল্লেখ করেছেন, যদি ব্যবহারকারী কেবল আঘাত করে তবে বেছে নেওয়া হয় RET

    পরিবর্তনশীল বাইন্ডিংগুলি এগুলি বলে completing-read:

    • প্রতিটি মেনু আইটেমকে একটি পৃথক সারিতে দেখান
    • সাথে সাথে মেনুটি প্রদর্শন করুন Show
    • যখন কোনও ব্যবহারকারী কোনও কী চাপায় তখন তা আপডেট করুন
    • অবিলম্বে ফিরে আসুন, যদি ব্যবহারকারী ইনপুটটি কেবল একটি আইটেমের সাথে মেলে
    • প্রম্পটে ডিফল্ট পছন্দটি প্রদর্শন করুন।
  • আপনি চাইলে মেনু আইটেমগুলিকে অভিনব হিসাবে তৈরি করতে পারেন (দেখানো হয়নি)।

    • মুখ
    • চিত্র
    • টীকা
    • আইটেম প্রতি একাধিক লাইন
    • mouse-3 আইটেমটি দিয়ে কিছু করতে পপআপ মেনু
(defvar my-menu '(("a: Alpha It"   . alpha-action)
                  ("b: Beta It"    . beta-action)
                  ("c: Gamma It"   . gamma-action)
                  ("d: Delta It"   . delta-action)
                  ("e: Epsilon It" . epsilon-action)
                  ("f: Zeta It"    . zeta-action)
                  ("g: Eta It"     . eta-action)
                  ("h: Theta It"   . theta-action)
                  ("i: Iota It"    . iota-action)
                  ("j: Kappa It"   . kappa-action)
                  ("k: Lambda It"  . lambda-action)))

(defun my-popup ()
  "Pop up my menu.
User can hit just the first char of a menu item to choose it.
Or s?he can click it with `mouse-1' or `mouse-2' to select it.
Or s?he can hit RET immediately to select the default item."
  (interactive)
  (let* ((icicle-Completions-max-columns               1)
         (icicle-show-Completions-initially-flag       t)
         (icicle-incremental-completion-delay          0.01)
         (icicle-top-level-when-sole-completion-flag   t)
         (icicle-top-level-when-sole-completion-delay  0.01)
         (icicle-default-value                         t)
         (icicle-show-Completions-help-flag            nil)
         (choice  (completing-read "Choose: " my-menu nil t nil nil
                                   "b: Beta It")) ; The default item.
         (action  (cdr (assoc choice my-menu))))

    ;; Here, you would invoke the ACTION: (funcall action).
    ;; This message just shows which ACTION would be invoked.
    (message "ACTION chosen: %S" action) (sit-for 2)))

আপনি প্রকৃতপক্ষে একাধিক-পছন্দীয় মেনুও তৈরি করতে পারেন , এটি হ'ল মেনু যেখানে ব্যবহারকারী একই সাথে একাধিক আইটেম চয়ন করতে পারেন (সম্ভাব্য পছন্দগুলির একটি উপসেট চয়ন করুন)।


1

আপনি প্যাকেজ দেখতে আগ্রহী হতে পারে makey। এটি একই ধরণের কার্যকারিতা সরবরাহ করার উদ্দেশ্যে তৈরি করা হয়েছিল magit-popupএবং এটি পূর্ববর্তী পূর্বসূরীর magit-popup( magit-key-mode, মন্তব্যে উল্লিখিত) একটি কাঁটা যা তখনও যখন এটি থেকে আলাদাভাবে প্যাকেজ উপলব্ধ ছিল না magit

আমি আরও উল্লেখ করতে পারি discover: এটি কীভাবে ব্যবহার করা যায় তার একটি উদাহরণ makey(এবং এটির রেসন ডি'ট্রেও)। এই প্যাকেজটি ইমামকে বাইন্ডিংগুলি আবিষ্কার করতে নতুনদের সহায়তা করার জন্য।


তথ্যসূত্র


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

@ টারসিয়াস উত্তরের যথার্থতা বিচার করা কঠিন হতে পারে। যদি আপনি জানেন যে এটি সঠিক নয়, এটি সম্পাদনা করতে দ্বিধা বোধ করবেন। আমি একটি সম্পাদনা করেছি, আমি এখনও 100% নিশ্চিত নই যে এটি এখন সঠিক। আমি এটির যে "ঘাটতি" পেয়েছি তাও উল্লেখ করি নি কারণ সেগুলি কী তা আমি জানি না।
ইয়ংফ্রোগ

0

সমস্ত কনফিগার করা উপসর্গের জন্য গাইড-কী আমার পক্ষে দুর্দান্ত কাজ করেছে।


0

মেনু ডেটা থেকে মেনু বাস্তবায়ন পৃথক করার পরিবর্তনের সাথে @ ড্র এর উত্তর (আইকিকেলস) এর উপর ভিত্তি করে - যাতে একাধিক মেনু তাদের নিজস্ব: (সামগ্রী, প্রম্পট, ডিফল্ট) দ্বারা সংজ্ঞায়িত করা যায়।

এটি allyচ্ছিকভাবে আইভি ব্যবহার করে (যখন উপলব্ধ থাকে) ব্যবহার করে, যাতে মেনু খোলা রাখার সময় আইটেম সক্রিয় করতে সক্ষম হওয়ার মতো আরও উন্নত বৈশিষ্ট্য রয়েছে।

জেনেরিক পপআপ।

(defun custom-popup (my-prompt default-index my-content)
  "Pop up menu
Takes args: my-prompt, default-index, my-content).
Where the content is any number of (string, function) pairs,
each representing a menu item."
  (cond
    ;; Ivy (optional)
    ((fboundp 'ivy-read)
      (ivy-read my-prompt my-content
        :preselect
        (if (= default-index -1) nil default-index)
        :require-match t
        :action
        (lambda (x)
          (pcase-let ((`(,_text . ,action) x))
            (funcall action)))
        :caller #'custom-popup))
    ;; Fallback to completing read.
    (t
      (let ((choice (completing-read
                     my-prompt my-content nil t nil nil
                     (nth default-index my-content))))
        (pcase-let ((`(,_text . ,action) (assoc choice my-content)))
          (funcall action))))))

ব্যবহারের উদাহরণ, f12 কীতে কিছু ক্রিয়া বরাদ্দ করুন:

(defvar
  my-global-utility-menu-def
  ;; (content, prompt, default_index)
  '(("Emacs REPL" . ielm)
    ("Spell Check" . ispell-buffer)
    ("Delete Trailing Space In Buffer" . delete-trailing-whitespace)
    ("Emacs Edit Init" . (lambda () (find-file user-init-file))))

(defun my-global-utility-popup ()
  "Pop up my menu. Hit RET immediately to select the default item."
  (interactive)
  (custom-popup my-global-utility-menu-def "Select: ", 1))

(global-set-key (kbd "<f12>") 'my-global-utility-popup)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.