সমস্ত মুলতুবি বন্ধনী বন্ধ করা হচ্ছে


14

লিসপ কোডগুলি লেখার সময়, কখনও কখনও আমি নেস্টেড এক্সপ্রেশনটিতে গভীর এবং আমি যা চাই তা হ'ল সমস্ত অনুপস্থিত বন্ধনী বন্ধনী sertোকানো। কোনও মিল না পাওয়া প্যারেন না পাওয়া পর্যন্ত আমি এখনই সেগুলি সন্নিবেশ করছি তবে এটি খুব দক্ষ নয়।
অনুপস্থিত সমস্ত বন্ধনী toোকানোর জন্য কোনও আদেশ আছে কি?

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


2
এফডব্লিউআইডাব্লু, ফ্রাঞ্জ লিস্প (সিএল এর আগে) এর একটি বৈশিষ্ট্য ছিল যেখানে ]একটি সুপার রাইট পেরেন হিসাবে অভিনয় করেছিলেন, আপনার অনুরোধ অনুসারে সমস্ত উন্মুক্ত প্যারেন বন্ধ করে দিয়েছে।
ড্র হয়েছে

2
আমি আগেও একই পদ্ধতি ব্যবহার করেছি। সেই থেকে আমি পেরেডিট ব্যবহার শুরু করেছি , যা সমস্যাটি শুরু হওয়ার আগেই থামিয়ে দেয়। একমাত্র সতর্কতা হ'ল কোডে আটকানো একই ব্যালেন্সিং চিকিত্সা পায় না।
এলারসন

উত্তর:


6

এখানে একটি ফাংশন যা সমস্ত অনাবৃত বন্ধনী এবং অন্যান্য ম্যাচিং জোড় বন্ধ করে। এটি ইমাসের সেক্সপ পার্সিংয়ের উপর নির্ভর করে। এটি কেবল একক-চরিত্রের মিলিত জোড়গুলিকে সমর্থন করে, তাই এর মতো কিছু {-বন্ধ করা হবে }, নয় -}। লিস্পের জন্য, এতে কিছু যায় আসে না।

(defun close-all-parentheses ()
  (interactive "*")
  (let ((closing nil))
    (save-excursion
      (while (condition-case nil
         (progn
           (backward-up-list)
           (let ((syntax (syntax-after (point))))
             (case (car syntax)
               ((4) (setq closing (cons (cdr syntax) closing)))
               ((7 8) (setq closing (cons (char-after (point)) closing)))))
           t)
           ((scan-error) nil))))
    (apply #'insert (nreverse closing))))

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

@ মালবারবা এটি পূর্ব-খোলা প্রথম বন্ধনী বন্ধ করে দিয়েছে, পয়েন্টের পরে ইতিমধ্যে তাদের বন্ধন বন্ধন ছিল কিনা। এইভাবে আমি প্রশ্নটি বুঝতে পারি, তবে এটি স্বীকার করা যায় না যে এই বিষয়টিতে স্পষ্ট নয়। আপনার ব্যাখ্যার অধীনে ক্লোজিং ডিলিমিটারগুলি whereোকানো হবে কোথায়? যেমন ([-!-foo], আপনি ])বিন্দুতে sertোকান , বা )পরে foo]?
গিলস 'অশুভ হওয়া বন্ধ করুন'

আমার বোঝার থেকে, যদি আপনার থাকে তবে ([-!-foo]আমি )পরে sert োকাতাম foo]। তবে আমি অবশ্যই ভুল হতে পারি। সম্ভবত @rlazo বিস্তারিত বলতে পারবেন।
মালবারবা

আমার ব্যবহারের ক্ষেত্রে, @ গিলস ঠিক আছে, বিন্দু পরে ডিলিমিটারগুলি বন্ধ করা হয় কিনা সে বিষয়ে আমি চিন্তা করি না, আমি বিন্দুর আগে সবকিছু বন্ধ করতে চাই।
rlazo

3

আমি খুঁজে পেয়েছি যে আপনি যদি স্লাইম ইনস্টল করেন তবে এটি করার জন্য একটি আদেশ রয়েছে, যাকে বলে slime-close-all-parens-in-sexp


হুম ... সুতরাং এটি বর্তমান লাইনে বন্ধ হয়ে যায়। "বর্তমান ব্লক" বন্ধ করে এমন কোনও দৃষ্টিভঙ্গি উপস্থিত থাকলে খুব ভাল লাগবে। এটি ফাইলের শেষে গিয়ে কিছুটা না পাওয়া অবধি পশ্চাৎপদ সেক্সপ সরানো এবং এমনটি অর্জন করা যেতে পারে।
Att Righ

1

এটি করার একটি খুব আদিম (এবং প্রায় অবশ্যই ভুল) উপায় হবে

(defun buffer-needs-parens-fixing ()
  (save-excursion
    (condition-case nil
        (check-parens)
      (error (point)))))

(defun buffer-fix-parens ()
  (interactive)
  (while (buffer-needs-parens-fixing)
    (insert ")")))

অন্যান্য সীমাবদ্ধতার মধ্যে এটি অনুমান করে যে সন্নিবেশ করা দরকার এমন সমস্ত প্রথম বন্ধনী হ'ল:

  • বন্ধ
  • বর্তমান অবস্থানে প্রয়োজন

আমার ধারণা আপনার নির্দিষ্ট ব্যবহারের ক্ষেত্রে এটি যথেষ্ট পরিমাণে কার্যকর হতে পারে


আপনার যদি খুব বেশি ক্লোজিং বন্ধনী থাকে তবে এটি একটি অসীম লুপে আটকে যায়।
এমিল বিক্রস্টম

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