自己动手扩展vim插件——code_complete.vim篇
2012-10-22 15:38
267 查看
自己动手扩展vim插件——code_complete.vim篇
By 马冬亮(凝霜 Loki)
一个人的战争(http://blog.csdn.net/MDL13412)
下图是官方的Demo(函数参数补全功能要配合ctags使用):
利用Ctags生成tags文件(在代码目录下运行,递归解析当前文件夹),代码如下:
自动补全的代码风格跟我们使用的不同(上面的例子已经改为我自己代码风格)。
if else结构、switch结构的分支无法手动指定;
用户自定义函数时,没有函数模板可以使用;
let g:template['c']['ife'] = "if( ".g:rs."...".g:re." )\<cr>{\<cr>".g:rs."...".g:re."\<cr>} else\<cr>{\<cr>".g:rs."...". g:re."\<cr>}" 我们来查看其在vim中的样式:
在if的括号中,条件表达式与括号间有一个空格,这和我们的风格不一致,我们可以按照如下代码进行更改:
let g:template['c']['ife'] = "if (".g:rs."...".g:re.")\<cr>{\<cr>".g:rs."...".g:re."\<cr>} else\<cr>{\<cr>".g:rs."...".g:re."\<cr>}"
注:在VimScript中,字符串可以是"或'形式的字符串,字符串使用.进行连接,\<cr>是键盘上的回车,\用于在字符串中进行转义。查看vim中的按键映射,在vim中使用:help keycode进行查看。let g:template['c']['xxx']中的[xxx]是代码补全的触发序列。
对于其它逻辑结构,主要都是空格与我们的风格不一致,可按以上原则进行定制。
对于扩展后的if else结构,其用法为:
ife[x]<tab> 在插入模式下输入ife,后面接else if()的分支个数,然后按<tab>键展开。
我扩展了0~9的分支情况,下面给出0~3的代码定义:
let g:template['c']['ife0'] = "if (".g:rs."...".g:re.")\<cr>{\<cr>".g:rs."...".g:re."\<cr>} else\<cr>{\<cr>".g:rs."...".
\g:re."\<cr>}"
let g:template['c']['ife1'] = "if (".g:rs."...".g:re.")\<cr>{\<cr>".g:rs."...".g:re."\<cr>} ".
\"else if (".g:rs."...".g:re.")\<cr>{\<cr>".g:rs."...".g:re."\<cr>} ".
\"else\<cr>{\<cr>".g:rs."...".
\g:re."\<cr>}"
let g:template['c']['ife2'] = "if (".g:rs."...".g:re.")\<cr>{\<cr>".g:rs."...".g:re."\<cr>} ".
\"else if (".g:rs."...".g:re.")\<cr>{\<cr>".g:rs."...".g:re."\<cr>} ".
\"else if (".g:rs."...".g:re.")\<cr>{\<cr>".g:rs."...".g:re."\<cr>} ".
\"else\<cr>{\<cr>".g:rs."...".
\g:re."\<cr>}"
let g:template['c']['ife3'] = "if (".g:rs."...".g:re.")\<cr>{\<cr>".g:rs."...".g:re."\<cr>} ".
\"else if (".g:rs."...".g:re.")\<cr>{\<cr>".g:rs."...".g:re."\<cr>} ".
\"else if (".g:rs."...".g:re.")\<cr>{\<cr>".g:rs."...".g:re."\<cr>} ".
\"else if (".g:rs."...".g:re.")\<cr>{\<cr>".g:rs."...".g:re."\<cr>} ".
\"else\<cr>{\<cr>".g:rs."...".
\g:re."\<cr>}"
相信有编程基础的读者已经看出规律了,即有多少个else if分支,就有多少个\"else if (".g:rs."...".g:re.")\<cr>{\<cr>".g:rs."...".g:re."\<cr>} ".
下面我们来看一下switch的演示:
对于扩展后的switch结构,其用法为:
switch[x]<tab> 在插入模式下输入switch,后面接case的分支个数,然后按<tab>键展开。
我扩展了1~9的分支情况,下面给出0~3的代码定义:
通过实例可以看出,使用了函数模板后,减少了我们的输入次数及光标移动次数,很好的提升了编程效率,下面介绍其用法:
f[x]<tab> 在插入模式下输入f,后面接函数参数的个数,然后按<tab>键展开。
下面给出0~3个参数的代码:
let g:template['c']['f0']=g:rs."...".g:re."()\<cr>{\<cr>".g:rs."...".g:re."\<cr>}"
let g:template['c']['f1']=g:rs."...".g:re."(".g:rs."...".g:re.")\<cr>{\<cr>".g:rs."...".g:re."\<cr>}"
let g:template['c']['f2']=g:rs."...".g:re."(".g:rs."...".g:re.", ".g:rs."...".g:re.")\<cr>{\<cr>".g:rs."...".g:re."\<cr>}"
let g:template['c']['f3']=g:rs."...".g:re."(".g:rs."...".g:re.", ".g:rs."...".g:re.", ".g:rs."...".g:re.")\<cr>{\<cr>".g:rs."...".g:re."\<cr>}"
此插件的扩展并不难,读者可以将常用的代码片段扩展进去,提升编码效率。另外,程序员用的编辑器应该具有良好的扩展性:-)
By 马冬亮(凝霜 Loki)
一个人的战争(http://blog.csdn.net/MDL13412)
插件简介
code_complete.vim是一款通用插件,具有用于补全函数参数,插入代码片段等功能。目前插件作者已经将项目迁移到GitHub上进行托管。下图是官方的Demo(函数参数补全功能要配合ctags使用):
插件安装
将code_complete.vim拷贝至~/.vim/plugin目录下。利用Ctags生成tags文件(在代码目录下运行,递归解析当前文件夹),代码如下:
ctags -R --c++-kinds=+p --fields=+iaS --extra=+q --language-force=C++ .将生成的tags文件名改成xxx_tags,拷贝至~/.vim/tags目录中,在~/.vimrc中加入如下代码:
set tags+=~/.vim/tags/xxx_tags
插件使用
此款插件使用非常简单,只需使用<tab>键即可触发相应的功能,下面将详细讲解具体的用法:注释
code_complete插件提供两种风格的注释,一种是/* */形式的标准C语言注释,而另一种是/**< */形式的Doxygen风格的用于在一行后进行注释的文档注释(此插件没有提供自动生成函数文档注释的功能,此功能可以使用更专业的插件DoxygenToolkit.vim来实现)。预处理命令
头文件包含
C语言逻辑结构
主函数
namespace
函数参数补全
插件局限性
通过上面的演示,我们发现了此款插件的一些局限性:自动补全的代码风格跟我们使用的不同(上面的例子已经改为我自己代码风格)。
if else结构、switch结构的分支无法手动指定;
用户自定义函数时,没有函数模板可以使用;
插件扩展
自定义代码风格
下面以if else结构进行说明,我们先查看没有更改前的代码:let g:template['c']['ife'] = "if( ".g:rs."...".g:re." )\<cr>{\<cr>".g:rs."...".g:re."\<cr>} else\<cr>{\<cr>".g:rs."...". g:re."\<cr>}" 我们来查看其在vim中的样式:
在if的括号中,条件表达式与括号间有一个空格,这和我们的风格不一致,我们可以按照如下代码进行更改:
let g:template['c']['ife'] = "if (".g:rs."...".g:re.")\<cr>{\<cr>".g:rs."...".g:re."\<cr>} else\<cr>{\<cr>".g:rs."...".g:re."\<cr>}"
注:在VimScript中,字符串可以是"或'形式的字符串,字符串使用.进行连接,\<cr>是键盘上的回车,\用于在字符串中进行转义。查看vim中的按键映射,在vim中使用:help keycode进行查看。let g:template['c']['xxx']中的[xxx]是代码补全的触发序列。
对于其它逻辑结构,主要都是空格与我们的风格不一致,可按以上原则进行定制。
if else结构和switch结构定制
下面我以if else结构演示我扩展后的插件,代码会在后面给出:对于扩展后的if else结构,其用法为:
ife[x]<tab> 在插入模式下输入ife,后面接else if()的分支个数,然后按<tab>键展开。
我扩展了0~9的分支情况,下面给出0~3的代码定义:
let g:template['c']['ife0'] = "if (".g:rs."...".g:re.")\<cr>{\<cr>".g:rs."...".g:re."\<cr>} else\<cr>{\<cr>".g:rs."...".
\g:re."\<cr>}"
let g:template['c']['ife1'] = "if (".g:rs."...".g:re.")\<cr>{\<cr>".g:rs."...".g:re."\<cr>} ".
\"else if (".g:rs."...".g:re.")\<cr>{\<cr>".g:rs."...".g:re."\<cr>} ".
\"else\<cr>{\<cr>".g:rs."...".
\g:re."\<cr>}"
let g:template['c']['ife2'] = "if (".g:rs."...".g:re.")\<cr>{\<cr>".g:rs."...".g:re."\<cr>} ".
\"else if (".g:rs."...".g:re.")\<cr>{\<cr>".g:rs."...".g:re."\<cr>} ".
\"else if (".g:rs."...".g:re.")\<cr>{\<cr>".g:rs."...".g:re."\<cr>} ".
\"else\<cr>{\<cr>".g:rs."...".
\g:re."\<cr>}"
let g:template['c']['ife3'] = "if (".g:rs."...".g:re.")\<cr>{\<cr>".g:rs."...".g:re."\<cr>} ".
\"else if (".g:rs."...".g:re.")\<cr>{\<cr>".g:rs."...".g:re."\<cr>} ".
\"else if (".g:rs."...".g:re.")\<cr>{\<cr>".g:rs."...".g:re."\<cr>} ".
\"else if (".g:rs."...".g:re.")\<cr>{\<cr>".g:rs."...".g:re."\<cr>} ".
\"else\<cr>{\<cr>".g:rs."...".
\g:re."\<cr>}"
相信有编程基础的读者已经看出规律了,即有多少个else if分支,就有多少个\"else if (".g:rs."...".g:re.")\<cr>{\<cr>".g:rs."...".g:re."\<cr>} ".
下面我们来看一下switch的演示:
对于扩展后的switch结构,其用法为:
switch[x]<tab> 在插入模式下输入switch,后面接case的分支个数,然后按<tab>键展开。
我扩展了1~9的分支情况,下面给出0~3的代码定义:
let g:template['c']['switch1'] = "switch (".g:rs."...".g:re.")\<cr>{\<cr>case ". \g:rs."...".g:re.":\<cr>break;". \"\<cr>default:\<cr>break;\<cr>}" let g:template['c']['switch2'] = "switch (".g:rs."...".g:re.")\<cr>{\<cr>case ". \g:rs."...".g:re.":\<cr>break;". \"\<cr>case ".g:rs."...".g:re.":\<cr>break;". \"\<cr>default:\<cr>break;\<cr>}" let g:template['c']['switch3'] = "switch (".g:rs."...".g:re.")\<cr>{\<cr>case ". \g:rs."...".g:re.":\<cr>break;". \"\<cr>case ".g:rs."...".g:re.":\<cr>break;". \"\<cr>case ".g:rs."...".g:re.":\<cr>break;". \"\<cr>default:\<cr>break;\<cr>}"
函数模板
下面我们先看扩展后的效果:通过实例可以看出,使用了函数模板后,减少了我们的输入次数及光标移动次数,很好的提升了编程效率,下面介绍其用法:
f[x]<tab> 在插入模式下输入f,后面接函数参数的个数,然后按<tab>键展开。
下面给出0~3个参数的代码:
let g:template['c']['f0']=g:rs."...".g:re."()\<cr>{\<cr>".g:rs."...".g:re."\<cr>}"
let g:template['c']['f1']=g:rs."...".g:re."(".g:rs."...".g:re.")\<cr>{\<cr>".g:rs."...".g:re."\<cr>}"
let g:template['c']['f2']=g:rs."...".g:re."(".g:rs."...".g:re.", ".g:rs."...".g:re.")\<cr>{\<cr>".g:rs."...".g:re."\<cr>}"
let g:template['c']['f3']=g:rs."...".g:re."(".g:rs."...".g:re.", ".g:rs."...".g:re.", ".g:rs."...".g:re.")\<cr>{\<cr>".g:rs."...".g:re."\<cr>}"
总结
此插件目前之扩展了C语言,对于C++的扩展尚未完成,扩展后插件的下载地址:http://download.csdn.net/detail/mdl13412/4674025此插件的扩展并不难,读者可以将常用的代码片段扩展进去,提升编码效率。另外,程序员用的编辑器应该具有良好的扩展性:-)
相关文章推荐
- 自己动手扩展vim插件——code_complete.vim篇
- 自己动手扩展vim插件——code_complete.vim篇
- 自己动手扩展vim插件——配色篇
- 自己动手扩展vim插件——配色篇
- 扩展vim插件 - code_complete.vim
- .NET实现之(自己动手写高内聚插件系统)
- .NET实现之(自己动手写高内聚插件系统)
- VIM 编写 code 很强大的插件
- 自己动手实现一个Android Studio插件
- 自己动手为gaim写个闪屏插件
- 自己动手写Java大整数《4》扩展欧几里得和Mod逆
- 用vim-addon-manager配置插件锻造自己的vim
- 查看vim 的启动过程。 确定自己vim 插件的存放位置
- 自己动手写js分享插件 [支持https] (可以分享QQ空间,微信,新浪微博。。。)
- 自己动手开发一个Xcode插件
- 【自己动手】sublime text插件开发
- 自己动手写jQuery插件---Tip(提示框)
- .NET实现之(自己动手写高内聚插件系统)
- 自己动手丰衣足食之Easyform表单验证插件&validate.js实时验证
- 自己动手实现一个Android Studio插件