![]() |
代码注释就是讲文档窗口中选择的文本编程C/C++语言的注释块,TabBars插件设置这个功能主要是为了简化编程过程中的操作。通常用C风格注释一段代码需要在代码的开始添加/*,并在代码的结束添加*/,用C++风格则是在每行的行首添加//,如果要恢复这些代码就需要再删除这些符号。TabBars插件提供了自动添加和去处这些注释符号的功能,还支持在代码开始处插入时间戳等信息。
添加注释符号有两种风格:C风格和C++风格。TabBars虽然提供了两种风格的注释符号添加方式,但是在某些情况下的处理方式是一样的,比如,当TabBars判断出选择的文本是一行代码中的一段时,通常只使用/**/方式,因为多数情况下用户这样选择是为了注释函数参数或替换表示符,使用/**/更符合用户的意图。
添加注释符号需要首先从文档中得到当前选择的文本块,使用ITextDocument的get_Selection可以得到一个ITextSelection对象,通过ITextSelection对象的四个属性:TopLine,BottomLine,CurrentLine和CurrentColumn可以得到N当前选择的文本的四个位置坐标,这些坐标以行和字符为单位,这几个坐标就是TabBars判断用户是选择了一行代码还是一段代码的依据。以下代码就是对用户选择进行判断并对文本块添加C风格的注释符号的过程:
strText = bstr;
long lStart = 0,lEnd = 0,iColEnd = 0,lCurrent;
pSel->get_TopLine(&lStart);
pSel->get_BottomLine(&lEnd);
pSel->get_CurrentLine(&lCurrent);
pSel->get_CurrentColumn(&iColEnd);
if(lStart == lEnd) //选择在一行上
{
if((lCurrent == lEnd) && (iColEnd > 1))//不是一整行
{
strTmp.Format(_T("/*%s*/"),strText);//依然使用/**/
bstr = strTmp;
pSel->put_Text(bstr);
}
else if((lCurrent == (lEnd + 1)) && (iColEnd == 1))//是一整行
{
strTmp.Format(_T("//%s"),strText);//使用//
bstr = strTmp;
pSel->put_Text(bstr);
}
}
else//选择了多行
{
int idx = 0;
int totalline = lEnd - lStart + 1;
strTmp = _T("/*"); //注释开始符号
if(g_bAddTime && g_bAddUser) //判断是否添加附加注释信息
{
CString strtt;
strTmp += _T("@**#---");//附加信息开始标志
if(g_bAddTime)
{
SYSTEMTIME st;
::GetLocalTime(&st);
strtt.Format(_T("%04d-%02d-%02d %02d:%02d:%02d "),st.wYear,st.wMonth,
st.wDay,st.wHour,st.wMinute,st.wSecond);
strTmp += strtt;
}
if(g_bAddUser)
{
strtt.Format(_T("(%s)"),g_szUser);
strTmp += strtt;
}
strTmp += _T("---#**@");//附加信息结束标志
}
strTmp += _T("/r/n");
strTmp += strText;
strTmp += _T("*/");//注释结束符号
bstr = strTmp;
pSel->put_Text(bstr);//替换选择的文本
}
添加C++风格的注释处理单行文本时和上面的过程一样,但是在处理多行文本时稍有不同,具体就是在每行的行首插入//符号。
恢复代码的过程就是讲注释符号从选择的文本中删除的过程,TabBars插件可以自动识别注释的风格并自动删除注释符号。对于使用/**/注释的文本,选择取消注释时并不一定要严格地选择从/*开始到*/结束的文本,多一点少一点没关系,TabBars插件会自动匹配注释符号。至于使用C++风格的块注释,TabBars会删除每一行的第一个//匹配,不影响其他的行内注释:
strTmp = lpszNull;
int idx = 0;
while((idx = strText.Find(_T("//"),idx)) != -1)
{
bChange = TRUE;
strTmp += strText.Left(idx);
strText = strText.Mid(idx + 2); //过滤 //
idx = strText.Find(_T("/r/n"),0);//跳到行尾
strTmp += strText.Left(idx + 2);//
strText = strText.Mid(idx + 2);//从新行开始找
idx = 0;
}
strTmp += strText;//It is not a good idea, but can void many bugs