前言
代码格式化是提高代码质量和可读性的重要手段之一。然而,在Keil MDK5中并没有内置代码格式化工具,因此需要寻找第三方工具来解决这个问题。开源的代码格式化工具Astyle能以插件的形式集成到Keil中以满足我们对代码格式化的需求。
本文将详细介绍如何下载、配置Astyle,并在Keil中设置Astyle,以及使用快捷键调用Astyle的方法。
一. Astyle介绍
Astyle官网:https://astyle.sourceforge.net/
Artistic Style 是一种用于 C、C++、C++/CLI、Objective-C、C# 和 Java 编程语言的源代码缩进器、格式化程序和美化程序。它用 C++ 编写,可以从命令行中使用,也可以被嵌入到另一个程序中作为库。选项可以从命令行或选项文件中输入。库版本可以从用其他语言编写的程序中调用。
Artistic Style 为开源软件,可以在 MIT 许可证下使用和分发。MIT 许可证是一种对软件使用最少限制的宽松许可证。它与 GNU 通用公共许可证 (GPL) 和大多数其他许可证兼容。
从官网可以进入Astyle的文档和下载界面。
二. Astyle常用配置
此节完全参考Astyle的Documentation,但仅列出了我了个人感兴趣的关于C语言的配置选项,对于其它的C语言配置选项以及其它语言配置选项均未列出,对全部配置选项感兴趣的同学可去官网看文档。
2.1 Brace Style Options(花括号样式选项)
1.–style=allman / --style=bsd / --style=break / -A1
Allman样式使用折行的大括号。
2.–style=java / --style=attach / -A2
Java样式使用紧挨着的大括号。
3.–style=kr / --style=k&r / --style=k/r / -A3
Kernighan & Ritchie样式使用Linux风格的花括号。命名空间、类和函数定义的左花括号是单独一行的。花括号与其他所有内容都相连,包括函数内的数组、结构、枚举和语句。
使用k&r选项可能会因为&符号而导致问题。可以通过将k&r用引号括起来(例如 ‑‑style=“k&r”)或使用其中一个备选项(‑‑style=kr或‑‑style=k/r)来解决此问题。
4.–style=1tbs / --style=otbs / -A10
"One True Brace Style"使用Linux风格的花括号,并且对没有花括号的单行条件语句添加花括号。命名空间、类和函数定义的左花括号是单独一行的。花括号与其他所有内容都相连,包括函数内的数组、结构、枚举和语句。
4种风格的对比如下图所示。我个人更偏爱1tbs样式。
2.2 Tab Options(Tab选项)
默认选项:–indent=spaces=4或者-s4,意思是用4个空格替代Tab,所以这部分保持默认即可,无需设置。
2.3 Brace Modify Options(大括号修改选项)
1.–attach-closing-while
将“do-while”循环语句的“while”附加到关闭大括号上。此选项比大括号样式和“break closing braces”选项具有更高的优先级。
2.4 Indentation Options(缩进选项)
1.–indent-preproc-define
定义多行define的缩进。
2.–indent-col1-comments / -Y
缩进以第一列开头的C++注释。默认情况下,C++中以第一列开头的注释被视为注释掉的代码并不进行缩进。使用此选项可以使这些注释与代码一起进行缩进。
2.5 Padding Options(填充选项)
1.–break-blocks / -f
在控制块周围添加空行(例如,‘if’,‘for’,‘while’…)。
2.–pad-oper / -p
在运算符周围插入空格填充。这也会在逗号周围添加空格。任何行尾注释将尽可能保留在原始列中。请注意,没有取消填充的选项。一旦填充了,它们就保持填充状态。
3.–pad-comma / -xg
在逗号后插入空格填充。如果使用pad-oper,这不是必需的。任何行尾注释将尽可能保留在原始列中。请注意,没有取消填充的选项。一旦填充了,它们就保持填充状态。
4.–pad-header / -H
在头部(例如,‘if’,‘for’,‘while’…)和随后的括号之间插入空格填充。任何行尾注释将尽可能保留在原始列中。这可以与unpad-paren一起使用,以删除不需要的空格。
5.–unpad-paren / -U
删除括号内外的额外空格填充。任何行尾注释将尽可能保留在原始列中。此选项可以与上面的paren padding选项pad‑paren、pad‑paren‑out、pad‑paren‑in和pad‑header组合使用。只会移除其他选项未请求的填充。
例如,如果源代码中的括号内外都有填充,而您只想保留内部填充。您需要使用unpad-paren来删除外部填充,然后使用pad‑paren‑in来保留内部填充。仅使用pad‑paren‑in可能不会删除外部填充。
6.–delete-empty-lines / -xe
删除函数或方法中的空行。函数或方法外的空行不会被删除。如果与break-blocks或break-blocks = all一起使用,则将删除除break-blocks选项添加的行之外的所有行。
7.–align-pointer=name / -k3
将指针或引用运算符(*,&或^)靠近变量名称,这是更优秀的C语言风格,特别是在同一行声明多个变量时,更加清晰。
2.6 Formatting Options(格式化选项)
1.–break-one-line-headers / -xb
从与语句位于同一行的语句中断一行标题(例如,‘if’,‘while’,‘else’,…)。如果语句被大括号括起来,则大括号将根据请求的大括号样式进行格式化。
如果请求keep-one-line-statements,则不会中断多语句行。如果请求keep-one-line-blocks并且标题包含在块中,则不会中断一行块。
2.–add-braces / -j
向未加括号的一行条件语句(例如,‘if’,‘for’,‘while’ …)添加大括号。语句必须在单行上。大括号将根据请求的大括号样式添加。如果没有请求样式,则将添加大括号。如果选择–style=1tbs 则此选项可不需要。
如果请求keep-one-line-statements,则不会向多语句行添加大括号。如果请求keep-one-line-blocks,则不会向一行块添加大括号。如果与–add-one-line-braces一起使用,则结果将是一行括号。
3.–max-code-length=# / -xC#
max-code-length选项将在代码超过#个字符时中断该行。有效值为50到200。没有逻辑条件的行将在逻辑条件(||,&&,…),逗号,括号,分号或空格上中断。
某些代码不会被中断,例如注释、引号和数组。如果与keep-one-line-blocks或add-one-line-braces一起使用,则不会中断块。如果与keep-one-line-statements一起使用,则如果行超过最大长度,语句将在分号处中断。如果在最大代码长度内没有可用的断点,则该行将在最大代码长度后找到第一个可用的断点处中断。
建议设置为–max-code-length=120。
三. Astyle无法实现的效果
1.无法实现两个短行拼成一个长行的效果。
2.无法去除非括号内多余的空格
其它无法实现的效果(待补充)…。
总的来说Astyle的代码格式化功能还是不那么完善,格式化效果Clang-foramt,它的主要优势是使用起来比较简单方便。
四. 在Keil中设置Astyle
解压下载得到的安装包,将其放到Keil安装目录中,如F:\Keil_v5\,如下图所示。
打开Keil,Tools -> Customize Tools Menu…,
在Command(命令)行中填入astyle.exe的绝对路径。
在Arguments(参数)行中填入配置选项,如下:
!E --style=1tbs --indent-col1-comments --break-blocks --pad-oper --pad-comma --pad-header --unpad-paren --delete-empty-lines --align-pointer=name --break-one-line-headers --add-braces --max-code-length=120
在文章中不方便复制的同学可以关注我的公众号:徐晓康的博客,回复以下四位数字获取配置。
3567
建议复制过去不会码错字!
设置完之后,就可以通过Tools -> Astyle Current File,来调用Astyle格式化当前文件,如下图所示。
注意,必须先Ctrl + S保存更改后再调用Astyle,否则调用是无效的。
如果想更方便的调用Astyle,可以设置快捷键,方法如下:
Edit -> Configuration…,打开配置窗口,在Shorteut Keys界面找到Tools:Astyle Current File,点击Create Shortcut,输入想设置的快捷键即可。
徐晓康的博客持续分享高质量硬件、FPGA与嵌入式知识,软件,工具等内容,欢迎大家关注。