在共同探討C++代碼編寫風格的帖子裏,看到有個提到使用AStyle工具可以自動格式化代碼風格,想過我用ctrl+K,ctrl+F的痛苦日子,我決定嘗試一個這個軟件。
軟件下載到了,但如何使用與配置,還得有人教。上網找了一下,找到http://blog.csdn.net/akof1314/article/details/6453666這篇文章寫得不錯,引用如下。
AStyle(全稱Artistic Style)是一個C、C++、C#和Java源代碼縮進、格式化和美化工具。官方下載是命令行版程序,可以整合到開發IDE環境中去使用,甚至也可以整合到Notepad++之類的編輯器中。
官方地址:http://astyle.sourceforge.net/
本地下載:http://download.csdn.net/source/3323725
在這裏介紹AStyle整合到VS2008的方法,以及如何使用。
1.首先下載AStyle,將其bin文件夾下的"AStyle.exe"解壓到"D:/Program Files/Microsoft Visual Studio 9.0/Common7/Tools"文件夾下,具體路徑根據所安裝的VS路徑進行更改,這是專門放置Visual Studio外部工具的文件夾;
2.打開Visual Studio 2008,在菜單欄→"工具"→"外部工具",點擊"添加",在下面的編輯框裏分別填入信息:
標題:AStyle格式化工具
命令:D:/Program Files/Microsoft Visual Studio 9.0/Common7/Tools/AStyle.exe
參數:--style=linux --suffix=none -M -p -H -U -k1 $(ItemFileName)$(ItemExt)
linux風格,不保留.orig原始文件
-M是縮進函數多個參數放在不同行的情況
-p是操作符左右留空格(++,--這樣的就不留了);
-H是'if', 'for', 'while'等關鍵字右邊留空格;
-U是移除括號裏外的空格;
-k1是*和&在表示指針和引用類型時,和類型名稱並緊,和變量名之間留空格。
後面二個就是VS的環境變量了,分別表示路徑名、文件名和文件擴展名。合起來就是要格式化的文件的絕對路徑名。
初始化目錄:$(ItemDir)
√使用輸出窗口
****參數說明:
(1) -f
在兩行不相關的代碼之間插入空行,如import和public class之間、public class和成員之間等;
(2) -p
在操作符兩邊插入空格,如=、+、-等。
如:int a=10*60;
處理後變成int a = 10 * 60;
(3) -P
在括號兩邊插入空格。另,-d只在括號外面插入空格,-D只在裏面插入。
如:System.out.println(1);
處理後變成System.out.println( 1 );
(4) -U
移除括號兩邊不必要的空格。
如:System.out.println( 1 );
處理後變成System.out.println(1);
(5) -V
將Tab替換爲空格。
(6)-N
本條主要針對namespaces,如果沒有此參數,效果如下:
namespace foospace
{
class Foo
{
public:
Foo();
virtual ~Foo();
};
}
有此參數就會變成這樣:
namespace foospace
{
class Foo
{
public:
Foo();
virtual ~Foo();
};
}
(7) -n
不生成備份文件,即默認的 .orig文件。
3.就可以在"工具"菜單欄下看到"AStyle格式化工具"選項了,要格式化文檔前,先保存文檔再調用"AStyle格式化工具"選項,這時,會彈出"是否要重新加載它"的詢問框,可在"工具"→"選項"→"環境"→"文檔"→"自動加載更改"打鉤。
4.要爲"AStyle格式化工具"選項設置快捷鍵的話,在"工具"菜單上選擇"選項",從"環境"頁中選擇"鍵盤",在"顯示命令包含"列表中鍵入"工具",在"命令名"列表中滾動到相應的"外部命令 n"項。在這裏我是第9個外部命令項,所以找到"工具.外部命令9",在"按快捷鍵"處,鍵入要設置的快捷鍵,點擊"分配"。如下圖所示:
AStyle參數如下:
①Ansi/Allman/Bsd風格(格式縮進從下一行開始括號)
int Foo(bool isBar) { if (isBar) { bar(); return 1; } else return 0; } |
②Java風格(格式縮進直接緊接後面括號)
int Foo(bool isBar) { if (isBar) { bar(); return 1; } else return 0; } |
③Kernighan_Ritchie風格(格式縮進使用Linux方式括號)
int Foo(bool isBar) { if (isBar) { bar(); return 1; } else return 0; } |
④Stroustrup風格(格式縮進使用stroustrup方式括號,縮進使用5個空格)
int Foo(bool isBar) { if (isBar) { bar(); return 1; } else return 0; } |
⑤Whitesmith風格(格式縮進使用下一行且縮進的括號)
int Foo(bool isBar) { if (isBar) { bar(); return 1; } else return 0; } |
⑥Banner風格(格式縮進使用直接緊接和縮進的括號)
int Foo(bool isBar) { if (isBar) { bar(); return 1; } else return 0; } |
⑦GNU風格(格式縮進使用下一行括號,語句塊括號縮進兩個空格)
int Foo(bool isBar) { if (isBar) { bar(); return 1; } else return 0; } |
⑧Linux風格(格式縮進使用Linux方式括號,語句塊裏面縮進8個空格)
int Foo(bool isBar) { if (isBar) { bar(); return 1; } else return 0; } |
⑨Horstmann風格(格式縮進使用horstman方式,括號緊接語句塊)
int Foo(bool isBar) { if (isBar) { bar(); return 1; } else return 0; } |
⑩1tbs/otbs風格(格式縮進使用Linux方式括號,自動補全單行語句塊括號)
int Foo(bool isBar) { if (isBar) { bar(); return 1; } else { return 0; } } |
⑾pico風格
int Foo(bool isBar) { if (isBar) { bar(); return 1; } else return 0; } |
⑿lisp/python風格
int Foo(bool isBar) { if (isBar) { bar() return 1; } else return 0; } |
也可以自定義格式化參數:
①製表和括號選項
參數命令 | 參數說明 |
default indent option | 默認4個空格 |
--indent=spaces / --indent=spaces=# / -s# | 指定#個空格,#在1~20之間 |
--indent=tab / --indent=tab=# / -t# | 使用製表符,指定#個空格(1~20) |
--indent=force-tab / --indent=force-tab=# / -T# | 強制使用製表符,指定#個空格,#在1~20之間 |
default brackets option | 默認不改變括號 |
--brackets=break / -b | 括號改爲下行( e.g. ANSI C / C++ style ) |
--brackets=attach / -a | 括號在語句後( e.g. Java / K&R style ) |
--brackets=linux / -l | 括號如linux風格 |
--brackets=stroustrup / -u | 括號如stroustrup風格 |
--brackets=horstmann / -g | 括號如horstmann 風格 |
②縮進選項
參數命令 | 參數說明 |
--indent-classes / -C | 縮進class和struct塊後面的public等 |
--indent-switches / -S | 縮進switch塊後面的case塊 |
--indent-cases / -K | 縮進case塊後面的括號 |
--indent-brackets / -B | 括號縮進 |
--indent-blocks / -G | 括號縮進,函數縮進 |
--indent-namespaces / -N | 命名空間後縮進 |
--indent-labels / -L | 額外的標籤縮進 |
--indent-preprocessor / -w | 多行反斜槓定義縮進 |
--indent-col1-comments / -Y | 允許註釋跟隨代碼一起縮進 |
--max-instatement-indent=# / -M# | 在連續聲明中縮進最大#個空格(#小於80,默認爲40) |
--min-conditional-indent=# / -m# | 在多行中設置最小縮進(#小於40,默認爲當前兩倍縮進) |
③填充選項
參數命令 | 參數說明 |
--break-blocks / -f | 在循環語句前後加空行 |
--break-blocks=all / -F | 在循環語句前後、else、catch前加空行 |
--pad-oper / -p | 運算符前後加空格 |
--pad-paren / -P | 在括號內外都加上空格 |
--pad-paren-out / -d | 在括號外加上空格 |
--pad-paren-in / -D | 在括號內加上空格 |
--pad-header / -H | 只在括弧頭部添加一個空格 |
--unpad-paren / -U | 移除括號內外的空格 |
--delete-empty-lines / -x | 刪除函數方法裏多餘的空行 |
--fill-empty-lines / -E | 以空格對齊填充前一行空行 |
④格式化選項
參數命令 | 參數說明 |
--break-closing-brackets / -y | 讓else語句塊下起一行 |
--break-elseifs / -e | 讓else if 語句拆開縮進 |
--add-brackets / -j | 自動補充括號,默認在條件語句後緊接括號 |
--add-one-line-brackets / -J | 自動補充括號,並且保持括號與語句在一行 |
--keep-one-line-statements / -o | 維持一行裏的多條語句不變 |
--keep-one-line-blocks / -O | 不破壞一行裏面的塊 |
--convert-tabs / -c | 轉換TAB 爲空格 |
--align-pointer=type / -k1 --align-pointer=middle / -k2 --align-pointer=name / -k3 |
使指針或者引用符靠近變量類型 使指針或者引用符在變量類型和變量名稱中間 使指針或者引用符靠近變量名稱 |
--mode=c --mode=cs --mode=java |
指定爲C/C++代碼格式化 指定爲C#代碼格式化 指定爲JAVA 代碼格式化 |