শিরোনাম ফাইলগুলি থেকে ফাংশন প্রোটোটাইপগুলির বাইরে স্বয়ংক্রিয়ভাবে ফাংশন তৈরি করা


10

ইন্ট্রো

সি এবং সি ++ এ প্রোগ্রামিং করার সময় আপনি সাধারণত আপনার ফাংশন প্রোটোটাইপ এবং প্রকৃত ফাংশনগুলিকে একটি .h/ .hppএবং .c/ .cppফাইলে বিভক্ত করেন । দুর্ভাগ্যক্রমে ফাংশন প্রোটোটাইপগুলি এক ফাইল থেকে অন্য ফাইলটিতে স্থানান্তর করা অত্যন্ত ক্লান্তিকর এবং একই সাথে উভয় ফাইল খোলার প্রয়োজন হয় (বা একটি ভাল মেমরি), পাশাপাশি প্রচুর অপ্রয়োজনীয় টাইপিং, বিশেষত যখন যুক্তি বা সদস্যের নাম পরিবর্তন হয় প্রণীত।

উদাহরণ

foo.hpp:

int someFunction(int someArgument);

class someClass
{
     public:
     someClass();
     ~someClass();

     int anotherFunction(int anotherArgument);
};

foo.cpp:

#include "foo.hpp"

int someFunction(int someArgument)
{
    // Code goes here
}

someClass::someClass()
{
    // Code goes here
}

someClass::~someClass()
{
    // Code goes here   
}

int someClass::anotherFunction(int anotherArgument)
{
    // Code goes here
}

প্রশ্ন

foo.cppসংজ্ঞা এবং প্রোটোটাইপগুলি ব্যবহার করে ফাংশনগুলি স্বয়ংক্রিয়ভাবে তৈরি এবং আপডেট করার কোনও উপায় আছে foo.hpp?

উত্তর:


3

হ্যাঁ, এই মজা ছিল!

:g/.*\n^{/yank A<cr>:bn<cr>pkdd:%s/$/;/<cr>:g/::/d B<cr>A<cr><cr>class <cr>{<cr>};<esc>"BP:%s/[^ ]\+:://<cr>j%jyt(kk$p=ipjA<cr>public:<esc>

আপনি এগিয়ে যান এবং এটি আপনার .vimrc এর একক কী স্ট্রোকে ম্যাপ করতে পারেন:

nnoremap <C-b> :g/.*\n^{/yank A<cr>:bn<cr>pkdd:%s/$/;/<cr>:g/::/d B<cr>A<cr><cr>class <cr>{<cr>};<esc>"BP:%s/[^ ]\+:://<cr>j%jyt(kk$p=ipjA<cr>public:<esc>

নোট করুন যে এটি ধরে নিয়েছে যে কনস্ট্রাক্টর প্রদর্শিত হবে প্রথম শ্রেণীর পদ্ধতি। (আমি এটি ঠিক করতে পারি, তবে আমি এটি সহজ রাখি you আপনার যদি এটির প্রয়োজন হয় তবে দয়া করে কোনও মন্তব্যে উল্লেখ করুন))

এটিও ধরে নিয়েছে যে আপনার শিরোনাম ফাইল বাফারটি খালি এবং সরাসরি আপনার উত্স ফাইল বাফারের পরে অবস্থিত।

ধাপে ধাপে ব্যাখ্যা:

:g/.*\n^{/yank A<cr>            Yank all the function definitions (power of g!)
:bn<cr>                         Move to the header file buffer
pkdd                            Put in the function definitions
:%s/$/;/<cr>                    Add semicolons
:g/::/d B<cr>                   Grab the class methods and put them in register B
A<cr><cr>class <cr>{<cr>};<esc> Self-explanatory, add class skeleton
"BP                             Put the class methods in the class
:%s/[^ ]\+:://<cr>              Remove someClass::
j%jyt(kk$p                      Add the actual class name
=ip                             Fix indentation
jA<cr>public:<esc>              Add the `public:' modifier

1
যদিও এটি চিত্তাকর্ষক (আমি বরং ভিমে নতুন, তাই আমি প্রতিদিন নতুন নতুন জিনিস আবিষ্কার করছি!), আমি ভয় করি যে এটি আমার যা প্রয়োজন তা ঠিক নয়। আমার নিজের প্লাগইনটি তৈরি করা উচিত? মনে হচ্ছে এটি মজাদার জিনিস।
লুকাশ

2
@ লুকাস কীভাবে আপনার .vimrc এ ম্যাপিং সমস্যার সমাধান করে না? কেবল সিআরটিএল-বি তে আঘাত করলে তা স্বয়ংক্রিয়ভাবে আপনার জন্য শিরোনাম ফাইলটি পূরণ করবে। (একটি সম্ভবত আপডেট সংস্করণ দিয়ে এটির পরিবর্তে শিরোনামের ফাইলটি সম্ভবত আমার পরিষ্কার করা উচিত, তবে আমাকে ঘুমাতে হবে তাই পরে তা করতে পারি)) একটি প্লাগইন আকর্ষণীয় মনে হয়; আপনি যদি একটি তৈরির সিদ্ধান্ত নেন তবে আমাকে আপডেট রাখুন। এবং আমার ভিম দক্ষতা তীক্ষ্ণ করার আকর্ষণীয় চ্যালেঞ্জের জন্য ধন্যবাদ! ;)
ডোরকনব

2
এটি অনুরোধ থেকে বিপরীত দিকে কাজ করছে বলে মনে হচ্ছে: এটি .cpp ফাইল থেকে একটি শিরোনাম ফাইল তৈরি করে।
200_সুচে

... যা আসলেও সুন্দর লাগবে, তবে আমি মনে করি কিছু সংজ্ঞা আছে যা সংজ্ঞা থেকে জানা যায় না: যেমন, ঘোষণাটি কী বলে মনে করা হচ্ছে inline? ডিফল্ট যুক্তি আছে? যুক্তির নামগুলি বাদ দেওয়া উচিত?
কাইল স্ট্র্যান্ড

@ ২০০_সুসেস আহ, আপনি ঠিক বলেছেন (কেন আমি আপনার মন্তব্যে এর আগে জবাব দেইনি তা আমি জানি না)। আমার যখন সময় থাকবে তখন আমি আমার উত্তরটি অন্যভাবে যেতে সম্পাদনা করার চেষ্টা করব।
ডোরকনব

3

:GOTOIMPLথেকে কমান্ড LH-CPP তার ঘোষণা থেকে একটি ফাংশন সংজ্ঞা ঝাঁপ, অথবা যদি কেউ একটি ডিফল্ট খালি সংজ্ঞা পাওয়া যায়নি প্রদান করতে সক্ষম হয়।

কিছু বৈশিষ্ট্য যা আমি ভাবতে পারি:

  • কমান্ড ইতিমধ্যে মন্তব্য, ব্যতিক্রম উল্লেখ, কীওয়ার্ড যে কপি করা হবে না (কিন্তু সম্ভবত মন্তব্য মধ্যে অনুলিপি করেছে) বুঝতে পারে ( virtual, static, ...)।
  • ফাংশনের বর্তমান স্কোপটি ডিকোড করা হয়েছে (নেমস্পেসস :: ক্লাস :: ...) এবং সঠিকভাবে রিপোর্ট করা হয়েছে (যেমন এটি আমাদের প্রসঙ্গে বা কোনও প্রসঙ্গে ns::থাকলে উপস্থাপিত হবে না ।namespace ns{using namespace ns;

যাহোক:

  • টেমপ্লেটগুলি (এখনও) বোঝা যায় নি।
  • ফাংশন বডি একের পর এক ম্যানুয়ালি তৈরি করতে হবে - যেমন আমি এখনও কার্যকর করতে সময় নিই না: ctags আমাকে নির্দেশ করতে পারে এমন সমস্ত ফাংশন ঘোষণায় GOTOIMPL।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.