আমি কীভাবে foo.c থেকে স্বয়ংক্রিয়ভাবে foo.h এ একটি প্রোটোটাইপ canোকাতে পারি?


11

ধরুন আমি একটি সিও প্রোগ্রাম লিখছি foo.c ফাইলটিতে:

int add_numbers(int x, int y, int z) {
    // Very complex implementation here.
    return x + y + z;
}

আমি একটি কমান্ড চাই যা foo.h এ সম্পর্কিত ফাংশন প্রোটোটাইপ সন্নিবেশ করবে:

int add_numbers(int x, int y, int z);

এটির জন্য কি কোনও বিদ্যমান ইমাকস সমাধান রয়েছে?

উত্তর:


9

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

পুরানো উত্তর :

আপনি senator-copy-tagসঠিকভাবে ফাংশন স্বাক্ষর অনুলিপি করতে ব্যবহার করতে পারেন , তারপরে আপনার উত্স ফাইলে পেস্ট করুন। senator-copy-tagএবং সেনেটর কমান্ডগুলি উপলভ্য যখন আপনি সক্ষম করবেন semantic-mode:

(semantic-mode 1)

শব্দার্থক একটি ইম্যাক্স অন্তর্নির্মিত প্যাকেজ।

আপনি আপনার প্রকল্পের যে কোনও জায়গা থেকে অন্য ফাইলে (একই নামে পৃথক এক্সটেনশানযুক্ত ফাইল) ফাংশন প্রোটোটাইপ সন্নিবেশ করার জন্য আপনি প্রজেক্টাইলের সাথে সিমেন্টিক সিনেটরকে একটি কমান্ডের সাথে সংযুক্ত করতে পারেন। যদি অন্য একটি ফাইল থাকে তবে কমান্ডটি তত্ক্ষণাত সেই ফাইলটিতে প্রবেশ করান; যদি একের বেশি হয় তবে আপনাকে একটি ফাইল নির্বাচন করতে অনুরোধ করা হবে; যদি কিছুই না থাকে তবে আপনাকে আপনার প্রকল্পের সমস্ত ফাইলের জন্য অনুরোধ জানানো হবে। আপনি কোনও ফাইল নির্বাচন করার পরে, একটি প্রম্পট বর্তমান বাফারে সিমেন্টিক ট্যাগগুলির একটি তালিকা সরবরাহ করে যা আপনি পরে toোকানোর জন্য চয়ন করতে পারেন।

আমি জমা একটি জনসংযোগ করতে গিয়ে Emacs Refactor । আপনি যদি PR এর অপেক্ষা না করে চেষ্টা করতে চান তবে সম্পূর্ণ কোড: এখানে ক্লিক করুন

এখানে একটি ডেমো রয়েছে (এটি START DEMOনীচে দেখলে এটি শুরু হয় ):

প্রজেক্ট-শব্দার্থিক-সন্নিবেশ ফাংশনের-প্রোটোটাইপ

প্রোটোটাইপ অনুলিপি এবং ফাংশন করতে আপনি কেবল সিনেটর ব্যবহার করতে পারেন। যতক্ষণ বিন্দু ফাংশন স্বাক্ষর বা ফাংশন বডি এর ভিতরে যে কোনও জায়গায় থাকে, রান senator-copy-tag, যা C-c , M-wডিফল্টরূপে আবদ্ধ হয় , এটি পুরো ফাংশনটি অনুলিপি করে: স্বাক্ষর এবং শরীর উভয়ই। তবে, আপনি কেবলমাত্র স্বাক্ষরটি পেস্ট করতে পারেন যদি আপনি কমান্ডটি চালিয়ে চান senator-yank-tagযা C-c , C-yডিফল্টরূপে আবদ্ধ । টিপুন C-yটিপুন তার শরীরের সাথে পুরো ফাংশন স্বাক্ষরটি আটকে দিন। senator-copy-tagএমনকি এই জাতীয় একাধিক লাইনে ফাংশন স্বাক্ষরের প্রসারিত সহ কাজ করে:

void 
func(int a,
     int b, 
     int c)
{
    .....
}

যদিও এই পদ্ধতির সাথে একই নামের সাথে সরাসরি বাফারটি sertোকানো হয়নি, তবে এটি অন্যান্য ক্ষেত্রে আরও প্রযোজ্য। আপনার ব্যবহারের ক্ষেত্রে কেবলমাত্র যদি আপনার একই ডিরেক্টরিতে একই নাম এবং পৃথক এক্সটেনশান সহ দুটি ফাইল থাকে তবে কাজ করে। যদি ফাংশন ঘোষণা এবং ফাংশন সংজ্ঞা অবশ্যই আলাদা আলাদা আলাদা আলাদা আলাদা ফাইলের মধ্যে থাকে?

সম্পাদনা 2 : এখানে শব্দার্থক ট্যাগ ব্যবহার করে ফাংশন প্রোটোটাইপের স্মার্ট সন্নিবেশের একটি উদাহরণ রয়েছে। বর্তমানে, আপনি কেবলমাত্র শীর্ষ স্তরের শব্দার্থক ট্যাগগুলির আপেক্ষিক অবস্থানগুলির ("পূর্বে" এবং "পরে") ভিত্তিতে সন্নিবেশ করতে পারেন। আমি ইউজার করতে আপডেট হবে কোন জায়গা যেখানে শব্দার্থিক ট্যাগ, পাওয়া যায় আরও অবস্থানের সঙ্গে সন্নিবেশ পাবে (অর্থাত যখন একটি ট্যাগ একটি হল Class, এটা অতিরিক্ত অবস্থানের প্রস্তাব করা উচিত: public, projectedএবং private)। আপনি START DEMOনীচের অংশে দেখলে ডেমোটি শুরু হয় :

প্রজেক্ট-শব্দার্থিক-সন্নিবেশ ফাংশনের-prototype2

বোনাস : আপনি যদি .cppএকটি শিরোনাম ফাইল থেকে কোনও ফাইলে ফাঁকা ফাংশন সংজ্ঞাগুলির একটি তালিকা তৈরি করতে চান তবে সদস্য-ফাংশন.েল ব্যবহার করুন । তবে শীঘ্রই, আমি এটিকে সিমেন্টিক + প্রজেক্টাইল দিয়ে প্রতিস্থাপন করব।


3

নিম্নলিখিত কমান্ড এটি করা উচিত। এটি আমার পরীক্ষায় উত্তীর্ণ হয়েছে এবং এর কোনও বাহ্যিক নির্ভরতা নেই।

(defun endless/copy-proto-to-header-file ()
  (interactive)
  (save-excursion
    ;; c-mode's `beginning-of-defun' should be robust enough.
    (beginning-of-defun)
    (let ((l (point)))
      (search-forward-regexp " *{")
      (let ((proto (buffer-substring l (match-beginning 0))))
        (ff-find-other-file)
        ;; If other file is already open, we don't want to move point.
        (save-excursion
          (goto-char (point-max))
          ;; Do some more movement here if you want.
          (insert "\n" proto ";"))))))

2

আমি মনে করি নিম্নলিখিতগুলির কাজ করা উচিত (এটি আমার পক্ষে কাজ করে):

(defun c-copy-function-signature-to-header ()
  (interactive)
  (save-excursion
    (let ((last-point -1))
      (while (/= (point) last-point)
        (setq last-point (point))
        (sp-backward-up-sexp))
      (kill-ring-save (point) (line-beginning-position))
      (ff-find-other-file)
      (yank)
      ;; clean whitespace between closing paren and opening curly 
      (delete-trailing-whitespace
        (line-beginning-position)
        (line-end-position))
      (insert ";")))

এটির প্রয়োজন smartparens, যদিও আপনি sp-backward-up-sexpযদি এটি অগ্রহণযোগ্য হয় তবে আপনার নিজের অনুলিপিটি হ্যাক করতে সক্ষম হতে পারেন।

এছাড়াও মনে রাখবেন যে হেডারটিতে আপনি (point)সর্বশেষে যেখানে রেখে গেছেন সেখানে এটি শিরোনামটি রাখবে। আপনি কোথায় চেয়েছিলেন তা নির্দিষ্ট না করেই আমি ভেবেছিলাম এটি সম্ভবত সবচেয়ে ভাল। অবশ্যই, আপনি যদি এটি শেষে যুক্ত হতে চান তবে আপনি এটির (end-of-buffer)আগে একটি রাখতে পারেন (yank)। অবশ্যই আপনি পয়েন্টের কাছাকাছি একটি নতুন লাইন তৈরি এবং সেখানে ইয়াঙ্কিংয়ের মতো ফ্যানসিয়ার স্টাফগুলি যুক্ত করতে পারেন তবে এটি আপনার স্বাদ অনুসারে।

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