ヘッダーファイルから関数プロトタイプから関数を自動的に作成する


10

はじめに

CおよびC ++でプログラミングする場合、通常、関数プロトタイプと実際の関数を.h/ .hppおよび.c/ .cppファイルに分割します。悲しいことに、関数のプロトタイプを1つのファイルから別のファイルに転送するのは非常に退屈であり、両方のファイル(または適切なメモリ)を同時に開く必要があるだけでなく、特に引数やメンバー名の変更が多い場合は、多くの不要な入力が必要になります。製。

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

ふew、これは楽しかった!

: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>

これは、コンストラクターが最初に表示されるクラスメソッドであると想定していることに注意してください。(私はそれを修正することができますが、私はそれを単純に保ちたいです。それを修正する必要がある場合はコメントで言及してください。)

これは、ヘッダーファイルバッファーが空であり、ソースファイルバッファーの直後にあることも前提としています。

ステップバイステップの説明:

: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
これは印象的ですが(私はvimが比較的新しいので、毎日新しいことを発見しています!)、これは私が必要としているものではないのではないかと心配しています。多分私は自分のプラグインを作ることを検討する必要がありますか?楽しいことのようです。
Lukas、

2
@Lukas .vimrcのマッピングはどのように問題を解決しませんか?Ctrl-Bを押すだけで、ヘッダーファイルが自動的に入力されます。(ヘッダーファイルを更新済みバージョンに置き換える前に、おそらくそれをクリアする必要がありますが、後でスリープする必要があるので、後でそうするかもしれません。)プラグインは興味深い音に聞こえます。あなたが作ることに決めたら、私に最新情報を送ってください。そして、私のVimスキルを磨くための興味深い挑戦に感謝します!;)
ドアノブ2015

2
これはリクエストとは逆の方向に機能するようです:.cppファイルからヘッダーファイルを作成します。
200_success

...実際にはこれもいいでしょうが、定義からはわからないことがいくつかあると思います。たとえば、宣言は正しいはずinlineですか?デフォルトの引数はありますか?引数名を省略すべきですか?
カイルストランド

@ 200_successああ、そうです(以前にコメントに返信しなかった理由がわかりません)。時間があるときは、答えを編集して別の方向に進みます。
ドアノブ2015

2

lh-cpp:GOTOIMPLからのコマンドは、その宣言から関数定義にジャンプしたり、何も見つからなかった場合にデフォルトの空の定義を提供したりできます。

私が考えることができるいくつかの機能:

  • コマンドはすでにコメント、例外の仕様、コピーされた(しかし、おそらくコメントの中にコピー)してはならないのキーワードを理解(virtualstatic、...)。
  • 関数の現在のスコープはデコードされ(namespaces :: classes :: ...)、正しく報告されます(つまり、コンテキストns::namespace ns{またはusing namespace ns;コンテキスト内にある場合、プレフィックスは付きません)。

しかしながら:

  • テンプレートは(まだ)理解されていません。
  • 関数本体は次々に手動で作成する必要があります。つまり、ctagsが私に指摘する可能性のあるすべての関数宣言で:GOTOIMPLを実行するのにまだ時間がかかりません。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.