Başlık dosyalarından işlev prototiplerinden otomatik olarak işlev oluşturma


10

giriş

C ve C ++ 'da programlama yaparken genellikle işlev prototiplerinizi ve gerçek işlevlerinizi bir .h/ .hppve .c/ .cppdosyasına böldünüz. Ne yazık ki işlev prototiplerini bir dosyadan diğerine aktarmak çok yorucu ve her iki dosyayı da aynı anda açmayı (veya iyi bir belleği) ve özellikle argümanlarda veya üye adlarında değişiklikler olduğunda çok fazla gereksiz yazım gerektiriyor yapılmış.

Misal

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
}

Soru

foo.cppTanımları ve prototipleri kullanmadaki işlevleri otomatik olarak oluşturmanın ve güncellemenin bir yolu var mı foo.hpp?

Yanıtlar:


3

Vay canına, bu eğlenceliydi!

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

Devam edip bunu .vimrc'nizdeki tek bir tuşa eşleyebilirsiniz:

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>

Bunun, kurucunun görüntülenecek birinci sınıf yöntemi olduğunu varsaydığını unutmayın. (Bunu düzeltebilirim, ama basit tutmayı tercih ederim. Düzeltmeye ihtiyacınız varsa lütfen bir yorumda belirtin.)

Bu, üstbilgi dosya arabelleğinizin boş olduğunu ve kaynak dosya arabelleğinizden hemen sonra bulunduğunu varsayar.

Adım adım açıklama:

: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
Bu etkileyici olsa da (vim için yeniyim, bu yüzden her gün yeni şeyler keşfediyorum!), Korkarım ki ihtiyacım olan şey bu değil. Belki kendi eklentimi yapmaya bakmalıyım? Yapılması eğlenceli bir şey gibi görünüyor.
Lukas

2
@Lukas .vimrc'nizdeki bir eşleme sorunu ne şekilde çözmez? Basitçe Ctrl-B'ye basmak sizin için başlık dosyasını otomatik olarak dolduracaktır. (Muhtemelen başlık dosyasını güncelleştirilmiş bir sürümle değiştirmeden önce temizlemeliyim, ancak daha sonra yapabilmem için uyumak zorundayım.) Bir eklenti ilginç geliyor; yapmaya karar verirsen beni güncel tut. Ve Vim becerilerimi geliştirmek için ilginç bir meydan okuma için teşekkürler! ;)
Doorknob

2
Bu istek ters yönde çalışıyor gibi görünüyor: .cpp dosyasından bir başlık dosyası oluşturur.
200_success

... bu da hoş olurdu aslında, ama bence tanımdan bilinemeyen bazı şeyler var: örneğin, bildirimin olması gerekiyor inlinemuydu? Varsayılan argümanlar var mı? Argüman isimleri kullanılmalı mıdır?
Kyle Strand

@ 200_success Ah, haklısın (Yorumuna neden daha önce cevap vermediğimi bilmiyorum). Zamanım olduğunda, cevabımı başka yöne gitmek için düzenlemeye çalışacağım.
Doorknob

3

:GOTOIMPLDan komut lh-cpp bildiriminden itibaren bir fonksiyon tanımına atlamak için ya da vaka hiçbiri varsayılan boş tanım bulunmuştur verebilmektedir.

Düşünebileceğim bazı özellikler:

  • Komut da yorum, istisna spesifikasyonları, kopyalanan (ama muhtemelen yorumlardaki kopyalanamaz) edilmeyecektir anahtar anlar ( virtual, static, ...).
  • İşlevin geçerli kapsamı kodu çözülür (namespaces :: classes :: ...) ve doğru bir şekilde raporlanır (yani ns::, içinde namespace ns{veya using namespace ns;bağlamda olduğumuzda önek olmaz .

Ancak:

  • Şablonlar (henüz) anlaşılmamıştır.
  • İşlev gövdesi birbiri ardına manuel olarak oluşturulacaktır - yani henüz yürütmek için henüz zamanım olmadı: CTAG'ların beni işaret edebileceği tüm işlev bildirimlerinde GOTOIMPL.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.