আমি কীভাবে একটি সহজ `সমাপ্তি-এ-পয়েন্ট-ফাংশন` ফাংশন লিখতে পারি?


9

আমি ম্যাজিক সম্পাদনা করার জন্য একটি প্রধান মোড লেখার বিষয়ে বিবেচনা করছি: একত্রিত ডেকে।

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

স্পষ্টতই আমাকে নতুন কার্ড ইত্যাদির সাথে সিঙ্ক করার একটি উপায় খুঁজে বের করতে হবে এবং ভবিষ্যতে কেবল কার্ডের নাম বাদে অন্য বৈশিষ্ট্যগুলি দ্বারা কার্ড অনুসন্ধান করতে সক্ষম হতে হবে তবে এটি অপেক্ষা করতে পারে।

উত্তর:


17

নথিপত্র

পয়েন্ট ফাংশনে এপিআই সম্পূর্ণ হওয়া এর ডকুমেন্টেশনে পাওয়া যাবে completion-at-point-functions

এই হুকের প্রতিটি ক্রিয়াকলাপকে কোনও যুক্তি ছাড়াই ঘুরে বলা হয় এবং এটি অর্থাত্ প্রযোজ্য নয়, বা সম্পূর্ণ করার জন্য কোনও যুক্তির কোনও ক্রিয়া (নিরুৎসাহিত), বা ফর্মের একটি তালিকা (START সমাপ্তি সমাপ্তি PROPS) যেখানে START এবং END সত্তাটি সম্পূর্ণ করার জন্য সীমানা নির্ধারণ করে এবং বিন্দুটি অন্তর্ভুক্ত করা উচিত, COLLECTION এটি সম্পূর্ণ করার জন্য ব্যবহারের জন্য সমাপ্তি টেবিল এবং অতিরিক্ত তথ্যের জন্য PROPS সম্পত্তি তালিকা রয়েছে।

start, endএবং propsসুস্পষ্ট, তবে আমি মনে করি এর বিন্যাসটি collectionসঠিকভাবে সংজ্ঞায়িত হয়নি। তার জন্য আপনি try-completionবা এর ডকুমেন্টেশন দেখতে পারেনall-completions

যদি সংগ্রহটি একটি তালিকাবদ্ধ থাকে, কীগুলি (উপাদানগুলির গাড়ি) সম্ভাব্য পরিসমাপ্তি। যদি কোনও উপাদানটি কোনও কনস সেল নয়, তবে উপাদানটি নিজেই সম্ভাব্য সমাপ্তি। যদি COLLECTION হ্যাশ-টেবিল হয় তবে স্ট্রিং বা প্রতীকযুক্ত সমস্ত কীগুলি সম্ভাব্য পরিসমাপ্তি। যদি COLLECTION একটি ওভারে হয় তবে ওবারে সমস্ত চিহ্নের নামগুলি সম্ভাব্য পরিসমাপ্তি।

সংগ্রহ সম্পূর্ণরূপে নিজেই করতে একটি ফাংশন হতে পারে। এটি তিনটি আর্গুমেন্ট গ্রহণ করে: মানগুলি STRING, পূর্বে এবং শূন্য। যা-ই ফিরে আসে তা 'চেষ্টা-সমাপ্তির' মান হয়ে যায়।

উদাহরণ

নীচে বিন্দু ফাংশনে সমাপ্তির একটি সাধারণ উদাহরণ যা /etc/dictionaries-common/wordsবাফারে শব্দগুলি সম্পূর্ণ করতে সংজ্ঞায়িত শব্দগুলি ব্যবহার করে

(defvar words (split-string (with-temp-buffer
                              (insert-file-contents-literally "/etc/dictionaries-common/words")
                              (buffer-string))
                            "\n"))

(defun words-completion-at-point ()
  (let ((bounds (bounds-of-thing-at-point 'word)))
    (when bounds
      (list (car bounds)
            (cdr bounds)
            words
            :exclusive 'no
            :company-docsig #'identity
            :company-doc-buffer (lambda (cand)
                                  (company-doc-buffer (format "'%s' is defined in '/etc/dictionaries-common/words'" cand)))
            :company-location (lambda (cand)
                                (with-current-buffer (find-file-noselect "/etc/dictionaries-common/words")
                                  (goto-char (point-min))
                                  (cons (current-buffer) (search-forward cand nil t))))))))

সমাপ্তির ফাংশনটি বিন্দুতে শব্দের সন্ধান করে (লাইব্রেরিটি thingatptশব্দের সীমাগুলি সন্ধান করতে ব্যবহৃত হয়) এবং এটি /etc/dictionaries-common/wordsফাইলের শব্দের বিপরীতে সম্পূর্ণ করে , সম্পত্তিটি :exclusiveসেট করা থাকে noযাতে আমাদের ব্যর্থ হলে ইমাসগুলি অন্যান্য ক্যাপ ফাংশন ব্যবহার করতে পারে। অবশেষে কিছু অতিরিক্ত সম্পত্তি সংস্থা-মোড ইন্টিগ্রেশন উন্নত করতে সেট করা আছে।

কর্মক্ষমতা

আমার সিস্টেমে শব্দগুলির ফাইলটিতে 99171 টি এন্ট্রি রয়েছে এবং ইমাকগুলি কোনও সমস্যা ছাড়াই সেগুলি সম্পন্ন করতে সক্ষম হয়েছিল, তাই আমার ধারণা 15000 এন্ট্রি কোনও সমস্যা হওয়া উচিত নয়।

সংস্থা-মোডের সাথে সংহতকরণ

কোম্পানি মোড ব্যাকএন্ড completion-at-point-functionsব্যবহারের সাথে খুব ভালভাবে সংহত করে company-capf, তাই এটি আপনার জন্য বাক্সের বাইরে কাজ করা উচিত, তবে আপনি propsক্যাপের ফাংশনের ফলে অতিরিক্ত ফিরে এসে কোম্পানির দেওয়া পরিপূরকগুলি বাড়িয়ে তুলতে পারেন। প্রপস বর্তমানে সমর্থিত হয়

:company-doc-buffer - বর্তমান প্রার্থীর মেটাডেটা প্রদর্শন করতে সংস্থা দ্বারা ব্যবহৃত

:company-docsig - মিনিবাসে প্রার্থী সম্পর্কে মেটাডেটা প্রতিধ্বনি করতে সংস্থার দ্বারা ব্যবহৃত

:company-location - বর্তমান প্রার্থীর লোকেশনে লাফ দিতে সংস্থা দ্বারা ব্যবহৃত


আহারে! পুরো উত্তর জন্য ধন্যবাদ! আমি এটিকে কিছুটা চেষ্টা করব এবং তার পরে গ্রহণ করব। সংস্থার ইঙ্গিতগুলির জন্য অতিরিক্ত ধন্যবাদ (যা আমি আসলে ব্যবহার করছি)।
ম্যাটিয়াস বেনগটসন

ধন্যবাদ, এটি এখন সত্যিই সহায়ক আমি সহজেই কাস্টম সম্পূর্ণকরণগুলি কনফিগার করতে পারি :)
ক্লেমেরা

খুশী আমি সাহায্য করতে পারি :)
ইকবাল আনসারী

0

@ ইকবাল আনসারী একটি দুর্দান্ত উত্তর দিয়েছেন। এখানে একটি পরিপূরক উত্তর, আশা করি এটি সহায়তা করবে।

ইমাস ক্লাসিক সমাপ্তির প্রক্রিয়া, ২০০৯ ব্যবহার করে এখানে একটি বাস্তবায়ন।

;; this is your lang's keywords
(setq xyz-kwdList
      '("touch"
       "touch_start"
       "touch_end"
       "for"
       "foreach"
       "forall"
       ))

নিম্নলিখিতটি কোডটি সম্পূর্ণ করেছে is

(defun xyz-complete-symbol ()
  "Perform keyword completion on word before cursor."
  (interactive)
  (let ((posEnd (point))
        (meat (thing-at-point 'symbol))
        maxMatchResult)

    ;; when nil, set it to empty string, so user can see all lang's keywords.
    ;; if not done, try-completion on nil result lisp error.
    (when (not meat) (setq meat ""))
    (setq maxMatchResult (try-completion meat xyz-kwdList))

    (cond ((eq maxMatchResult t))
          ((null maxMatchResult)
           (message "Can't find completion for “%s”" meat)
           (ding))
          ((not (string= meat maxMatchResult))
           (delete-region (- posEnd (length meat)) posEnd)
           (insert maxMatchResult))
          (t (message "Making completion list…")
             (with-output-to-temp-buffer "*Completions*"
               (display-completion-list 
                (all-completions meat xyz-kwdList)
                meat))
             (message "Making completion list…%s" "done")))))

আইডো-মোডের ইন্টারফেস ব্যবহার করে একটি বাস্তবায়ন অনুসরণ করা হচ্ছে। অনেক সহজ।

(defun abc-complete-symbol ()
  "Perform keyword completion on current symbol.
This uses `ido-mode' user interface for completion."
  (interactive)
  (let* (
         (bds (bounds-of-thing-at-point 'symbol))
         (p1 (car bds))
         (p2 (cdr bds))
         (current-sym
          (if  (or (null p1) (null p2) (equal p1 p2))
              ""
            (buffer-substring-no-properties p1 p2)))
         result-sym)
    (when (not current-sym) (setq current-sym ""))
    (setq result-sym
          (ido-completing-read "" xyz-kwdList nil nil current-sym ))
    (delete-region p1 p2)
    (insert result-sym)))

আপনার শব্দের একটি তালিকা হিসাবে আপনাকে xyz-kwdList সংজ্ঞায়িত করতে হবে।


2
-1 খারাপ ভাবে সমাপ্তির ইন্টারফেস reinventing জন্য যাওয়ার জন্য nullবেশি notএবং camelcased শনাক্তকারী ও গ্রিক প্রতীক যা শুধুমাত্র আপনার নিজের মোড মধ্যে জানার জন্য ব্যবহার করে।
wasamasa

3
-1 যা ছিল সে সম্পর্কে উত্তর না দেওয়ার জন্য completion-at-point-functions( nullবনাম notজিনিস সম্পর্কে আমি @ ওয়াসমাসার সাথে একমত নই )।
npostavs

3
@ এক্সএলএলএর কার্যগুলি completion-at-point-functionsসম্পূর্ণরূপে ডেটা ফিরিয়ে নেবে বলে মনে করা হয়, তারা নিজেই সম্পূর্ণ করে না। সুতরাং আপনার উত্তরের ফাংশনগুলি এন্ট্রি হিসাবে ব্যবহারযোগ্য নয় completion-at-point-functions
npostavs

1
@npostavs আহ আমি দেখছি। তুমি ঠিক. ধন্যবাদ!
জাহ লি

4
@ এনপোস্টাভস এই ধরণের ফাংশনটি এখনও কাজ করবে তবে প্রকৃতপক্ষে একটি সমাপ্তি ফাংশনটি লেখা ডকুমেন্টেড ইন্টারফেসের বিরুদ্ধে, এবং এটি দৃ strongly়ভাবে নিরুৎসাহিত।
দিমিত্রি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.