2010年七月月 发布的文章

使用astyle美化代码

昨天一位同事发了一篇小文档,文档中介绍了一种开源格式化代码的工具,名为Artistic Style(astyle),功能看起来还是很不错的。之前我写代码时比较注意代码的风格,一直按照自己的思路来美化自己的代码,用的最多的辅助工具就是Vim自带的indent功能,对这之外的格式化工具少有涉猎。记得几年前部门曾推广一款名为checkstyle的Java代码格式规范检查工具,由于当时基本不接触Java,也没有用过。

今天被问及该工具是否可以在组内推广,遂又花心思想了一下。看了同事的介绍文档,感觉astyle还是很实用的,特别是对现存遗留的格式不规范的代码文件,可批量做转换(之前我都是修改哪个源文件时顺便对格式进行美化,浪费了我不少精力) 但是如何能被大家接受和使用起来,这还是一个问题。最开始想到的是让astyle与svn结合在一起,对开发人员保持透明。通过svn hooks来自动完成对代码的格式化。不过细致研究后发现,这样是有问题的。如果在svn server端增加svn pre-commit hook来调用astyle对提交的代码进行格式化,那么这势必可能导致开发人员提交后的server端代码与其Local copy不一致;如果开发人员不知情,后续就会导致进一步的代码不一致问题。另外在svn官方manual中似乎也不推荐在svn pre-commit hook中修改提交的文件内容,好像是会破坏svn commit事务(导致本地和服务器端的一些对文件的统计不一致)。又考虑在客户端svn hook,可查来查去才发现目前只有TortoiseSVN的实现支持客户端hook,遂放弃。

让大家直接执行astyle,显然是高估了大家的执行力了。遂想到还是将astyle与Vim集成在一起吧。

步骤如下:
1、编译artistic style源码,将astyle的可执行程序放到某个目录X下,并将目录X放到path中(ubuntu上可用sudo apt-get install astyle安装)
2、编辑.vimrc,添加一行map :%! astyle  (Shift+F 注:在当前缓冲区用astyle美化缓冲区中的内容,并输出结果到当前缓冲区中)
3、定义模板option文件,位置:$HOME/.astylerc

以下是一个.astylerc的例子:
# my astyle options file

–indent=spaces=8
–brackets=attach
–indent-switches
–indent-cases
–indent-labels
–indent-preprocessor
–indent-col1-comments
–pad-oper
–pad-header
–unpad-paren
–add-brackets
–keep-one-line-statements
–align-pointer=name
–mode=c
–min-conditional-indent=0

按照以上方式集成astyle到vim中有一个缺点:就是每次美化都是针对当前缓冲区(一般就是一个文件)。无法做到对某几行或一块区域进行代码美化。

后在stackoverflow上发现有一人提出这样的方案:在.vimrc中增加一行:autocmd BufNewFile,BufRead *.c set formatprg=astyle\ -T4pb。最初以为这样设置是使用astyle替换vim内置的c indent格式化工具,遂照猫画虎配置后用"="命令进行测试,发现无法格式化;遂花时间研读Vim手册,终于发现是我的理解错了。formatprg这个option是与gq命令联系在一起的,而非关联"="命令。以前的确不怎么使用gq命令,而是一直用c indent("=")来做所谓的格式化操作。利用对formatprg这个option的设置可以做到利用外部工具对vim当前文本buffer做格式化的目的。因为之前已经配置了$HOME/.astylerc,所以在.vimrc中增加一行:autocmd BufNewFile,BufRead *.c set formatprg=astyle,去掉了-T4pb这几个参数。

生效.vimrc后使用gq命令对.c文件进行测试,果然有效。gq命令不仅支持对Whole Buffer进行filter,而且可以对单行、多行以及对块文本进行格式化过滤,比如:
NORMAL模式下: gggqG 即对Whole Buffer进行格式化过滤;
 gqG  对从当前行到末尾行之间的文本进行格式化过滤;
 gq+1 对下一行文本进行格式化过滤;
 gqj  对当前行和下一行文本进行格式化过滤;

与Vim结合在一起最大的好处是:astyle被透明的引入到我们日常开发过程中了,你的工作量并未因astyle的引入而增加,反而astyle却提升了你的工作效率,不是吗?

果果会翻身了

果果,我宝宝的小名。之前我给宝宝起的诸多小名均被LP大人一一否决了。后来有一天下班回家,LP说给宝宝起了个小名,叫“果果”。我觉得还行,也就这样叫开了。后来看徐峥和王宝强主演的“人在囧途”,发现片中李成功的孩子小名也叫果果,也许只是巧合^_^。

上个周末和部门同事一起到北戴河游玩,在旅游结束回城的路上收到了LP的短信,说是:果果会翻身了。看到短信后心里很是高兴,宝宝身体很结实,刚刚70多天就会翻身了。宝宝平时很喜欢趴着,之前宝宝也一直在尝试翻身,可总是功败垂成,就差那么一点点,我只要轻轻推一下,宝宝就可以顺利翻过去,不过我还得帮她把小手从身下拿出,这次宝宝不仅可自己翻身,而且还可以自己将手从身下抽出了^_^。

宝宝马上就要三个月了,宝宝的成长速度还是很快的,当初还觉得很大的婴儿床,现在看来都有些空间不足了,特别是看着宝宝顽皮的在床里翻来翻去,觉得床更小了。


小家伙会翻身了,头也抬得很高

顺便说说北戴河旅游,我们周六上午出发,中午到北戴河,下午到北戴河海滩自由活动;第二天乘车到南戴河国际娱乐中心,完了一上午,下午回城。总体来说北戴河的沙滩很是让人失望,但是南戴河无论是沙滩还是娱乐设施都很不错,滑草、滑艇、过山车都值得排队去玩,所以建议大家如果要去玩,就直接去南戴河,北戴河不去也罢。


滑草速度很快,很刺激


我目前玩过的最长距离、最高落差之水上滑艇,足足花了我两个小时排队

今天联系了一家影楼,准备给宝宝拍“百日照”,时间过得真快啊!

阿根廷出局,世界杯结束!

阿根廷以耻辱性的比分惨淡出局,我想这是所有阿迷都不曾预料到的。成王败寇,输了就是输了,技不如人,无话可说。与德国足球相比,阿根廷足球所输掉的可不仅仅是这一场比赛这么简单,阿根廷在足球人才培养、足球体系建设和管理等方面都全面落后于欧洲强国了。现在的足球再也不是马拉多纳巅峰时靠一人之力就可以捧起大力神杯的时代了,也许这届世界杯的失利能让阿根廷人彻底醒悟。

失败的苦果只能靠时间来慢慢消化了。四年后世界杯回归南美大陆,我钟爱的阿根廷队和梅西依旧值得期待。希望四年后的阿根廷队能够准备的更加充分,希望那时的梅西能更加成熟、更加坚韧。

之前曾经说过,阿根廷出局,世界杯就结束,这里我不得不和2010南非世界杯说BYE-BYE了。也许此时只有我那还在熟睡中的宝宝才能给我带来心灵上的安慰。




这里是Tony Bai的个人Blog,欢迎访问、订阅和留言!订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您希望通过微信捐赠,请用微信客户端扫描下方赞赏码:


如果您希望通过比特币或以太币捐赠,可以扫描下方二维码:

比特币:


以太币:


如果您喜欢通过微信App浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:



本站Powered by Digital Ocean VPS。

选择Digital Ocean VPS主机,即可获得10美元现金充值,可免费使用两个月哟!

著名主机提供商Linode 10$优惠码:linode10,在这里注册即可免费获得。

阿里云推荐码:1WFZ0V立享9折!

View Tony Bai's profile on LinkedIn


文章

评论

  • 正在加载...

分类

标签

归档











更多