astyle是一个我自己常用的开放源码工具。它可以方便的将程序代码格式化成自己想要的样式而不必人工修改。本来嘛,作为高等生物应该优先去做一些智慧的事情,而不是把时间消耗在机器可以完美完成的事情上。
想要立刻开始?请先去主页下载最新版本。可以选择二进制版本,也可以下载源码自行编译。总之得到可执行文件后请将astyle放在Path(C:\Program Files\Microsoft Visual Studio 8\Common7\IDE)中,这样会方便很多。
astyle是一个命令行工具,命令语法很简单:
astyle [options] < original > Beautified astyle [options] Foo.cpp Bar.cpp [...]例如:
astyle --style=ansi foo.cpp
上面的命令将美化foo.cpp文件,更改其风格为ANSI,并将原始文件备份到foo.cpp.orgin。所以,你可以安全的使用该软件而不必担心会将代码改得无法回头。
具体的来说,astyle包含了以下几种预定义风格,只需在参数中简单指定即可使用:
--style=ansi:ANSI 风格格式和缩进
namespace foospace { int Foo() { if (isBar) { bar(); return 1; } else return 0; } } |
--style=kr :Kernighan&Ritchie 风格格式和缩进
namespace foospace { int Foo() { if (isBar) { bar(); return 1; } else return 0; } } |
--style=linux :Linux 风格格式和缩进
namespace foospace { int Foo() { if (isBar) { bar(); return 1; } else return 0; } } |
--style=gnu :GNU 风格格式和缩进
namespace foospace { int Foo() { if (isBar) { bar(); return 1; } else return 0; } } |
--style=java :Java 风格格式和缩进
class foospace { int Foo() { if (isBar) { bar(); return 1; } else return 0; } } |
从这里开始介绍astyle的高级应用!这里要介绍的是两种应用情形,一是在Visual Studio中整合,二是批量处理。
先看如何在Visual Studio中整合。看图说话!
第一步:点击“工具”菜单
第二步:点击“外部工具”
第三步:配置并保存
在对话框中点击“添加”,如图填入各项。其中参数填写 --style=ansi $(ItemFileName)$(ItemExt)
可以勾选“使用输出窗口”,这样将不会显示黑色的命令窗口。相关信息都会显示在Visual Studio中。
经过上面设置之后,只需点击该菜单项就可以将当前文档格式化成ansi风格。如果你想要其它风格,可以自行设置参数。
值得注意的是在低版本的Visual Studio中,默认设置运行外部程序不会保存当前文档。这样的话如果在未保存的情况下运行该命令,未保存部分将会丢失。这个可以通过设置一个选项来解决。Visual Studio 6.0中:Options -> Editor -> Save Options -> Save before running tools 将该项勾选即可。我已经验证,在Visual Studio 2005中不用担心这类问题,可以放心使用。但是作为一个好习惯,我仍然建议你随时保存你的工作,尤其是做这种大幅度改动之前,甚至应该对源代码进行Check in操作。不知道Check in是什么?没关系,过几天我还会写一篇关于代码控制的文章,应该可以解决你的疑惑。
1.常用功能
(1) 单个文件--缺省美化 astyle --style=ansi Form1.cs 处理前的代码: private void Form1_Load(object sender, EventArgs e) { int s; for (int i=0;i<10;i++){ for (int j=0;j<10; j++){ s = s+j+i;} } } 处理后: private void Form1_Load(object sender, EventArgs e) { int s; for (int i=0;i<10;i++) { for (int j=0;j<10; j++) { s = s+j+i; } } }(2) 单个文件--更改缩进2个空格
astyle --style=ansi --indent=spaces=2 Form1.cs 缺省缩进一个TAB,也可以显式说明使用Tab,如下: astyle --style=ansi --indent=tab Form1.cs(3) 处理多个文件--有限个
astyle --style=ansi Form1.cs Form2.cs(4) 批量处理多个文件--无限个
for /R .\ %f in (*.cs) do astyle --style=ansi "%f" 说明:/R表明遍历一个目录树,后面紧跟的路径是根,缺省为当前目录。 本例中,根为.\表示当前目录,命令等价于: for /R %f in (*.cs) do astyle --style=ansi "%f" 作用是从(目录树根)当前目录开始,查找所有java文件,包含子目录中的文件;然后交给astyle处理。 当然,目录树根也可以使用绝对路径,下面的命令查找C盘所有的java文件并处理。 for /R c:\ %f in (*.cs) do astyle --style=ansi "%f"2. 其他比较有用的开关:
(1) -f 在两行不相关的代码之间插入空行,如import和public class之间、public class和成员之间等; (2) -p 在操作符两边插入空格,如=、+、-等。 如:int a=10*60; 处理后变成int a = 10 * 60; (3) -P 在括号两边插入空格。另,-d只在括号外面插入空格,-D只在里面插入。 如:MessageBox.Show ("aaa"); 处理后变成MessageBox.Show ( "aaa" ); (4) -U 移除括号两边不必要的空格。 如:MessageBox.Show ( "aaa" ); 处理后变成MessageBox.Show ("aaa"); (5) -V 将Tab替换为空格。下面再介绍第二项独门绝技:批量格式化!
有时候你会有很多文件需要格式化成统一风格,难道一个个点击菜单?不!那样太累了。
在Windows中,我们可以用命令行来解决问题。这里用到一个超级命令 for
我来写个范例,大家就知道该怎么处理了。
for /R %f in (*.cpp;*.c;*.h) do astyle --style=ansi "%f"
该命令在当前目录中寻找文件名匹配模式 *.cpp;*.c;*.h 的所有文件(不同模式可用英文逗号隔开),并且对每个文件%f执行操作:
astyle --style=ansi "%f"
好了,本教程可以结束了。希望对你有所帮助。
下面是标准的程序文档,如果你想了解更多用法,可以一读;如果你只是像我一样日常使用该工具,就可以不看了。
Artistic Style 1.15.3 ()
(created by Tal Davidson, )Modified edition by Qiongzhu Wan, 2004.09
Usage : astyle [options] < original > Beautified
astyle [options] Foo.cpp Bar.cpp [...]When indenting a specific file, the resulting indented file RETAINS the
original file-name. The original pre-indented file is renamed, with a suffix of ".orig" added to the original filename.By default, astyle is set up to indent C/C++/C# files, with 4 spaces per
indent, a maximal indentation of 40 spaces inside continuous statements, and NO formatting.Option's Format:
---------------- Long options (starting with '--') must be written one at a time. Short options (starting with '-') may be appended together. Thus, -bps4 is the same as -b -p -s4.Predefined Styling options:
-------------------- --style=ansi ANSI style formatting/indenting.--style=kr
Kernighan&Ritchie style formatting/indenting.--style=gnu
GNU style formatting/indenting.--style=java
Java mode, with standard java style formatting/indenting.--style=linux
Linux mode (i.e. 8 spaces per indent, break definition-block brackets but attach command-block brackets.Indentation options:
-------------------- -c or --mode=c Indent a C, C++ or C# source file (default)-j or --mode=java
Indent a Java(TM) source file-s or -s# or --indent=spaces=#
Indent using # spaces per indent. Not specifying # will result in a default of 4 spacec per indent.-t or -t# or --indent=tab=#
Indent using tab characters, assuming that each tab is # spaces long. Not specifying # will result in a default assumption of 4 spaces per tab.-T# or --force-indent=tab=# Indent using tab characters, assuming tha
t each tab is # spaces long. Force tabs to be used in areas Astyle would prefer to use spaces.-C or --indent-classes
Indent 'class' blocks, so that the inner 'public:', 'protected:' and 'private: headers are indented in relation to the class block.-S or --indent-switches
Indent 'switch' blocks, so that the inner 'case XXX:' headers are indented in relation to the switch block.-K or --indent-cases
Indent 'case XXX:' lines, so that they are flush with their bodies..-N or --indent-namespaces
Indent the contents of namespace blocks.-B or --indent-brackets
Add extra indentation to '{' and '}' block brackets.-G or --indent-blocks
Add extra indentation entire blocks (including brackets).-L or --indent-labels
Indent labels so that they appear one indent less than the current indentation level, rather than being flushed completely to the left (which is the default).-m# or --min-conditional-indent=#
Indent a minimal # spaces in a continuous conditional belonging to a conditional header.-M# or --max-instatement-indent=#
Indent a maximal # spaces in a continuous statement, relatively to the previous line.-E or --fill-empty-lines
Fill empty lines with the white space of their previous lines.--indent-preprocessor
Indent multi-line #define statementsFormatting options:
------------------- -b or --brackets=break Break brackets from pre-block code (i.e. ANSI C/C++ style).-a or --brackets=attach
Attach brackets to pre-block code (i.e. Java/K&R style).-l or --brackets=linux
Break definition-block brackets and attach command-block brackets.--brackets=break-closing-headers
Break brackets before closing headers (e.g. 'else', 'catch', ..). Should be appended to --brackets=attach or --brackets=linux.-o or --one-line=keep-statements
Don't break lines containing multiple statements into multiple single-statement lines.-O or --one-line=keep-blocks
Don't break blocks residing completely on one line-p or --pad=oper
Insert space paddings around operators only.--pad=paren
Insert space paddings around parenthesies only.-P or --pad=all
Insert space paddings around operators AND parenthesies.--convert-tabs
Convert tabs to spaces.--break-blocks
Insert empty lines around unrelated blocks, labels, classes, ...--break-blocks=all
Like --break-blocks, except also insert empty lines around closing headers (e.g. 'else', 'catch', ...).--break-elseifs
Break 'else if()' statements into two different lines.Other options:
------------- --suffix=#### Append the suffix #### instead of '.orig' to original filename.-X or --errors-to-standard-output
Print errors and help information to standard-output rather than to standard-error.-v or --version
Print version number-h or -? or --help
Print this help messageDefault options file:
--------------------- Artistic Style looks for a default options file in the following order: 1. The contents of the ARTISTIC_STYLE_OPTIONS environment variable if it exists. 2. The file called .astylerc in the directory pointed to by the HOME environment variable ( i.e. $HOME/.astylerc ). 3. The file called .astylerc in the directory pointed to by the HOMEPATH environment variable ( i.e. %HOMEPATH%\.astylerc ). If a default options file is found, the options in this file will be parsed BEFORE the command-line options. Options within the default option file may be written without the preliminary '-' or '--'.
一、AStyle下载路径
Astyle为开源项目,支持C/C++和java的代码格式化
Home Page:
Project Page:
下载最新Windows版本的AStyle,解压到你指定位置,笔者解压到D:\program files下的。
二、Source Insight中安装Astyle工具
如:增加Astyle命令,格式化C/C++文件
1. 打开source insight中的一个工程,选择Options--Custom Commands命令
2. 点击add,添加新的命令Astyle。
1)ansi C 格式化当前文件的命令为
其中,Run中输入astyle的命令参数:"D:\program files\AStyle\bin\AStyle.exe" --style=ansi-s4 -S -N -L -m0 -M40 --convert-tabs --suffix=.pre %f
2)ansi C 格式化某个目录下所有文件的命令为:
"D:\program files\AStyle\bin\AStyle.exe" Z:\LocalProject\DEZHOU3716/*.c Z:\LocalProject\DEZHOU3716/*.h --style=ansi -s4 -S -N -L -m0 -M40 --recursive --convert-tabs --suffix=.pre %f
3. 添加menu菜单,点击“menu”,选择menu--View,然后INSERT。这样就可以在菜单栏View上多一个命令选项。
4. 添加快捷键,点击"Assigh New Key",输入快捷键:Ctrl+Alt+C。以后格式化C/C++文件,就可以直接使用快捷键了。
同理,新建java格式化命令,Astyle参数为
C:\AStyle\bin\AStyle.exe --style=java -s4 -S -N -L -m0 -M40 --suffix=none --convert-tabs %f
三、其他常用的参数:
-C | 类中public,pretected,private关键字,一个tab的缩进 |
-S | switch中case关键字,一个tab的缩进 |
-K | switch中case关键字,无缩进 |
-N | 被namespace包含的block,一个tab的缩进 |
-w | 格式化多行的宏定义 |
-c | 将tab转化为对应个数的空格 |
--mode=c | 格式化的是C/C++的源文件或者头文件(缺省值) |
--mode=java | 格式化的是JAVA的源文件 |
--suffix=#### | 将原始文件保存为“####”后缀,而不是“orig” |
--suffix=none | 不保存原始文件 |
--exclude=#### | 优化时不包含“####”文件或目录 |
-Z | 修改后保持文件的修改时间不变 |
-X | 将错误信息输出到标准输出设备(stdout),而不是标准错误设备(stderr) |
-Q | 只显示格式化前后发生变化的文件 |
-q | 不输出任何信息 |
-z1 | 使用windows版本的回车符(CRLF) |
-z2 | 使用linux版本的回车符(LF) |
--help | 显示帮助信息 |
-v | 显示版本信息 |
基于V2.02版本,astyle主要支持的参数有:
Style-格式配置:
最常用的就是ansi或或kr格式,实际上,kr,stroustrup和linux这三种格式是非常接近的了,试了好几个文件,只有非常微小的区别,可以忽略不计。 stype 选项 | --style=allman --style=ansi --style=bsd --style=break -A1 | --style=java --style=attach -A2 | --style=kr --style=k&r --style=k/r -A3 | --style=stroustrup -A4 | --style=whitesmith -A5 | --style=banner -A6 |
代码风格 | int Foo() { if (isBar) { bar(); return 1; } else { return 0; } } | int Foo() { if (isBar) { bar(); return 1; } else { return 0; } } | int Foo() { if (isBar) { bar(); return 1; } else { return 0; } } | int Foo() { if (isBar) { bar(); return 1; } else { return 0; } } | int Foo() { if (isBar) { bar(); return 1; } else { return 0; } } | int Foo() { if (isBar) { bar(); return 1; } else { return 0; } } |
stype 选项 | --style=gnu -A7 | --style=linux -A8 | --style=horstmann -A9 | --style=1tbs -A10 | --style=pico -A11 | --style=lisp -A12 |
代码风格 | int Foo() { if (isBar) { bar(); return 1; } else { return 0; } } | int Foo() { if (isBar) { bar(); return 1; } else { return 0; } } | int Foo() { if (isBar) { bar(); return 1; } else { return 0; } } | int Foo() { if (isBar) { bar(); return 1; } else { return 0; } } | int Foo() { if (isBar) { bar(); return 1; } else return 0; } | int Foo() { if (isBar) { bar(); return 1; } else return 0; } |
参考文档:
1.
2.