SourceInsight自定义宏实现C/C++风格注释以及函数注释插入
已实现的功能:
- C风格(
//
)注释、取消注释选中行 - C++风格(
/* */
)注释、取消注释选中行 - C++风格(
/* */
)注释、取消注释块状选择 - 函数头注释插入(函数说明、入参、出参、作者等信息 )
- 使用
#if 0
快速注释、取消注释选中行
如有不足之处,欢迎评论指正。
/* Utils.em - a small collection of useful editing macros */
/**********************************************************
* 文件名称 : Utils.em
* 作 者 : zunnajim
* 修改历史 : 2023-06-08 创建文件, 补全函数注释.
* 2023-06-09 完善 CommentSelectedBufferInCpp ,补全单行注释,多行注释, 块注释.
* 完善 UnCommentSelectedBufferInCpp ,取消单行注释,多行注释, 块注释.
* 2023-06-12 修改 UnCommentSelectedBufferInCpp ,解决取消注释出现字符串替换失败的问题.
************************************************************/
/**********************************************************
* 函 数 名 : KillLine
* 函数功能 : 删除当前行, 并保存到剪切板
* 输入参数 : 无
* 输出参数 : 无
* 返 回 值 : 无
* 修改历史 : created by zunnajim by 2023/5/28
************************************************************/
macro KillLine()
{
var Obj_Window; /* 窗口对象 */
var ilnFirst; /* 第一行 */
var ilnLast; /* 最后一行 */
var Obj_BufferSelected; /* 当前选中的buffer */
var Obj_BufferClipBoard; /* 剪切板buffer */
var iDelLines; /* 已删除的行 */
Obj_Window = GetCurrentWnd()
ilnFirst = GetWndSelLnFirst(Obj_Window)
ilnLast = GetWndSelLnLast(Obj_Window)
Obj_BufferSelected = GetCurrentBuf();
Obj_BufferClipBoard = GetBufHandle("Clipboard")
iDelLines = ilnFirst
while(iDelLines <= ilnLast)
{
DelBufLine(Obj_BufferSelected, ilnFirst)
iDelLines = iDelLines + 1
}
}
/**********************************************************
* 函 数 名 : PasteKillLine
* 函数功能 : 粘贴剪切板中的内容
* 输入参数 : 无
* 输出参数 : 无
* 返 回 值 : 无
* 修改历史 : created by zunnajim by 2023/5/28
************************************************************/
macro PasteKillLine()
{
Paste
ClearBuf(GetBufHandle("Clipboard"))
}
/**********************************************************
* 函 数 名 : CommentBlockOut
* 函数功能 : 以C++的格式注释选中的行, 每一行都分别注释
* 输入参数 : 无
* 输出参数 : 无
* 返 回 值 : 无
* 修改历史 : created by zunnajim by 2023/5/28
************************************************************/
macro CommentBlockOut()
{
var Obj_Window;
var Obj_WindowBuffer;
var Obj_WindowSelected;
var ilnCurrentLine;
var TOKEN_BEGIN;
var TOKEN_END;
var TAB;
var SPACE;
Obj_Window = GetCurrentWnd();
Obj_WindowBuffer = GetCurrentBuf();
Obj_WindowSelected = GetWndSel(Obj_Window);
ilnCurrentLine = Obj_WindowSelected.lnFirst;
TOKEN_BEGIN = "/* ";
TOKEN_END = " */";
TAB = CharFromAscii(9);
SPACE = CharFromAscii(32);
while (ilnCurrentLine <= Obj_WindowSelected.lnLast)
{
var sCurrentLine;
var sTemp;
var sTemp2;
var iCurrentLineLen;
var iChar;
sCurrentLine = GetBufLine(Obj_WindowBuffer, ilnCurrentLine)
iCurrentLineLen = GetBufLineLength(Obj_WindowBuffer, ilnCurrentLine)
iChar = 0
while (iChar < iCurrentLineLen)
{
if (sCurrentLine[iChar] == SPACE || sCurrentLine[iChar] == TAB)
{
iChar++
}
else
{
sTemp = strmid(sCurrentLine, 0, iChar) # TOKEN_BEGIN # strmid(sCurrentLine, iChar, iCurrentLineLen) # TOKEN_END;
PutBufLine(Obj_WindowBuffer, ilnCurrentLine, sTemp)
break;
}
}
ilnCurrentLine++
}
}
/**********************************************************
* 函 数 名 : UncommentBlockOut
* 函数功能 : 取消C++风格的注释, 与CommentBlockOut配对使用
* 输入参数 : 无
* 输出参数 : 无
* 返 回 值 : 无
* 修改历史 : created by zunnajim by 2023/5/28
************************************************************/
macro UncommentBlockOut()
{
var Obj_Window;
var Obj_Buffer;
var Obj_WindowSelected;
var ilnCurrentLine;
var TOKEN_BEGIN;
var TOKEN_END;
var TAB;
var SPACE;
Obj_Window = GetCurrentWnd()
Obj_Buffer = GetCurrentBuf()
Obj_WindowSelected = GetWndSel(Obj_Window)
ilnCurrentLine = Obj_WindowSelected.lnFirst
TOKEN_BEGIN = "/* "
TOKEN_END = " */"
TAB = CharFromAscii(9)
SPACE = CharFromAscii(32)
while(ilnCurrentLine <= Obj_WindowSelected.lnLast)
{
var sCurrentLine;
var sNewLine;
var iCurrentLineLen;
var iChar;
var sTemp;
iCurrentLineLen = GetBufLineLength(Obj_Buffer, ilnCurrentLine)
sCurrentLine = GetBufLine(Obj_Buffer, ilnCurrentLine);
if(ilnCurrentLine < (strlen(TOKEN_BEGIN) + strlen(TOKEN_END)))
continue;
iChar = 0
while (iChar < iCurrentLineLen)
{
if (sCurrentLine[iChar] == SPACE || sCurrentLine[iChar] == TAB)
{
iChar++
}
else
{
sNewLine = strmid(sCurrentLine, 0, iChar);
sTemp = strmid(sCurrentLine, iChar, iChar + strlen(TOKEN_BEGIN));
if(sTemp != TOKEN_BEGIN)
stop;
iChar = iChar + strlen(TOKEN_BEGIN)
sTemp = strmid(sCurrentLine, iCurrentLineLen - strlen(TOKEN_END), iCurrentLineLen);
if(sTemp != TOKEN_END)
stop;
sNewLine = sNewLine # strmid(sCurrentLine, iChar, iCurrentLineLen - strlen(TOKEN_END));
PutBufLine(Obj_Buffer, ilnCurrentLine, sNewLine);
break;
}
}
ilnCurrentLine++;
}
}
/**********************************************************
* 函 数 名 : CommentMultiLine
* 函数功能 : 以C风格注释选中的所有行
* 输入参数 : 无
* 输出参数 : 无
* 返 回 值 : 无
* 修改历史 : created by zunnajim by 2023/5/28
************************************************************/
macro CommentMultiLine()
{
var Obj_Window;
var Obj_Buffer;
var Obj_WindowSelected;
var Obj_WindowSelectedTmp;
var ilnCurrentLine;
var cCurrentLine
var iCurrentLineLen
var cChar
var TAB;
var SPACE;
var TOKEN;
Obj_Window = GetCurrentWnd()
Obj_Buffer = GetCurrentBuf()
Obj_WindowSelected = GetWndSel(Obj_Window)
Obj_WindowSelectedTmp = Obj_WindowSelected
ilnCurrentLine = Obj_WindowSelected.lnFirst
TAB = CharFromAscii(9)
SPACE = CharFromAscii(32)
TOKEN = "// "
while (ilnCurrentLine <= Obj_WindowSelected.lnLast)
{
cCurrentLine = GetBufLine(Obj_Buffer, ilnCurrentLine)
iCurrentLineLen = GetBufLineLength(Obj_Buffer, ilnCurrentLine)
cChar = 0
while (cChar < iCurrentLineLen)
{
if (cCurrentLine[cChar] == SPACE || cCurrentLine[cChar] == TAB)
{
cChar++
}
else
{
Obj_WindowSelectedTmp.lnFirst = ilnCurrentLine
Obj_WindowSelectedTmp.lnLast = ilnCurrentLine
Obj_WindowSelectedTmp.ichFirst = cChar
Obj_WindowSelectedTmp.ichLim = cChar
SetWndSel(Obj_Window, Obj_WindowSelectedTmp)
SetBufSelText(Obj_Buffer, TOKEN)
break
}
}
ilnCurrentLine++
}
SetWndSel(Obj_Window, Obj_WindowSelected)
}
/**********************************************************
* 函 数 名 : UnCommentMultiLine
* 函数功能 : 取消C风格的注释, 与CommentMultiLine配对使用
* 输入参数 : 无
* 输出参数 : 无
* 返 回 值 : 无
* 修改历史 : created by zunnajim by 2023/5/28
************************************************************/
macro UnCommentMultiLine()
{
var Obj_Window;
var Obj_Buffer;
var Obj_WindowSelected;
var Obj_WindowSelectedTmp;
var ilnCurrentLine;
var cCurrentLine
var cCurrentLineTemp
var iCurrentLineLen
var cChar
var TOKEN;
var TOKEN_LEN;
Obj_Window = GetCurrentWnd()
Obj_Buffer = GetCurrentBuf()
Obj_WindowSelectedTmp = GetWndSel(Obj_Window)
Obj_WindowSelected = Obj_WindowSelectedTmp
ilnCurrentLine = Obj_WindowSelectedTmp.lnFirst
TOKEN = "// "
TOKEN_LEN = strlen(TOKEN)
while (ilnCurrentLine <= Obj_WindowSelectedTmp.lnLast)
{
cCurrentLine = GetBufLine(Obj_Buffer, ilnCurrentLine)
cCurrentLineTemp = ""
iCurrentLineLen = GetBufLineLength(Obj_Buffer, ilnCurrentLine)
cChar = 0
while (cChar <= iCurrentLineLen - TOKEN_LEN)
{
if (strmid (cCurrentLine, cChar, cChar+TOKEN_LEN) == TOKEN)
{
Obj_WindowSelected.lnFirst = ilnCurrentLine
Obj_WindowSelected.lnLast = ilnCurrentLine
Obj_WindowSelected.ichFirst = cChar + TOKEN_LEN
Obj_WindowSelected.ichLim = iCurrentLineLen
SetWndSel(Obj_Window, Obj_WindowSelected)
PutBufLine(Obj_Buffer, ilnCurrentLine, cat(cCurrentLineTemp, strmid(cCurrentLine, Obj_WindowSelected.ichFirst, Obj_WindowSelected.ichLim)))
break
}
else
{
cCurrentLineTemp = cat(cCurrentLineTemp, cCurrentLine[cChar])
cChar++
continue
}
}
ilnCurrentLine++
}
SetWndSel(Obj_Window, Obj_WindowSelectedTmp)
}
/**********************************************************
* 函 数 名 : CommentLineWithIf0
* 函数功能 : 使用"if 0"宏定义注释选中的行
* 输入参数 : 无
* 输出参数 : 无
* 返 回 值 : 无
* 修改历史 : created by zunnajim by 2023/5/28
************************************************************/
macro CommentLineWithIf0()
{
var Obj_Window;
var ilnFirst;
var ilnLast;
var Obj_Buffer;
Obj_Window = GetCurrentWnd()
ilnFirst = GetWndSelLnFirst(Obj_Window)
ilnLast = GetWndSelLnLast(Obj_Window)
Obj_Buffer = GetCurrentBuf()
InsBufLine(Obj_Buffer, ilnFirst, "#if 0")
InsBufLine(Obj_Buffer, ilnLast+2, "#endif")
}
/**********************************************************
* 函 数 名 : UnCommentLineWithIf0
* 函数功能 : 取消使用"if 0"注释的行, 与CommentLineWithIf0配对使用
* 输入参数 : 无
* 输出参数 : 无
* 返 回 值 : 无
* 修改历史 : created by zunnajim by 2023/5/28
************************************************************/
macro UnCommentLineWithIf0()
{
var Obj_Window;
var ilnFirst;
var ilnLast;
var Obj_Buffer;
Obj_Window = GetCurrentWnd()
ilnFirst = GetWndSelLnFirst(Obj_Window)
ilnLast = GetWndSelLnLast(Obj_Window)
Obj_Buffer = GetCurrentBuf()
DelBufLine(Obj_Buffer, ilnFirst)
DelBufLine(Obj_Buffer, ilnLast - 1)
}
/**********************************************************
* 函 数 名 : InnerInsertFuncHeader
* 函数功能 : 在函数头插入特定格式的函数说明
* 输入参数 : _Obj_FileBuffer 当前函数所在的文件buffer对象
* : _iInserLine 需要插入的行
* : _cFuncName 函数名称
* : _Obj_ParamBuffer 函数参数列表
* : _iParamCount 函数参数数量
* 输出参数 : 无
* 返 回 值 : 无
* 修改历史 : created by zunnajim by 2023/5/28
************************************************************/
macro InnerInsertFuncHeader(_Obj_FileBuffer, _iInserLine, _cFuncName, _Obj_ParamBuffer, _iParamCount)
{
if(hNil == _Obj_FileBuffer || hNil == _Obj_ParamBuffer || nil == _cFuncName || _iInserLine <0 || _iParamCount < 0)
{
Masg("InnerInsertFuncHeader: Invalid Input Param!")
return -1
}
var Obj_InsertBuffer;
var iIndex;
var iIndex2;
var iInsertLineCount;
var cParamTmp;
var cFirstLine;
var cFuncName;
var cFuncDescription;
var cFuncHistory;
var Obj_SystemTime;
var cLastLine;
var BUFFERLEN;
var iTmpLen;
BUFFERLEN = 25;
iTmpLen = 0;
Obj_InsertBuffer = NewBuf("InsertBuffer");
iIndex = 0;
cFirstLine = "/**********************************************************";
AppendBufLine(Obj_InsertBuffer, cFirstLine);
cFuncName = "* 函 数 名 : ";
cFuncName = cat(cFuncName, _cFuncName)
AppendBufLine(Obj_InsertBuffer, cFuncName);
cFuncDescription = Ask("Please Input the Function Description");
cFuncDescription = cat("* 函数功能 : ", cFuncDescription);
AppendBufLine(Obj_InsertBuffer, cFuncDescription);
if(0 == _iParamCount)
{
AppendBufLine(Obj_InsertBuffer, "* 输入参数 : 无");
}
else
{
cParamTmp = GetBufLine(_Obj_ParamBuffer, 0);
iTmpLen = strlen(cParamTmp);
while(iTmpLen < BUFFERLEN)
{
cParamTmp = cat(cParamTmp, " ");
iTmpLen = iTmpLen + 1;
}
// cParamTmp = cat (cParamTmp, "\t\t\t")
cParamTmp = cat(cParamTmp, Ask("Please Input the Descreption for Param : " # cParamTmp));
AppendBufLine(Obj_InsertBuffer, "* 输入参数 : " # cParamTmp);
iIndex = iIndex + 1
while(iIndex < _iParamCount)
{
cParamTmp = "";
cParamTmp = GetBufLine(_Obj_ParamBuffer, iIndex);
// cParamTmp = cat (cParamTmp, "\t\t\t")
iTmpLen = strlen(cParamTmp);
while(iTmpLen < BUFFERLEN)
{
cParamTmp = cat(cParamTmp, " ");
iTmpLen = iTmpLen + 1;
}
cParamTmp = cat(cParamTmp, Ask("Please Input the Descreption for Param : " # cParamTmp));
AppendBufLine(Obj_InsertBuffer, "* " # cParamTmp);
iIndex = iIndex + 1
}
}
AppendBufLine(Obj_InsertBuffer, "* 输出参数 : 无")
cParamTmp = "";
cParamTmp = Ask("Pleaser Input the Return Value on Success : ");
AppendBufLine(Obj_InsertBuffer, "* 返 回 值 : 成功 : " # cParamTmp);
cParamTmp = "";
cParamTmp = Ask("Pleaser Input the Return Value on Failure : ");
AppendBufLine(Obj_InsertBuffer, "* 失败 : " # cParamTmp)
cFuncHistory = "* 修改历史 : created by zunnajim by ";
Obj_SystemTime = GetSysTime(1)
cFuncHistory = cat(cFuncHistory, Obj_SystemTime.Year # "/" # Obj_SystemTime.Month # "/" # Obj_SystemTime.Day)
AppendBufLine(Obj_InsertBuffer, cFuncHistory);
cLastLine = "************************************************************/"
AppendBufLine(Obj_InsertBuffer, cLastLine);
iInsertLineCount = GetBufLineCount(Obj_InsertBuffer);
iInsertLineCount = iInsertLineCount - 1
while(iInsertLineCount >= 0)
{
InsBufLine(_Obj_FileBuffer, _iInserLine, GetBufLine(Obj_InsertBuffer, iInsertLineCount))
iInsertLineCount = iInsertLineCount - 1
}
CloseBuf(Obj_InsertBuffer);
return 0
}
/**********************************************************
* 函 数 名 : GetFunctionParams
* 函数功能 : 获取函数参数列表
* 输入参数 : _cText 函数声明所在行中的buffer
* 输出参数 : _Obj_ParamBuffer 函数参数
* 返 回 值 : 函数参数数量
* 修改历史 : created by zunnajim by 2023/5/28
************************************************************/
macro GetFunctionParams(_cText, _Obj_ParamBuffer)
{
if(_cText == nil || _Obj_ParamBuffer == hnil)
{
Msg("Invalid Function Declaration! Please Check Your Input Line and Function!")
return -1;
}
var iParamCount;
var iIndex;
var iTextLen;
var cParamTmp;
iParamCount = 0;
iIndex = 0;
iTextLen = strlen(_cText);
while(iIndex < iTextLen)
{
if(_cText[iIndex] == "(")
{
break;
}
iIndex = iIndex + 1;
}
if(iIndex == iTextLen)
{
return -1
}
while(iIndex < iTextLen)
{
if(")" == _cText[iIndex])
{
break;
}
if("_" == _cText[iIndex])
{
while("," != _cText[iIndex] && iIndex < iTextLen)
{
if(")" == _cText[iIndex])
{
break
}
cParamTmp = cat(cParamTmp , _cText[iIndex]);
iIndex = iIndex + 1;
}
AppendBufLine(_Obj_ParamBuffer, cParamTmp);
cParamTmp = ""
iParamCount = iParamCount + 1;
}
iIndex = iIndex + 1;
}
return iParamCount;
}
/**********************************************************
* 函 数 名 : InsertFuncHeader
* 函数功能 : 插入函数注释
* 输入参数 : 无
* 输出参数 : 无
* 返 回 值 : 无
* 修改历史 : created by zunnajim by 2023/5/28
************************************************************/
macro InsertFuncHeader()
{
var Obj_Window;
var Obj_FileBuffer;
var Obj_ParamBuffer;
var Obj_Symbol;
var cSymbolName;
var iSymbolLine;
var cSymbolText;
var iParamCount;
var iIndex;
var iRet;
Obj_Window = GetCurrentWnd();
Obj_FileBuffer = GetCurrentBuf();
// get Obj_symbol name in current line
cSymbolName = GetCurSymbol ()
// get the line number
iSymbolLine = GetSymbolLine(cSymbolName)
// get the symbol record
Obj_Symbol = GetSymbolLocationFromLn(Obj_FileBuffer, iSymbolLine)
cSymbolText = GetBufLine(Obj_FileBuffer, Obj_Symbol.lnFirst);
Obj_ParamBuffer = NewBuf("ParamBuffer");
if(hNil == Obj_ParamBuffer)
{
Msg("Obj_ParamBuffer is NULL!")
stop
}
iParamCount = GetFunctionParams(cSymbolText, Obj_ParamBuffer)
if(-1 == iParamCount)
{
Msg("GetFunctionParams returns " # iParamCount # "! and Failed! Macro Stop!");
CloseBuf(Obj_ParamBuffer);
stop;
}
iRet = InnerInsertFuncHeader(Obj_FileBuffer, iSymbolLine , cSymbolName, Obj_ParamBuffer, iParamCount);
if(0 != iRet)
{
Msg("InnerInsertFuncHeader returns" # iRet # "! and Failed! Macro Stop!")
CloseBuf(Obj_ParamBuffer);
stop;
}
CloseBuf(Obj_ParamBuffer);
}
/**********************************************************
* 函 数 名 : CommentSelectedBufferInCpp
* 函数功能 : 以C++的风格注释选中的buffer, 目前支持单行, 多行, 块状选择注释
* 输入参数 : 无
* 输出参数 : 无
* 返 回 值 : 无
* 修改历史 : created by zunnajim 2023/5/28
* modified by zunnajim 2023/06/08 added multiline comment, singleline comment, block style comment.
************************************************************/
macro CommentSelectedBufferInCpp()
{
var Obj_Window;
var Obj_WindowSelected;
var Obj_WindowBuffer;
var Obj_FirstLineBufer;
var Obj_LastLineBuffer;
var TOKEN_BEGIN;
var TOKEN_END;
var TAB;
var SPACE;
var iFirstLine;
var iFirstChIndex;
var iLastLine;
var iLastChIndex;
var ifExtended;
var ifRect;
TAB = CharFromAscii(9);
SPACE = CharFromAscii(32);
TOKEN_BEGIN = "/* ";
TOKEN_END = " */";
Obj_Window = GetCurrentWnd();
Obj_WindowSelected = GetWndSel(Obj_Window);
Obj_WindowBuffer = GetCurrentBuf();
iFirstLine = Obj_WindowSelected.lnFirst;
iLastLine = Obj_WindowSelected.lnLast;
iFirstChIndex = Obj_WindowSelected.ichFirst;
iLastChIndex = Obj_WindowSelected.ichLim;
ifExtended = Obj_WindowSelected.fExtended;
ifRect = Obj_WindowSelected.fRect;
/* the selection is extended to include more than one character and not block style*/
if(ifExtended && !ifRect)
{
/* multiline selection */
if(iFirstLine != iLastLine)
{
Obj_FirstLineBufer = GetBufLine(Obj_WindowBuffer, iFirstLine);
Obj_LastLineBuffer = GetBufLine(Obj_WindowBuffer, iLastLine);
Obj_FirstLineBufer = strmid(Obj_FirstLineBufer, 0, iFirstChIndex) # TOKEN_BEGIN # strmid(Obj_FirstLineBufer, iFirstChIndex, strlen(Obj_FirstLineBufer));
Obj_LastLineBuffer = strmid(Obj_LastLineBuffer, 0, iLastChIndex) # TOKEN_END # strmid(Obj_LastLineBuffer, iLastChIndex, strlen(Obj_LastLineBuffer));
PutBufLine(Obj_WindowBuffer, iFirstLine, Obj_FirstLineBufer);
PutBufLine(Obj_WindowBuffer, iLastLine, Obj_LastLineBuffer);
}
else /* single line selection */
{
var cBufferSelected;
var iPosition;
cBufferSelected = GetBufSelText(Obj_WindowBuffer);
iPosition = 0;
while(iPosition < strlen(cBufferSelected))
{
if(cBufferSelected[iPosition] != TAB && cBufferSelected[iPosition] != SPACE && cBufferSelected[iPosition] != ' ')
{
cBufferSelected = strmid(cBufferSelected, iPosition, strlen(cBufferSelected));
break;
}
iPosition = iPosition + 1;
}
cBufferSelected = cat(TOKEN_BEGIN, cBufferSelected);
cBufferSelected = cat (cBufferSelected, TOKEN_END)
SetBufSelText(Obj_WindowBuffer, cBufferSelected);
}
}
else if(ifRect) /* the selection is block style */
{
var iXPixelBegin;
var iXPixelEnd;
Var iIndexBegin;
var iIndexEnd;
var cBuffer;
iXPixelBegin = Obj_WindowSelected.xpLeft;
iXPixelEnd = Obj_WindowSelected.xpRight;
while(iFirstLine <= iLastLine)
{
cBuffer = GetBufLine(Obj_WindowBuffer, iFirstLine);
if(strlen(cBuffer) > 0)
{
iIndexBegin = IchFromXpos(Obj_Window, iFirstLine, iXPixelBegin);
iIndexEnd = IchFromXpos(Obj_Window, iFirstLine, iXPixelEnd);
cBuffer = strmid(cBuffer, 0, iIndexBegin) # TOKEN_BEGIN # strmid(cBuffer, iIndexBegin, iIndexEnd) # TOKEN_END # strmid(cBuffer, iIndexEnd, strlen(cBuffer));
PutBufLine(Obj_WindowBuffer, iFirstLine, cBuffer);
}
iFirstLine = iFirstLine + 1;
}
}
else /* the selection is a simple insertion point */
{
var cBuffer;
var cBufferTmp;
var iPosition;
cBuffer = GetBufLine(Obj_WindowBuffer, iFirstLine);
iPosition = 0;
while(iPosition < strlen(cBuffer))
{
if(cBuffer[iPosition] != TAB && cBuffer[iPosition] != SPACE && cBuffer[iPosition] != ' ')
{
break;
}
iPosition = iPosition + 1;
}
cBufferTmp = strmid(cBuffer, 0, iPosition);
cBuffer = strmid(cBuffer, iPosition, strlen(cBuffer));
PutBufLine(Obj_WindowBuffer, iFirstLine, cBufferTmp # TOKEN_BEGIN # cBuffer # TOKEN_END);
}
}
/**********************************************************
* 函 数 名 : UnCommentSelectedBufferInCpp
* 函数功能 : 取消选中buffer的注释, 与CommentSelectedBufferInCpp配对使用
* 输入参数 : 无
* 输出参数 : 无
* 返 回 值 : 无
* 修改历史 : created by zunnajim by 2023/5/28
************************************************************/
macro UnCommentSelectedBufferInCpp()
{
var Obj_Window;
var Obj_WindowSelected;
var Obj_WindowBuffer;
var Obj_FirstLineBufer;
var Obj_LastLineBuffer;
var TOKEN_BEGIN;
var TOKEN_END;
var TAB;
var SPACE;
var iFirstLine;
var iFirstChIndex;
var iLastLine;
var iLastChIndex;
var ifExtended;
var ifRect;
TAB = CharFromAscii(9);
SPACE = CharFromAscii(32);
TOKEN_BEGIN = "/* ";
TOKEN_END = " */";
Obj_Window = GetCurrentWnd();
Obj_WindowSelected = GetWndSel(Obj_Window);
Obj_WindowBuffer = GetCurrentBuf();
iFirstLine = Obj_WindowSelected.lnFirst;
iLastLine = Obj_WindowSelected.lnLast;
iFirstChIndex = Obj_WindowSelected.ichFirst;
iLastChIndex = Obj_WindowSelected.ichLim;
ifExtended = Obj_WindowSelected.fExtended;
ifRect = Obj_WindowSelected.fRect;
/* the selection is extended to include more than one character and not block style*/
if(ifExtended && !ifRect)
{
/* multiline selection */
if(iFirstLine != iLastLine)
{
Obj_FirstLineBufer = GetBufLine(Obj_WindowBuffer, iFirstLine);
Obj_LastLineBuffer = GetBufLine(Obj_WindowBuffer, iLastLine);
if((TOKEN_BEGIN != strmid(Obj_FirstLineBufer, iFirstChIndex, iFirstChIndex + strlen(TOKEN_BEGIN))) ||
(TOKEN_END != strmid(Obj_LastLineBuffer, iLastChIndex - strlen(TOKEN_END), iLastChIndex)))
{
Msg("Invalid Comment Format! EXITING!");
stop;
}
Obj_FirstLineBufer = strmid(Obj_FirstLineBufer, 0, iFirstChIndex) # strmid(Obj_FirstLineBufer, iFirstChIndex + strlen(TOKEN_BEGIN), strlen(Obj_FirstLineBufer));
Obj_LastLineBuffer = strmid(Obj_LastLineBuffer, 0, iLastChIndex - strlen(TOKEN_END));
PutBufLine(Obj_WindowBuffer, iFirstLine, Obj_FirstLineBufer);
PutBufLine(Obj_WindowBuffer, iLastLine, Obj_LastLineBuffer);
}
else
{
var cBufferSelected;
var iPosition;
cBufferSelected = GetBufSelText(Obj_WindowBuffer);
iPosition = 0;
while(iPosition < strlen(cBufferSelected))
{
if(cBufferSelected[iPosition] != TAB && cBufferSelected[iPosition] != SPACE && cBufferSelected[iPosition] != ' ')
{
cBufferSelected = strmid(cBufferSelected, iPosition, strlen(cBufferSelected));
break;
}
iPosition = iPosition + 1;
}
if((TOKEN_BEGIN != strmid(cBufferSelected, 0, strlen(TOKEN_BEGIN))) ||
(TOKEN_END != strmid(cBufferSelected, strlen(cBufferSelected) - strlen(TOKEN_END), strlen(cBufferSelected))))
{
Msg("Invalid Comment Format! EXITING!");
Msg(cBufferSelected);
}
cBufferSelected = strmid(cBufferSelected, strlen(TOKEN_BEGIN), strlen(cBufferSelected) - strlen(TOKEN_END));
SetBufSelText(Obj_WindowBuffer, cBufferSelected);
}
}
else if(ifRect)
{
var iXPixelBegin;
var iXPixelEnd;
Var iIndexBegin;
var iIndexEnd;
var cBuffer;
iXPixelBegin = Obj_WindowSelected.xpLeft;
iXPixelEnd = Obj_WindowSelected.xpRight;
while(iFirstLine <= iLastLine)
{
cBuffer = GetBufLine(Obj_WindowBuffer, iFirstLine);
if(strlen(cBuffer) > 0)
{
iIndexBegin = IchFromXpos(Obj_Window, iFirstLine, iXPixelBegin);
iIndexEnd = IchFromXpos(Obj_Window, iFirstLine, iXPixelEnd);
cBuffer = strmid(cBuffer, 0, iIndexBegin) # strmid(cBuffer, iIndexBegin + strlen(TOKEN_BEGIN), iIndexEnd - strlen(TOKEN_END)) # strmid(cBuffer, iIndexEnd, strlen(cBuffer));
PutBufLine(Obj_WindowBuffer, iFirstLine, cBuffer);
}
iFirstLine = iFirstLine + 1;
}
}
else
{
var cBuffer;
var cBufferTmp;
var iPosition;
cBuffer = GetBufLine(Obj_WindowBuffer, iFirstLine);
iPosition = 0;
while(iPosition < strlen(cBuffer))
{
if(cBuffer[iPosition] != TAB && cBuffer[iPosition] != SPACE && cBuffer[iPosition] != ' ')
{
break;
}
iPosition = iPosition + 1;
}
if(strlen(cBuffer) < (strlen(TOKEN_BEGIN) + strlen(TOKEN_END)))
{
Msg("Comment String Not Found!");
stop;
}
cBufferTmp = strmid(cBuffer, 0, iPosition);
cBuffer = strmid(cBuffer, iPosition, strlen(cBuffer));
if((TOKEN_BEGIN != strmid(cBuffer, 0, strlen(TOKEN_BEGIN))) || (TOKEN_END != strmid(cBuffer, strlen(cBuffer) - strlen(TOKEN_END), strlen(cBuffer))))
{
Msg("Invalid Comment Format! EXITING!");
Msg(cBuffer);
}
PutBufLine(Obj_WindowBuffer, iFirstLine, cBufferTmp # strmid(cBuffer, strlen(TOKEN_BEGIN), strlen(cBuffer) - strlen(TOKEN_END));
}
}