利用vim(gvim)的正则表达式实现代码自动匹配完成(等号两边数据交换)
这几天在写一个项目,其中有用到打包和解包的网络通信,相信有过网络编程经验的朋友应该都知道,无非就是 将一个结构体打包成一段buff,以及反向的过程。(这里我们不考虑直接memcpy的情况,因为结构体里的字段有可能只是指针,当然如果都是定长数据的话,那么memcpy当然是最快的)
而在这个过程中,很多代码只是改了很少一部分,但是却要分别写两个函数,严重浪费了人力,而且容易出错。现在让我们看一下,能否用vim来替我们自动完成这件枯燥的事情。
我们来看这样一段示例代码:
int Output(unsigned int ver,char*& buf,int& iLen,int iMaxLen)
{
int needLen = sizeof(char)*3+sizeof(short)+sizeof(int);
if(needLen>iMaxLen)
{
return FBErrSystemNoMem;
}
char *t_Buff = buff;
*(unsigned char*)t_Buff = placeId;
t_Buff+=sizeof(unsigned char);
*(unsigned char*)t_Buff = bitmap;
t_Buff+=sizeof(unsigned char);
*(unsigned short*)t_Buff = cId;
t_Buff+=sizeof(unsigned short);
*(unsigned char*)t_Buff = harvestTimes;
t_Buff+=sizeof(unsigned char);
*(unsigned int*)t_Buff = plantTime;
t_Buff+=sizeof(unsigned int);
iLen = t_Buff - buff;
return 0;
}
而,我们希望能够自动生成这样一个对应代码:
int Input(unsigned int ver,char *buf,int& iLen,int iMaxLen)
{
int needLen = sizeof(char)*3+sizeof(short)+sizeof(int);
if(needLen>iMaxLen)
{
return FBErrSystemNoMem;
}
char *t_Buff = buff;
placeId = *(unsigned char*)t_Buff;
t_Buff+=sizeof(unsigned char);
bitmap = *(unsigned char*)t_Buff;
t_Buff+=sizeof(unsigned char);
cId = *(unsigned short*)t_Buff;
t_Buff+=sizeof(unsigned short);
harvestTimes = *(unsigned char*)t_Buff;
t_Buff+=sizeof(unsigned char);
plantTime = *(unsigned int*)t_Buff;
t_Buff+=sizeof(unsigned int);
iLen = t_Buff - buff;
return 0;
}
仔细观察就会发现,实际就是 *(unsigned char*)t_Buff = placeId; 这样的赋值语句等号左右两边的数据换一下~
OK,那么现在就好做啦,vim的脚本如下:
%s/\(^\s*\)\(.*[^+]\) = \(.*\);$/\1\3 = \2;/gc
实际上很简单,首先将
*(unsigned char*)t_Buff = placeId;
这一句分段匹配,即最前面的空白部分是\1,等号左边(不包括紧挨等号左边的空格)是\2,等号右边(不包括紧挨等号右边的空格);之前是\3,所以只要替换成
\1\3 = \2;
即可啦,等号两边的空格是因为之前并没有匹配空格进去,所以为了美观,在等号两边分别加了个空格。
结果截图如下:
OK,正在写代码呢,突然觉得这个命令很有用,所以就放在这里啦,希望对大家也有用处~~~
建议继续学习:
- vim几个小技巧(批量替换,列编辑) (阅读:35698)
- 简明Vim练级攻略 (阅读:20529)
- Vim下的代码自动补全和代码跳转阅读 (阅读:14216)
- 为什么要用 Emacs/Vim,而不是任何其他编辑器 (阅读:12026)
- 在vim(gvim)中运行终端(对,你没有看错,我也没有写反) (阅读:9287)
- vim入门,进阶与折腾 (阅读:9028)
- 让vim在终端下的配色亮起来! (阅读:8530)
- 最近总结的一些技巧(vim,python,svn,fiddler等) (阅读:6931)
- vim的复制粘贴小结 (阅读:6393)
- Vim 中截取部分内容保存到其他文件 (阅读:6275)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:Dante 来源: Vimer
- 标签: vim 匹配
- 发布时间:2010-01-13 21:39:01
- [12] 手机客户端交互适配设计之我见
- [10] 谈谈Facebook的聊天系统架构
- [10] 一个 VLA (可变长度数组)的实现
- [9] 一句话crontab实现防ssh暴力破解
- [9] 四年前的今天,我开始找工作
- [9] PDC 2010:C#与Visual Bas
- [9] Python连接 MySQL 数据库的超时问
- [9] Oracle bbed工具的编译
- [9] 长假,回忆小时候的家庭教育点滴
- [9] 产品设计之QQ邮箱登录页与淘宝登录页