বর্তমান চরিত্রটি major প্রধান মোডের জন্য একটি মন্তব্য চরিত্র কিনা তা আমি কীভাবে সনাক্ত করতে পারি?


12

আমি এই সামান্য ফাংশনটিতে কাজ করছি যা পরবর্তী লাইনের সাথে বর্তমান লাইনের দিকে টান দেয়। আমি একটি কার্যকারিতা যুক্ত করতে চাই যাতে বর্তমান লাইনটি যদি একটি লাইন মন্তব্য হয় এবং পরবর্তী লাইনটিও একটি লাইন মন্তব্য হয়, তবে মন্তব্যের অক্ষরগুলি "টান আপ" ক্রিয়া সরিয়ে ফেলা হবে।

উদাহরণ:

আগে

;; comment 1▮
;; comment 2

কল করা হচ্ছে M-x modi/pull-up-line

পরে

;; comment 1▮comment 2

নোট করুন যে ;;অক্ষরগুলি পূর্বে ছিল সেগুলি সরিয়ে ফেলা হয়েছে comment 2

(defun modi/pull-up-line ()
  "Join the following line onto the current one (analogous to `C-e', `C-d') or
`C-u M-^' or `C-u M-x join-line'.

If the current line is a comment and the pulled-up line is also a comment,
remove the comment characters from that line."
  (interactive)
  (join-line -1)
  ;; If the current line is a comment
  (when (nth 4 (syntax-ppss))
    ;; Remove the comment prefix chars from the pulled-up line if present
    (save-excursion
      (forward-char)
      (while (looking-at "/\\|;\\|#")
        (delete-forward-char 1))
      (when (looking-at "\\s-")
        (delete-forward-char 1)))))

উপরের ফাংশন কাজ করে কিন্তু এখন জন্য, প্রধান-মোড নির্বিশেষে, বিবেচনা করব /বা ;বা #একটি মন্তব্য চরিত্র হিসাবে: (looking-at "/\\|;\\|#")

আমি এই লাইনটিকে আরও বুদ্ধিমান করে তুলতে চাই; মেজর-মোড নির্দিষ্ট।

সমাধান

@ অ্যারিকস্টোকসের সমাধানের জন্য ধন্যবাদ, আমি বিশ্বাস করি যে নীচে এখন আমার ব্যবহারের সমস্ত বিষয় কভার করেছে :)

(defun modi/pull-up-line ()
  "Join the following line onto the current one (analogous to `C-e', `C-d') or
`C-u M-^' or `C-u M-x join-line'.

If the current line is a comment and the pulled-up line is also a comment,
remove the comment characters from that line."
  (interactive)
  (join-line -1)
  ;; If the current line is a comment
  (when (nth 4 (syntax-ppss))
    ;; Remove the comment prefix chars from the pulled-up line if present
    (save-excursion
      (forward-char)
      ;; Delete all comment-start or space characters
      (while (looking-at (concat "\\s<" ; comment-start char as per syntax table
                                 "\\|" (substring comment-start 0 1) ; first char of `comment-start'
                                 "\\|" "\\s-")) ; extra spaces
        (delete-forward-char 1)))))

আপনি কি আলাদা মন্তব্য মন্তব্য শুরুর এবং শেষ অক্ষর এবং বহু-চরিত্রের মন্তব্যগুলি (যেমন সি এর /* ... */) পরিচালনা করতে যথেষ্ট স্মার্ট হতে চান ?
এরিকস্টোক

নাহ, এটাই আমার দরকার ছিল। ধন্যবাদ!
कौशल মোদী

@ এরিকস্টোকস কৌতূহলের বাইরে, আপনি কীভাবে সি-স্টাইল মন্তব্যগুলি পরিচালনা করবেন?
প্রধানমন্ত্রী

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

2
@Pradhan আছে comment-startএবং comment-endস্ট্রিং সেট করা হয় যে, "/ *" এবং "* /" এ c-mode(কিন্তু c++-mode)। এবং c-comment-start-regexpএটি উভয় শৈলীর সাথে মেলে। আপনি শেষ অক্ষরগুলি মুছে ফেলছেন এবং তারপরে যোগ দেওয়ার পরে শুরু। কিন্তু আমি মনে করি আমার সমাধান হবে uncomment-region, এবং কি মন্তব্য চরিত্র কি সম্পর্কে এ গিয়ে Emacs চিন্তা করা যাক। join-linecomment-region
এরিকস্টোক

উত্তর:


12

আপনি না পরীক্ষা করতে যদি বর্তমান চরিত্র সিনট্যাক্স টেবিল ব্যবহার করে একটি মন্তব্য চরিত্র: (looking-at "\\s<")। Regexp \\s<"মন্তব্য শুরু" সিনট্যাক্সের সাথে কোনও চরিত্রের সাথে মিলবে; \\s>"মন্তব্য শেষ" সিনট্যাক্স সহ তাদের সাথে মিলবে।

আর একটি বিকল্প হল ভেরিয়েবল comment-start, যা স্ট্রিংটি inোকানো হয় comment-dwimএবং বন্ধুরা। এটি সাধারণত মন্তব্য শুরুর চরিত্রের সাথে কিছুটা স্থান সেট করা থাকে।


2

আরও সহজ সমাধান রয়েছে , দয়া করে আমার কোডটি https://github.com/redguardtoo/evil-nerd-commenter/blob/master/evil-nerd-commenter.el এ অধ্যয়ন করুন

আমি এখানে সমস্ত কোড অনুলিপি / পেস্ট করব না। তবে এখানে মূল বিষয়গুলি:

  • মন্তব্যটির নিজস্ব ফন্টের মুখ, অনুসন্ধানের ফন্ট-লক-মন্তব্য-মুখ এবং আমার কোডটিতে ফন্ট-লক-মন্তব্য-ডেলিমিটার-মুখ রয়েছে

  • দ্বিতীয় লাইনটি আপত্তিহীন করতে ইমাসের নিজস্ব API ব্যবহার করুন, তারপরে এটি প্রথম লাইনের সাথে যুক্ত করুন

এটি যে কোনও সংবেদনশীল বড় মোডে কাজ করা উচিত।

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


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

আমি এই কৌশলটি ইমাক্সের নিজস্ব কোড (আসলে, এটি ফ্লাইস্পেল) পড়ে শিখেছি, যেমন আমি আমার কোডটিতে নথিভুক্ত করেছি।
চেন বিন

0

আপনি যদি লিস্প কোডের জন্য এই বৈশিষ্ট্যটি খুঁজছেন (এলিস্প, ক্লোজার, স্কিম এবং কমন লিস্প), তবে আপনার লিস্পি চেষ্টা করা উচিত , নামক একটি ফাংশন lispy-fillএই জাতীয় জিনিসটি করে।

আপনি যদি অন্য ভাষার জন্য এই বৈশিষ্ট্যটি খুঁজছেন, তবে আপনার পুনরায় বাক্স 2 করা উচিত (এর জন্য যাচাই করা Cএবং Python), একটি ফাংশন নামে পরিচিত rebox-fillবা অন্য কোনও ফাংশন যা rebox-dwimএই জাতীয় জিনিসটি করে।

এগুলি উভয়ই দুর্দান্ত প্যাকেজ, এবং তারা একে অপরের সাথে বিরোধী নয় যেহেতু তারা বিভিন্ন প্রধান-মোডের জন্য ব্যবহৃত হয় এবং তারা উভয়ই ( lispy-fillএবং rebox-dwim) আবদ্ধ M-q, বেশ ঝরঝরে।

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