标签 开源 下的文章

使用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却提升了你的工作效率,不是吗?

Thunderbird跨平台共享邮件设置

对于我个人来说,将工作环境切换到Ubuntu上来有几个“坎儿”要迈过,其中最为迫切的一个就是Mail如何在Windows和Linux下共享的问题,今天我找到了解决方法。

Thunderbird和Firefox一样,都来自Mozilla组织。和Outlook等软件不同的是,Thunderbird是可以跨平台的,更有甚者,Thunderbird可以帮助我们在Windows和Linux共享邮件,当然需要作简单设置。

我的机器上安装了三系统:WinXP、Ubuntu 9.10Slax,其中常用的是WinXP和Ubuntu。在Windows上最常用的Mail Client端软件为Outlook 2003,但Outlook是收费软件,不支持夸平台,更谈不上Mail跨平台共享。而这些恰恰是Thunderbird吸引眼球之所在。

所谓的跨平台共享邮件是指计算机上只存储一份Mail Data,而你在该计算机上所安装的不同OS上都有某个特定应用可以正确存取该数据文件,这样带来的方便是很大的。Thunderbird就是这样的一个特定应用,它可以被安装在不同的OS上,并且可以在不同OS上运行并正确存取同一份Mail Data文件。

以我自己的本子为例,记录一下如何进行共享邮件设置:
首先,分别在Windows和Ubuntu下面下载并安装最新中文版本的Thunderbird(目前是2.0.0.23)。
在某个OS上运行并配置Thunderbird,这里我是在Windows上进行配置的。这里有一个注意事项,那就是你的mail数据的存储位置的选择。在“帐号配置”的“服务器”配置标签中,找到“本地目录”配置项,这个配置项将决定了Thunderbird将Mail Data存储在什么位置。如果你要在Windows和Ubuntu之间共享这个Mail Data,那么就需要让Windows和Ubuntu都能看得到、访问得到这个文件。我这里选择在一个FAT32分区上存储Mail数据。

配置完Mail帐户,Thunderbird默认会在C:\Documents and Settings\[username]\Application Data\Thunderbird\Profiles\xxxxxxxx.default中存储该帐户的配置信息。为了能在两个OS间共享Mail Data,我们就需要让这个配置在两个OS上都能发挥作用。

我们将该配置文件移动到一个FAT32分区上,比如这里以E:\Thunderbird_profile为例,将xxxxxxxx.default移动到E:\Thunderbird_profile目录下。这时你要是启动Thunderbird,那么Thunderbird就无法找到该配置文件了。但是我们需要Thunderbird找到并读取该配置文件,怎么做呢?我们需要修改另外一个文件,在Windows上这个文件就是C:\Documents and Settings\[username]\Application Data\Thunderbird\profiles.ini。

初始的profiles.ini文件内容如下:
[General]
StartWithLastProfile=1

[Profile0]
Name=default
IsRelative=1
Path=/Profiles/xxxxxxxx.default

其中IsRelative用来指示Path这个字段配置的是相对路径还是绝对路径,默认是相对路径。由于我们已经将配置数据移动到E:\Thunderbird_profile目录下了,那么我们就不能在使用相对路径了。修改结果如下:
[General]
StartWithLastProfile=1

[Profile0]
Name=default
IsRelative=0
Path=E:\Thunderbird_profile\xxxxxxxxx.default

启动Windows上的Thunderbird,该配置被正确读取,收发Mail正常。

切换到Ubuntu下面,同样道理,你需要修改profiles.ini文件,该文件在~/.mozilla-thunderbird下面,修改方式与Windows上相同。不同的是Path字段要配置成Linux格式的路径。

启动Ubuntu下的Thunderbird,哇,一切与Windows上的Thunderbird一模一样。你可以看到全部的在Windows上收到和发送出去的那些邮件。

共享Mail设置成功!

后记:你在ubuntu下按上面所描述的完成配置后启动thunderbird,如果你得到的是一个对话框:"Thunderbird is already running, but not responding. To open a new
window you must close the existing thunderbird process, or restart your
system",这种情况多是因为你的Windows分区没有被自动挂载。我在Ubuntu 9.10和10.04两个系统上都遇到了这种情况。简单处理方法:进入计算机,双击Mail Data和Mail配置所在的那个Windows FAT32分区逻辑盘,Ubuntu会自动将之挂载。其后你再启动Thunderbird,一切就OK了。这种登录后手动挂载的方法分区挂载点为/media/xxx,其中xxx是一个类似UUID的字符串,不那么具有可读性。如果你想通过设置fstab来让Ubuntu在启动后就自动挂载分区,那你可要小心了,自动挂载的分区下的文件和目录的owner和group都是root,这样你正常启动thunderbird依旧会得到那个对话框。你可以尝试使用sudo thunderbird启动; 或改变文件和目录的owner和group;或钻研一下fstab的设置,以达到自动挂载后就有普通用户访问权限。另外自动挂载还涉及到字符编码问题,稍有不慎你就会看到被挂载分区内大量以中文乱码为名字的文件。

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言精进之路1 Go语言精进之路2 Go语言编程指南
商务合作请联系bigwhite.cn AT aliyun.com

欢迎使用邮件订阅我的博客

输入邮箱订阅本站,只要有新文章发布,就会第一时间发送邮件通知你哦!

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

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

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

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

比特币:

以太币:

如果您喜欢通过微信浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:
本站Powered by Digital Ocean VPS。
选择Digital Ocean VPS主机,即可获得10美元现金充值,可 免费使用两个月哟! 著名主机提供商Linode 10$优惠码:linode10,在 这里注册即可免费获 得。阿里云推荐码: 1WFZ0V立享9折!


View Tony Bai's profile on LinkedIn
DigitalOcean Referral Badge

文章

评论

  • 正在加载...

分类

标签

归档



View My Stats