Pregunta:
Intro
Cuando se programa en C y C ++, normalmente se dividen los prototipos de funciones y las funciones reales en un .hpp
.h
/ .hpp
y .c
/ .cpp
. Lamentablemente, es muy tedioso transferir los prototipos de funciones de un archivo a otro, y requiere abrir ambos archivos al mismo tiempo (o una buena memoria), así como una gran cantidad de escritura innecesaria, especialmente cuando se realizan cambios en los argumentos o nombres de miembros. hecho.
Ejemplo
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
}
Pregunta
¿Hay alguna manera de crear y actualizar automáticamente las funciones en foo.cpp
usando las definiciones y prototipos en foo.hpp
?
Respuesta:
¡Vaya, este fue divertido!
: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>
Puede seguir adelante y asignar eso a una sola pulsación de tecla en su .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>
Tenga en cuenta que esto supone que el constructor es el primer método de clase que aparece. (Podría arreglar eso, pero prefiero que sea simple. Por favor, mencione en un comentario si necesita que se arregle).
Esto también supone que el búfer del archivo de encabezado está vacío y ubicado directamente después del búfer del archivo de origen.
Explicación paso a paso:
: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