5.4 由接口快速生成实现框架

.h 中写成员函数的声明,在 .cpp 中写成员函数的定义,很麻烦,我希望能根据类声明自动生成类实现的代码框架 —— vim-protodef(https://github.com/derekwyatt/vim-protodef )。vim-protodef 依赖 FSwitch(https://github.com/derekwyatt/vim-fswitch ),请一并安装。请增加如下设置信息:

  1. " 成员函数的实现顺序与声明顺序一致
  2. let g:disable_protodef_sorting=1

protodef 根据文件名进行关联,比如,MyClass.h 与 MyClass.cpp 是一对接口和实现文件,MyClass.h 中接口为:

  1. " 设置 pullproto.pl 脚本路径
  2. let g:protodefprotogetter='~/.vim/bundle/protodef/pullproto.pl'
  3. " 成员函数的实现顺序与声明顺序一致
  4. let g:disable_protodef_sorting=1

pullproto.pl 是 protodef 自带的 perl 脚本,默认位于 ~/.vim 目录,由于改用 pathogen 管理插件,所以路径需重新设置。

protodef 根据文件名进行关联,比如,MyClass.h 与 MyClass.cpp 是一对接口和实现文件,MyClass.h 中接口为:

  1. class MyClass
  2. {
  3. public:
  4. void printMsg (int = 16);
  5. virtual int getSize (void) const;
  6. virtual void doNothing (void) const = 0;
  7. virtual ~MyClass ();
  8. private:
  9. int num_;
  10. };

在 MyClass.cpp 中生成成员函数的实现框架,如下图所示:

5.4 由接口快速生成实现框架  - 图1(接口生成实现)
MyClass.cpp 中我键入 protodef 定义的快捷键 \PP,自动生成了函数框架。
上图既突显了 protodef 的优点:优点一,virtual、默认参数等应在函数声明而不应在函数定义中出现的关键字,protodef 已为你过滤;优点二:doNothing() 这类纯虚函数不应有实现的自动被 protodef 忽略。同时也暴露了 protodef 问题:printMsg(int = 16) 的函数声明变更为 printMsg(unsigned),protodef 无法自动为你更新,它把更改后的函数声明视为新函数添加在实现文件中,老声明对应的实现仍然保留。

关于缺点,先我计划优化下 protodef 源码再发给原作者,后来想想,protodef 借助 ctags 代码分析实现的,本来就存在某些缺陷,好吧,后续我找个时间写个与 protodef 相同功能但对 C++ 支持更完善的插件,内部当然借助 libclang 啦。

另外,每个人都有自己的代码风格,比如,return 语句我喜欢

  1. return(TODO);

所以,调整了 protodef.vim 源码,把 239、241、244、246 四行改为

  1. call add(full, " return(TODO);")

比如,函数名与形参列表间习惯添加个空格

  1. void MyClass::getSize (void);

所以,把 217 行改为

  1. let proto = substitute(proto, '(\_.*$', ' (' . params . Tail, '')