สร้างฟังก์ชั่นออกจากต้นแบบฟังก์ชันโดยอัตโนมัติจากไฟล์ส่วนหัว


10

Intro

เมื่อเขียนโปรแกรมใน C และ C ++ ที่คุณมักจะแยกต้นแบบการทำงานของคุณและฟังก์ชั่นที่เกิดขึ้นจริงเป็น.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>

โปรดทราบว่านี่ถือว่าตัวสร้างเป็นวิธีการชั้นแรกที่จะปรากฏ (ฉันสามารถแก้ไขได้ แต่ฉันต้องการให้มันง่ายโปรดพูดถึงในความคิดเห็นหากคุณต้องการแก้ไข.)

สิ่งนี้ยังอนุมานว่าบัฟเฟอร์ไฟล์ส่วนหัวของคุณว่างเปล่าและอยู่หลังบัฟเฟอร์ไฟล์ต้นฉบับของคุณ

คำอธิบายทีละขั้นตอน:

: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
@Lukas การทำแผนที่ใน. vimrc ของคุณไม่ได้ช่วยแก้ปัญหาอย่างไร เพียงกดปุ่ม Ctrl-B จากนั้นจะเติมไฟล์ส่วนหัวให้คุณโดยอัตโนมัติ (ฉันควรจะล้างไฟล์ส่วนหัวก่อนที่จะแทนที่ด้วยเวอร์ชั่นที่อัปเดต แต่ฉันต้องนอนหลับดังนั้นฉันอาจทำในภายหลัง) ปลั๊กอินมีเสียงน่าสนใจ แจ้งให้ฉันทราบหากคุณตัดสินใจ และขอขอบคุณสำหรับความท้าทายที่น่าสนใจในการฝึกฝนทักษะ Vim ของฉัน! ;)
Doorknob

2
ดูเหมือนว่าจะทำงานในทิศทางตรงกันข้ามจากคำขอ: มันสร้างไฟล์ส่วนหัวจากไฟล์. cpp
200_success

... ซึ่งจะดีจริง ๆ แต่ฉันคิดว่ามีบางสิ่งที่ไม่สามารถทราบได้จากคำจำกัดความ: เช่นการประกาศควรจะเป็นinlineอย่างไร มีอาร์กิวเมนต์เริ่มต้นหรือไม่ ชื่ออาร์กิวเมนต์ควรจะถูกนำออกมา?
Kyle Strand

@ 200_success อาคุณพูดถูก (ฉันไม่รู้ว่าทำไมฉันไม่ตอบความคิดเห็นของคุณก่อนหน้านี้) เมื่อฉันมีเวลาฉันจะพยายามแก้ไขคำตอบเพื่อไปทางอื่น
Doorknob

3

:GOTOIMPLคำสั่งจากLH-CPPสามารถที่จะข้ามไปยังนิยามฟังก์ชันจากการประกาศของตนหรือที่จะให้คำนิยามที่ว่างเปล่าไม่มีค่าเริ่มต้นในกรณีที่ถูกพบ

คุณสมบัติบางอย่างที่ฉันนึกได้:

  • คำสั่งแล้วเข้าใจความเห็นรายละเอียดข้อยกเว้นคำหลักที่จะไม่ต้องคัดลอก ( แต่อาจจะคัดลอกภายในความเห็น) ( virtual, static, ... )
  • ขอบเขตปัจจุบันของฟังก์ชั่นจะถูกถอดรหัส (namespaces :: classes :: ... ) และรายงานอย่างถูกต้อง (เช่นจะไม่นำหน้าด้วยns::ถ้าเราอยู่ภายในnamespace ns{หรือusing namespace ns;บริบท

อย่างไรก็ตาม:

  • เทมเพลตยังไม่เข้าใจ
  • ร่างกายของฟังก์ชั่นจะต้องถูกสร้างขึ้นด้วยตัวเองหลังจากที่อื่น ๆ - เช่นฉันยังไม่ได้ใช้เวลาในการดำเนินการ: GOTOIMPL ในการประกาศฟังก์ชั่นทั้งหมดที่ ctags สามารถชี้ให้ฉัน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.