SourceInsight自定义宏实现C/C++风格注释以及函数注释插入

SourceInsight自定义宏实现C/C++风格注释以及函数注释插入

已实现的功能:

  1. C风格(//)注释、取消注释选中行
  2. C++风格(/* */)注释、取消注释选中行
  3. C++风格(/* */)注释、取消注释块状选择
  4. 函数头注释插入(函数说明、入参、出参、作者等信息 )
  5. 使用#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));
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑暗守护者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值