现在的位置: 首页 > 综合 > 正文

利用Source Insight宏语言脚本添加注释

2013年02月03日 ⁄ 综合 ⁄ 共 7169字 ⁄ 字号 评论关闭

利用Source Insight宏语言脚本添加注释

一,前言

    总所周知,在Windows开发环境中,一个几百兆C语言工程代码中,最好用的编辑工具当然就是Source Insight了。Source Insight(目前大多使用的版本为3.5)的Macro Language提供的API非常强大,其实我们可以利用这些API编写一些脚本,通过映射快捷键来达到高效而规范开发的目的。

    而在一个团队协作开发的项目中,如果后期主要工作是Debug,那么仅仅只是规范注释,对于问题的追踪,代码的美观都显得尤为重要。因为Source Insight可以自定义出各种功能的脚本。本文只介绍如何利用Source Insight的宏语言编写脚本,快速添加统一规范化的注释。

二,编写注释脚本

    打开Source Insight,按F1,会出来Source Insight Help文档,里面有个Macro Language Guide,相信大家看完之后,都可以尝试着去编写各种各样的脚本出来。正如Vim出来之后,很多牛人编写了功能强大的插件一样,让Vim成为Linux下的一件编辑利器。本人也是通过尝试,花了一个晚上时间写出来一个添加注释的简单脚本。在此贴出我的脚本,文件名为 BryanCommentsV1.0.em:

/*
  *************************************************************
  *						Comments Add File
  *				Copy Rights by BryanZhu @2010-2046
  *
  * FileName: BryanCommentsV1.0.em
  * Author: BryanZhu
  * Email: hbzqiang@163.com
  * Date: 2010-08-29
  *
  *************************************************************
*/  

/*
  *************************************************************
  * FunctionName : GetStandardTimeString
  * Description : get the system time by YYYY/MM/DD format.
  * ReturnValue : return a system time string.
  * Parameter[0] :
  * Parameter[1] : 
  * Author : BryanZhu
  * Date : 2010-08-29
  *************************************************************
*/  
macro GetStandardTimeString()
{
	var szSysTime
	var szYear
	var szMonth
	var szDay
	var szTempMonth
	var szTempDay
	var szTimeString

	szSysTime = GetSysTime(1)
	szYear = szSysTime.Year
	szTempMonth = szSysTime.Month
	szTempDay = szSysTime.Day

	if(szTempMonth < 10)
	{
		szMonth = "0@szTempMonth@"
	}
	else
	{
		szMonth = szTempMonth
	}

	if(szTempDay < 10)
	{
		szDay = "0@szTempDay@"
	}
	else
	{
		szDay = szTempDay
	}
	
	szTimeString = "@szYear@/@szMonth@/@szDay@"

	return szTimeString
}


/*
  *************************************************************
  * FunctionName : InsertCommentsInfo
  * Description : Save Basic Comments Info in a special file to parse the info.
  *			     by other macro functions.
  * ReturnValue : NONE
  * Parameter[0] :
  * Parameter[1] : 
  * Author : BryanZhu
  * Date : 2010-08-29
  *************************************************************
*/ 
macro InsertCommentsInfo(hbuf)
{
	var szModifyID
	var szAuthorName
	var szComment

	szModifyID = "ModifyID:RF00000000"
	szAuthorName = "AuthorName:BryanZhu"
	szComment = "Comment:Please_input_your_comment_statement_here."

	InsBufLine(hbuf, 0, szModifyID)
	InsBufLine(hbuf, 1, szAuthorName)
	InsBufLine(hbuf, 2, szComment)
}


/*
  *************************************************************
  * FunctionName : BryanSaveCommentsInfo
  * Description : save the infomation of comments
  * ReturnValue : NONE
  * Parameter[0] :
  * Parameter[1] : 
  * Author : BryanZhu
  * Date : 2010-08-29
  *************************************************************
*/  
macro BryanSaveCommentsInfo()
{
	var filename
	var NewFileBufName
	var hbuf
	var hwnd

	var hprj
	var nProjFileCount
	var iFileIndex
	var tempFileName
	
	filename = "CommentsConfigFile.bryan"

	//judge the comments info file if is in current project.
	hprj = GetCurrentProj()
	nProjFileCount = GetProjFileCount(hprj)

	iFileIndex = 0
	while(iFileIndex < nProjFileCount)
	{
		tempFileName = GetProjFileName(hprj, iFileIndex)
		if(tempFileName == filename)
		{
			//Msg("@filename@ file is existed in this project...")
			hbuf = OpenBuf(filename)			
			if(hbuf != hNil)
			{
				hwnd = NewWnd(hbuf)
				if(hwnd != hNil)
				{
					SaveBufAs(hbuf, filename)
					AddFileToProj(hprj, filename)
				}
				else
				{
					Msg("Create new window error!-1")
				}
			}
			else
			{
				Msg("Create new empty file buffer error!-1")
			}
			break
		}
		else
		{
			iFileIndex = iFileIndex + 1
			if(iFileIndex == nProjFileCount)
			{
				//Msg("@filename@ file is not existed in this project...")
				hbuf = NewBuf(NewFileBufName)				
				if(hbuf != hNil)
				{
					hwnd = NewWnd(hbuf)
					if(hwnd != hNil)
					{
						hprj = GetCurrentProj()
						InsertCommentsInfo(hbuf)
						SaveBufAs(hbuf, filename)
						AddFileToProj(hprj, filename)
					}
					else
					{
						Msg("Create new window error!-2")
					}
					//CloseBuf(hbuf)
				}
				else
				{
					Msg("Create new empty file buffer error!-2")
				}				
				break
			}
		}
	}
	stop
}

macro GetCommentsInfoFileName()
{
	return "CommentsConfigFile.bryan"
}

macro IsCommentsInfoFileExist()
{
	var filename
	var hprj
	var nProjFileCount
	var iFileIndex
	var tempFileName
	
	filename = "CommentsConfigFile.bryan"

	hprj = GetCurrentProj()
	nProjFileCount = GetProjFileCount(hprj)
	
	iFileIndex = 0
	while(iFileIndex < nProjFileCount)
	{
		tempFileName = GetProjFileName(hprj, iFileIndex)
		if(tempFileName == filename)
		{
			return 1 	// File is exist.
		}
		else
		{
			iFileIndex = iFileIndex + 1
		}
	}
	return 0	// File is not exist.
}


macro GetCommentsInfo(iBufLineIndex)
{
	var filename
	var hbuf
	var szText
	var nBufLineCount
	var nTextLength

	filename = GetCommentsInfoFileName()

	if(IsCommentsInfoFileExist())
	{
		hbuf = OpenBuf(filename)
		if(hbuf != hNil)
		{
			nBufLineCount = GetBufLineCount(hbuf)			
			if(iBufLineIndex <= nBufLineCount)
			{
				szText = GetBufLine(hbuf, iBufLineIndex)
				nTextLength = strlen(szText)
				if(iBufLineIndex == 0)
				{
					szText = strmid(szText, 9, nTextLength)
				}
				else if(iBufLineIndex == 1)
				{
					szText = strmid(szText, 11, nTextLength)				
				}
				else if(iBufLineIndex == 2)
				{
					szText = strmid(szText, 8, nTextLength)				
				}
				CloseBuf(hbuf)
				return szText	
			}
			else
			{
				Msg("GetCommentsInfo() parameter @iInfoIndex@ error....")
			}
		}
		else
		{
			Msg("GetModifyIDofCommentsInfo(): Open buffer fail...")
			stop
		}		
	}
	else
	{
		Msg("@filename@ is not exist...")
		stop
	}
}


/*
  *************************************************************
  * FunctionName : BryanAddSelBlockComments
  * Description : add comments to contain the selected block statements. 
  * ReturnValue : NONE
  * Parameter[0] :
  * Parameter[1] : 
  * Author : BryanZhu
  * Date : 2010-08-29
  *************************************************************
*/  
macro BryanAddSelBlockComments()
{
	var hwnd
	var hbuf
	var firstSelLine
	var lastSelLine
	
	var sztempFirstRemark
	var sztempLastRemark
	var szFirstRemark
	var szLastRemark
	var szfirstSelLineText
	var szTimeString

	var szModifyID
	var szAuthorName
	var szComment
	var ichIndex
	
	
	sztempFirstRemark = "// <-"
	sztempLastRemark  = "// ->"
	szFirstRemark = Nil
	szLastRemark = Nil
	szTimeString = GetStandardTimeString()

	szModifyID = GetCommentsInfo(0)
	szAuthorName = GetCommentsInfo(1)
	szComment = GetCommentsInfo(2)

	if(IsCommentsInfoFileExist())
	{
		sztempFirstRemark = sztempFirstRemark # szModifyID # "-" # szAuthorName # "-" # szTimeString # "-" # szComment
		sztempLastRemark  = sztempLastRemark  # szModifyID # "-" # szAuthorName
		hwnd = GetCurrentWnd()
		hbuf = GetCurrentBuf()
		firstSelLine = GetWndSelLnFirst(hwnd)
		lastSelLine = GetWndSelLnLast(hwnd)

		szfirstSelLineText = GetBufLine(hbuf, firstSelLine)

		ichIndex = 0
		while(szfirstSelLineText[ichIndex] == "" || szfirstSelLineText[ichIndex] == "\t")
		{
			if(szfirstSelLineText[ichIndex] == "" )
			{
				szFirstRemark = cat(szFirstRemark, "")
				szLastRemark = cat(szLastRemark, "")
			}
			else
			{
				szFirstRemark = cat(szFirstRemark, "\t")
				szLastRemark = cat(szLastRemark, "\t")
			}
			ichIndex = ichIndex + 1
		}
		
		szFirstRemark = cat(szFirstRemark, sztempFirstRemark)
		szLastRemark = cat(szLastRemark, sztempLastRemark)
		InsBufLine(hbuf, firstSelLine, szFirstRemark)
		InsBufLine(hbuf, lastSelLine+2, szLastRemark)

		SaveBuf(hbuf)
	}
	else
	{
		BryanSaveCommentsInfo()
	}

	stop
}

三,添加BryanCommentsV1.0.em脚本到Source Insight的Base项目中

    将BryanCommentsV1.0.em拷贝到Source Insight的Base项目所在的文件夹下,比如 C:\Documents and Settings\Source Insight\Projects\Base    ,然后打开Source Insight的Base项目,通过菜单Project -> Add and Remove Project Files... ,将BryanCommentsV1.0.em添加进Base项目。

四,自定义菜单

    打开Menu -> Menu Assignments, Menu栏选择Work菜单(当然,你想把自定义的Macro功能添加到哪个菜单都行。笔者以Work菜单为例) ,在Command栏输入macro快速查找,这时会出现Macro: BryanAddSelBlockComments和Macro: BryanSaveCommentsInfo两个在脚本里自定义的宏,选中Menu Contents里的<end of menu>和左边两个自定义的宏,添加进去,点击OK,即可。

五,编辑注释信息

    在Work菜单中,点击BryanSaveCommentsInfo,这时可以编辑ModifyID,这个ID可以是你的BUG库ID,可以编辑AuthorName为自己的姓名,可以编辑Comment注释信息,编辑之后保存即可。在点击BryanSaveCommentsInfo的那一刻,脚本生成了一份CommentsConfigFile.bryan注释配置文件并添加进你所在的工程,这个文件保存着你的注释配置信息。如图1所示。

图1

六,添加注释

    这时可以在代码中选中某个模块,或者函数,或者语句块,如图2所示,点击BryanAddSelBlockComments,则注释就添加进去了,如图3所示。在注释中,可以通过搜索BUG ID,直接追踪你修改的所有代码,也可以通过姓名搜索追踪你修改的所有功能。不仅方便查询,而且注释格式风格一样,一目了然,便于阅读,利于代码规范。

图2

图3

七,结语:

    大家有兴趣,可以自定义各种各样有利于代码规范和提供工作效率的脚本。关于Source Insight和VC6.0,Visual Studio2008关联的用法,以后再做介绍。


  半童

2011.10.15北京

Email: hbzqiang@163.com

抱歉!评论已关闭.