利用sourceinsight宏(Quicker.em)提高編碼效率和質量
Marco是sourceinsight軟件一個強大的功能,用戶可以通過編寫宏來實現自定義功能。這里有個比較流行的宏文件quicker.em,原作者貌似是原Huawei公司的員工編寫整理的,基本功能比較全,可以滿足一般的需求,個人也可以根據這個為基礎進行更個性化的改寫。
通過如下配置:
1.運行SI,打開Base工程,將Quicker.em加入到工程中;
2.安裝觸發熱鍵和菜單,打開SI的Options的Key Assignments菜單,在Command窗口中選擇Macro: AutoExpand然后對其賦一個熱鍵,例如Ctrl Enter。
附下quicker.em的功能說明:
1 標准C語言擴展
1.1 /* 自動生成/* */
該命令自動生成C語言的注釋,它能自動換行對齊,在把文檔中一長串注釋拷貝 過來時特別管用,不用自己去對齊了。還能自動識別中文和英文單詞,對於中文不會把一個字分開,對於英文單詞分開時會自動添加連字符,下面是一個注釋的例子 abcdefghijk = abcd + cdefg + hijk /*該命令自動生成C語言的注釋,它能自 動 換行對齊,在把文檔中一長串注釋拷 貝 過來時特別管用,不用自己去對齊了。*/
1.2 { 自動生成 }
1.3 while (wh) 自動生成While語句
while ( # )
{
#
}
1.4 if 自動生成if語句
if 生成if結構的語句
ife 對應生成if else結構的語句
ifs 對應生成if elseif else結構的f語句
if ( # )
{
#
}
1.5 for 自動生成for語句,支持塊命令插入
該命令自動生成如下格式
for ( #; #; # )
{
#
}
1.5.1 fo 自動生成for語句與前一條命令相比它直接會定義循環變量
UINT32 ulI = 0;
for ( ulI = 0; ulI < #; ulI++ )
{
#
}
1.6 do 自動生成 do while語句
該命令自動生成如下格式
do
{
#
} while ( # );
1.7 #ifd 自動生成 #ifdef 命令
該命令生成如下格式
#ifdef UMSC
#endif /* UMSC */
1.8 #ifn 自動生成 #ifndef 命令
該命令生成如下格式
#ifndef UMSC
#endif /* UMSC */
1.9 #if 自動生成 #if 命令
該命令生成如下格式
#if ( UMSC == 1)
#endif /*if ( UMSC == 1) */
1.10 cpp 自動生成適用於c++的c原型說明定義
該命令生成如下格式
#ifdef __cplusplus
#if __cplusplus
extern "C"{
#endif
#endif /* __cplusplus */
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* __cplusplus */
1.11 switch (sw) 自動生成switch語句
該命令將提示輸入case的個數,生成如下格式
switch ( # )
{
case #:
#
break;
default:
#
}
1.12 case (ca)自動生成case語句
支持塊命令輸入
該命令生成如下格式,用它可以避免遺漏break
case #:
#
break;
1.13 struct (st) 自動生成結構類型
該命令自動生成如下結構定義,它提示輸入結構名,會自動轉換成大寫形式,並且自動在其后添加_STRU作為結構類型
typedef struct HELLO_TEST
{
#
}HELLO_TEST_STRU;
1.14 enum (en) 自動生成枚舉類型
該命令自動生成如下結構定義,它提示輸入結構名,會自動轉換成大寫形式,並且自動在其后添加_STRU作為結構類型
typedef enum HELLO_TEST
{
#
}HELLO_TEST_ENUM;
2 標准說明生成
2.1 config (co) 配置用戶名和標題的說明語種
用戶名就是前面自動生成的作者,修改者的名字,語種
2.2 file (fi) 生成標准的文件頭
自動生成如下格式,它能自動取得文件名,作者名,時間,以及函數列表
2.3 func (fu) 生成標准的函數頭說明
其 自動生成如下函數頭,該函數必須在該函數的前一行執行,它能自動取得函數名,能夠自動取得函數的輸入、輸出參數,並且排列好,同時生成日期和作者。能夠 提示輸入功能描述,輸入的內容能夠自動換行對齊,這樣既可以避免遺漏說明,而且一般在詳細設計中對每個函數的主要功能都有詳細的描述,只要把這些描述 拷貝過來即可,它能自動排列好, 非常方便。 (因為SI的宏功能有限,沒能自動加入調用函數和被調函數的功能)
如果不是在已存在的函數前執行則提示輸入函數名,提示輸入函數描述,提示輸入返回值類型,提示輸入函數入口參數,輸完后按Esc退出
2.4 hi 增加修改歷史列表
自動在該行增加修改歷史列表,用於文件頭和函數頭說明中的歷史記錄更新,其添加形式如下
2.5 hd 自動生成函數頭文件
該命令能夠自動生成但前C文件的頭文件定義,包括常用的宏定義,還有全部的函數原型定義。
2.6 Hdn 生成新的有文件
該命令能夠自動生成指定的的頭文件定義,包括常用的宏定義,提示輸入函數原型的類型。
3 代碼修改注釋
3.1 pn 添加問題單號
在進行問題單修改時都要求在修改的地方注明問題單號和修改人以及修改時間,大部分一個問題單的修改都會涉及到幾個地方,本功能提供自動取問題單號的功能,下面的幾個命令所生成的問題單號就是有它提供,如果輸入為#則不顯示問題單號
3.2 ap 添加問題單修改說明
該命令提示輸入問題單號和修改原因,生成如下格式的說明
3.3 ab 添加開始說明
它能自動生成如下說明:
1.有問題單號的情況,其中問題單號是由ap命令加入的。
/*BEGIN: Added by lushengwen, 2002/5/13 問題單號:D02556*/
2.沒有問題單號的情況,
/*BEGIN: Added by lushengwen, 2002/5/13*/
3.4 ae 添加結束命令
該命令是as的對應命令,表示結束添加
支持塊命令操作
3.5 abg 插入添加開始和結束說明
該命令是前兩個命令的組合
支持塊命令操作
3.6 db 刪除開始命令
它能自動生成如下說明:
1.有問題單號的情況,其中問題單號是由ap命令加入的。
/*BEGIN: Deleted by lushengwen, 2002/5/13 問題單號:D02556*/
2.沒有問題單號的情況,
/*BEGIN: Deleted by lushengwen, 2002/5/13 */
3.7 de 刪除結束命令
該命令是ds的對應命令,表示刪除結束
3.8 dbg 插入刪除開始和結束說明
該命令是前兩個命令的組合
支持塊命令操作
3.9 mb 修改開始命令
它能自動生成如下說明:
1.有問題單號的情況,其中問題單號是由ap命令加入的。
/*BEGIN: Modified by lushengwen, 2002/5/13 問題單號:D02556*/
2.沒有問題單號的情況,
/*BEGIN: Modified by lushengwen, 2002/5/13 */
3.10 me 修改結束命令
該命令是ms的對應命令,表示刪除結束
3.11 mbg 插入修改開始和結束說明
該命令是前兩個命令的組合
支持塊命令操作
4 其余幾個常用宏
4.1 將從C++的 // 注釋改為標准的C /* */注釋
ComentCPPtoC() 文件中的//注釋自動修改為/* */注釋,因為很多C編譯器不能很好的處理C++風格的 // 注釋,用該命令可以方便的將選中區域內的//注釋進行修改,建議將該宏定義在菜單中。
4.2 能自動將Tab轉換成空格(mstp_out.c)
ReplaceBufTab() 自動將單前文件中的Tab轉換成空格
ReplaceTabInProj() 自動將工程中的文件中的Tab轉換成空格
因為不同的編輯器對tab的長度定義不一至,造成代碼格式紊亂,編程規范是不允許用tab鍵的,可以用該宏來將整個文件的tab進行替換,非常方便,建議將該宏定義在菜單中
4.3 插入當前的函數名
InsertFuncName () 能自動的插入本函數名,現在的函數名一般較長,特別是在調試打印代碼中為了顯示出出錯的函數經常需要輸入本函數名,該宏能帶來極大方便。建議定義為一個熱鍵 ctrl 1
4.4 自動在函數入口、出口插入、刪除打印函數
注意使用本功能時一定要求所有的語句符合公司編程規范,要求一條語句一行,因為各種編碼情況很復雜,特別是老代碼和有大量條件編譯的情況下很難覆蓋各種情況,最好在執行完后再檢查一遍。不推薦使用工程內的插入和刪除。
InsertTraceInfo() 能夠自動在函數的出、入口首尾加入打印代碼,即在光標處加入一個進入函數的打印,在函數的返回處加入一個出函數的打印,用於調試跟蹤時很方便,建議定義為熱鍵 Ctrl t
AutoInsertTraceInfoInBuf()能夠在當前文件的函數出入口加入打印信息,定義菜單
AutoInsertTraceInfoInPrj()能夠在當前工程的函數出入口加入打印信息,定義為菜單
RemoveTraceInfo() 刪除InsertTraceInfo()添加的打印信息,定義為菜單
RemoveCurBufTraceInfo()刪除文件中全部的InsertTraceInfo()添加的打印信息,定義為菜單
RemovePrjTraceInfo()刪除但前工程中全部的InsertTraceInfo()添加的打印信息,定義為菜單
4.5 自動格式當前行
FormatLine() 能夠自動將一行長的文字分成多行,並且從第二行開始,起始列為關標所在列,該宏是為了彌補因為對話框只能處理256個字符而編寫的,當需要輸入超過256個字符的說明時,就可以先把它拷貝到第一行,然后執行本宏,進行分行對齊。
4.6 更新函數列表
UpdateFunctionList() 能夠自動在光標所在行重新生成函數列表,用於函數頭說明的函數列表更新。
4.7 復合語句刪除
DelCompoundStatement()能自動刪除復合語句,定義熱鍵 Ctrl D
對於如下語句,如果我想刪除條件 ulCount > 0,只需將光標放在if語句這一行(藍色行),執行 Ctrl D 即可
stSubsystemRec.hwRBSubSystemCpuAveUsageLimit = CPU_RESTORE_THRESHOLD;
if( ulCount > 0 )
{
stSubsystemRec.hwRBSubSystemAdminStatus = ADSTATUS_DOWN;
stSubsystemRec.hwRBSubSystemCpuMaxUsageLimit = CPU_ALARM;
stSubsystemRec.hwRBSubSystemDSPAveUsageLimit = DSP_ALARM;
stSubsystemRec.hwRBSubSystemDSPMaxUsageLimit = DSP_RESTORE;
stSubsystemRec.hwRBSubSystemOperStatus = OPSTATUS_OTHER;
}
stSubsystemRec.hwRBSubSystemIndex = 0;
stSubsystemRec.hwRBSubSystemIpAddress = ulIpAddr;
執行結果
stSubsystemRec.hwRBSubSystemCpuAveUsageLimit = CPU_RESTORE_THRESHOLD;
stSubsystemRec.hwRBSubSystemAdminStatus = ADSTATUS_DOWN;
stSubsystemRec.hwRBSubSystemCpuMaxUsageLimit = CPU_ALARM;
stSubsystemRec.hwRBSubSystemDSPAveUsageLimit = DSP_ALARM;
stSubsystemRec.hwRBSubSystemDSPMaxUsageLimit = DSP_RESTORE;
stSubsystemRec.hwRBSubSystemOperStatus = OPSTATUS_OTHER;
stSubsystemRec.hwRBSubSystemIndex = 0;
stSubsystemRec.hwRBSubSystemIpAddress = ulIpAddr;
4.8 注釋掉多行
AddComment 能夠將多行代碼注釋掉
DelComment 可以解除AddComment的注釋
4.9 其它跟擴展命令對應的宏
下面宏可以根據需要定義為熱鍵
ClearPrombleNo 清除問題單 Alt Del
ExpandBraceLarge 加入{} /*支持塊輸入*/ Ctrl ]
ExpandBraceLittle 加入() /*支持塊輸入*/ Ctrl Shift 9
ExpandBraceMid 加入[] /*支持塊輸入*/ Alt [
FileHeaderCreate 生成文件頭說明 Ctrl Shift i
FunctionHeaderCreate 生成函數頭說明 Ctrl Shift u
HeaderFileCreate 生成頭文件 Ctrl Shift d
InsertCase 插入case語句 Ctrl Alt c
InsertDo 插入do語句 /*支持塊輸入*/ Ctrl Alt d
InsertElse 插入else語句 /*支持塊輸入*/ Ctrl Alt e
InsertFor 插入for語句 /*支持塊輸入*/ Ctrl Alt f
InsertIf 插入if語句 /*支持塊輸入*/ Ctrl Alt I
InsertSwitch 插入switch語句 Ctrl Alt s
InsertWhile 插入while語句 /*支持塊輸入*/ Ctrl Alt w
InsIfdef 插入#ifdef語句 /*支持塊輸入*/ Ctrl 3
PredefIfStr 插入#if語句 /*支持塊輸入*/ Alt 3
InsertReviseAdd 插入添加說明 /*支持塊輸入*/ Ctrl Shift a
InsertReviseDel 插入刪除說明 /*支持塊輸入*/ Ctrl Shift r
InsertReviseMod 插入修改說明 /*支持塊輸入*/ Ctrl Shift m