随笔 - 119  文章 - 290  trackbacks - 0

博客搬家了哦,请移步
叫我abc

常用链接

留言簿(12)

随笔分类

我的博客

搜索

  •  

积分与排名

  • 积分 - 302361
  • 排名 - 84

最新评论

阅读排行榜

今天一直想找一个vim插件,功能是在头文件声明了一个函数后,可以通过简易的操作在对应的cpp文件中生成这个函数的无实现定义。
没能找到自己想用的那种,其中一个csupport,通过交互输入类名和函数名在当前缓冲插入函数定义,弱爆了;另一个snipemate,是将预先定义的模板复制到当前缓冲区,类似与预定义的代码补完,东西不算坏,但不是我想要的那种。
理论上应该有完成这种任务的vim插件,可惜插件库实在太庞大了,随便google几下大海捞针,决定自己动手,丰衣足食。

基本思路如下:

  • 取当前行作为函数声明行,然后通过正则表达式去掉virtual等修饰符。
  • 往前搜索第一个class关键字,能读到的话,通过正则表达式提取出类名,然后和函数声明结合起来,形成一个函数定义。
  • 取出当前文件的缓冲名,通过正则表达式去掉文件名上的目录和.h后缀,然后拼成对应的cpp文件。
  • 在缓冲区里搜索生成的cpp文件,搜索到后将函数声明追加到该文件中。
  • c.vim插件下载
    posted on 2011-12-05 21:03 LOGOS 阅读(2777) 评论(1)  编辑 收藏 引用

    FeedBack:
    # re: vim插件:快速生成函数定义 2012-01-03 18:55 wzcsoft
    不错,简单,能用。 不过我这里一般这样声明函数:

    virtual int funcName(xxx xxx,
    xxx xxxx,
    xxxx* xxxx);
    函数声明会有多行,这时候这个插件不能正常工作。

    再就是生成的函数定义里面的返回值感觉不是很爽,像刚才那个函数里面会有个return int(), 而且不带缩进,感觉不是很实用

    我留改了一下,主要加了个处理函数多行声明的功能:

    2,4c2
    < let a:curline = line(".")
    < let a:lines = getline(a:curline, search(';'))
    < let a:ln = join(a:lines, "\n")
    ---
    > let a:ln = getline(".")
    9d6
    <
    14c11
    < let a:fname = substitute(a:ln, '\([a-zA-Z]\+\s\+\)*\(.*\)', '\1'.a:class.'::\2', '')
    ---
    > let a:fname = substitute(a:ln, '\([a-zA-Z]\+\s\+\)*\(.*\)', '\1'.a:class.'::\2', '')
    16c13
    < endif
    ---
    > endif
    22c19
    < let a:datas += split(a:ln, "\n")
    ---
    > let a:datas = add(a:datas, a:ln)
    23a21,24
    > let a:type = substitute(a:ln, '\([a-zA-Z]\+\)\s\+.*', 'return \1();', '')
    > if a:type != a:ln
    > let a:datas = add(a:datas, a:type)
    > endif
    27c28
    < " execute 'e '.a:cppname
    ---
    > execute 'e '.a:cppname


      回复  更多评论
      

    只有注册用户登录后才能发表评论。
    网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理