用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
中的函数?#1 楼
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中的一个按键: br />
请注意,这假定构造函数是第一个出现的类方法。 (我可以解决这个问题,但是我想保持简单。如果需要修复,请在注释中提及。)
这也假设您的头文件缓冲区为空,并且位于紧随其后您的源文件缓冲区。
分步说明:
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>
#2 楼
lh-cpp中的:GOTOIMPL
命令能够从其声明中跳转到函数定义,或者在找不到该定义时提供默认的空定义。 我可以想到的一些功能:
该命令已经可以理解注释,异常规范以及不得复制(但可能在注释内复制)的关键字(
virtual
,static
,...)。 函数的当前作用域已解码(namespaces :: classes :: ...)并已正确报告(即,如果我们位于
ns::
或namespace ns{
上下文中,则不会以using namespace ns;
作为前缀。但是:
模板还没有被理解。
功能体是一个接一个地手动构建的-也就是说,我还没有是时候在ctags可能指向我的所有函数声明上执行:GOTOIMPL。
评论
尽管这令人印象深刻(我对vim相当陌生,所以我每天都在发现新事物!),但恐怕这根本不是我所需要的。也许我应该考虑制作自己的插件?看起来很有趣。
–卢卡斯
2015年2月6日,下午3:31
@Lukas您的.vimrc中的映射不能以什么方式解决问题?只需按Ctrl-B,即可自动为您填写头文件。 (在用更新的版本替换头文件之前,我可能应该先清除它的头文件,但是我必须睡觉,所以以后可以这样做。)如果您决定制作一个,请随时通知我。感谢您为提高我的Vim技能而遇到的有趣挑战! ;)
–门把手
2015年2月6日,下午3:52
这似乎在与请求相反的方向上起作用:它从.cpp文件创建头文件。
– 200_success
15年2月6日在18:51
...实际上也不错,但是我认为有些东西无法从定义中得知:例如,声明应该是内联的吗?有默认参数吗?是否应省略参数名称?
–凯尔·斯特兰德(Kyle Strand)
15年8月26日在17:52
@ 200_success啊,您是对的(我不知道为什么我没有早点回复您的评论)。有时间时,我将尝试编辑答案以另一种方式。
–门把手
15年8月26日在18:59