Qt如何使文件重新格式化

本文也可以作为Uncrustify的设置向导。

作为一个程序员,就会经历各种令人痛心疾首的问题。有时候需要经手别人的代码,有人喜欢命名全部小写,有人喜欢下划线命名法;有人的tab是三个空格,有人的tab是一个四格的缩进......

在这种恶劣的环境下,只有能忍受所有编码风格的程序员才能生存下来。

但如果真的是只能如此,那这个世界上的程序员估计就所剩无几了。

好在,我们能非常快捷地使文件格式化

在Visual Studio、Intellij Idea这种大型的IDE中都能够设置诸如此类的快捷键,不深入研究。这里要说的是Qt中代码格式化的操作方法。

Qt是跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器,是一个非常优秀的IDE,我个人非常喜欢。但是我发现了一个问题,Qt自带的快捷键并不能使代码格式化。点击菜单栏中的工具->选项->环境->键盘中,我们可以找到一个有关代码格式化的快捷键设置项,如下图所示:

Qt如何使文件重新格式化

但是设置后会发现怎么使用都没有用。但是我们不能就这样放弃啊!否则程序员就要灭绝了!

经历千难万险,我终于找到了解决方法。

这里我们要用的插件是——

Uncrustify

首先需要做一个准备工作。打开Qt,点击菜单栏中的帮助->关于插件,将Beautifier后面的勾点上,如下所示:

Qt如何使文件重新格式化

这里要注意,如果你没有Beautifier这个选项,那么你可能要升级你的Qt到最新版。

它提示需要重启,我们就重启一下,然后点击菜单栏中的工具->选项,发现左边的工具栏里多出了一个高跟鞋,界面如下:

Qt如何使文件重新格式化

根据上面的选项卡可以看出,Qt的Beautifier支持三种插件,分别是Artistic Style、Clang Format和这里要讲的Uncrustify。选择这个是因为它的设置方法相对简单。

下载方式:能*的话可以从Sourceforge下载,否则可以尝试从github上下载,但我下载这个非常慢,半天也下载不了,不知道为什么,这里贴出下载链接:Github

二者的内容应该是一样的,而且更新非常频繁,Sourceforge上甚至可以订阅他们的邮件以随时获得最新版本的Uncrustify,操作方法就是直接点击如下页面中的Get Updates,再填入邮箱即可。

Qt如何使文件重新格式化

下载以后解压,然后进入刚才Beautifier的选项页面,点击Uncrustify选项卡中的浏览,选择解压出来的uncrustify.exe文件,单机确定。

现在,我们再进入快捷键设置页面。点击菜单栏中的工具->选项->环境->键盘,可以发现多了很多可以设置的选项。由于我们使用的是Uncrustify,所以这里修改Uncrustify中的FormatFile快捷键,如下所示:

Qt如何使文件重新格式化

点击应用并确定。

还没完!

我们先来测试一下。新建一个C++工程,随便写一段程序,然后使用格式化快捷键,会发现下面跳出了一行报错:

Running Windows Runtime device detection.

No winrtrunner.exe found.

Error in Beautifier: Cannot get configuration file for Uncrustify.

意思是找不到配置文件。原来Uncrustify可以同时设置多种格式,它提供了一些现成的,也可以让我们自己配置。

我们打开Uncrustify的安装文件,进入 cfg 目录,会发现有众多 .cfg 文件,支持各种不同的语言和系统。这里我选择对default.cfg 进行修改,以满足我个人的编程喜好。为什么选择它?因为它的文件大小最大。

使用文本编辑器打开这个cfg文件,会发现里面有众多的配置项,而且都有英文解释,下面将挑选一些常用的组合进行说明。需要注意的是,很多的参数之间会有联系,有时候只修改一个参数可能会没有任何效果,或是效果超出预期。这里需要重视我之后将提到的参数之间的关联。

修改换行格式

参数名: newlines

早期的Mac使用的是回车(CR),后来换成了Linux使用的换行(LF)。而Windows推出的换行格式为回车换行(CRLF)。听上去很强,但是建议不要尝试,不知道是不是BUG,反正如果在这里设置成CRLF会发生很可怕的后果。

建议:auto。

修改tab的形式

参数名: input_tab_size output_tab_size indent_columns indent_with_tabs

input_tab_size不知道是干嘛的,怎么设置都没用。output_tab_size跟代码中的缩进有关,但是也不知道具体是什么,经过测验感觉跟tab大小成反相关。想要详细了解就需要查看Github中的源代码,这里的建议直接给出“将tab修改为4个空格”的设置方式。

建议:8、8、4、0。

修改转义符

参数名: string_escape_char

这里的参数的值应填写想要设置的转义符号的ASCII值。绝大多数语言是“\”(92)或“^”(94)。

建议:92。

特殊字符编码的处理方法

参数名: utf8_byte

如果是true,那么在一个文件中如果包含了值在128~255之间的字节,如果它不是用utf-8编码的,那么按照utf-8编码格式来处理它。这个只有在特殊领域才有用,一般情况下很难碰到这样的情况。

建议:false。

强制输出编码为utf-8

参数名: utf8_force

它可以强制程序的任何输出都为utf-8,对于不愿意花精力在处理编码格式上的程序员很有用。但是个人觉得还是不要依赖这个工具,否则到时候程序出了问题,谁能想到问题是出在这个配置文件上呢?

建议:false。

在加号、减号等运算操作符两边添加空格

参数名: sp_arith  等。

个人觉得 x = y + z 要比 x=y+z 好看一点。可能在博客里没有很强烈的感觉,但是在代码里,添加空格的方式会使代码非常清晰。这个参数的add和force在实际测试中好像没有什么区别。类似功能的参数还有 之后几个“sp_”开头的字段,有一些是负责重载的,也就是更精细地对不同符号进行设置,有些是对不同的版本进行配置,还有的是可以单独设置符号前或符号后的空格,可以自行研究。

建议:add。

这里可以设置的空格添加位置有:"+", "-", "*", "/", ">>>", "<<", ">>", "%", "|", "=", "+=", etc, ":", "##", "#", "&&", "||", "<", ">", "==", etc, "(", ")", "((", "))", ")(", "()", "{", "}", 指针"*", "&", "|", "if", "for", etc, "[", "]"等等等等太多了,个性化能力非常强,自行研究吧!

总之,这个插件的设置非常灵活,包含了上千个项目,并且还在不断更新,你能想到的应有尽有。以后可以专门做一篇研究这个插件的文章。

回到主题!

当我们将一切的参数设置好以后,保存我们的cfg文件,然后进入刚才Qt中Beautifier的选项页面,点击Uncrustify选项卡中Options组里的浏览,选择刚才编辑过的配置文件,再将复选框勾上,如下图所示:

Qt如何使文件重新格式化

这样就算配置完成了!

我们来用一个简短的代码测试一下:

Qt如何使文件重新格式化

点击Ctrl+Alt+L,也就是我设置的快捷键,代码就被重新格式化了。

Qt如何使文件重新格式化

这样,Qt也可以被漂亮地格式化啦!