您的位置:首页 > 其它

SourceInsight 3.5 多行注释和删除汉字乱码问题 解决方案

2016-10-21 12:45 344 查看
/*======================================================================

0、单行、多行注释:设定快捷键 alt + /

======================================================================*/

macro MultiLineComment() 

{

    hwnd = GetCurrentWnd()

    selection = GetWndSel(hwnd)

    LnFirst = GetWndSelLnFirst(hwnd)      //取首行行号  

    LnLast = GetWndSelLnLast(hwnd)      //取末行行号  

    hbuf = GetCurrentBuf()  

   

    if(GetBufLine(hbuf, 0) == "//magic-number:tph85666031"){  

        stop  

    }

   

    Ln = Lnfirst  

    buf = GetBufLine(hbuf, Ln)  

    len = strlen(buf)  

   

    while(Ln <= Lnlast) {  

        buf = GetBufLine(hbuf, Ln)  //取Ln对应的行  

        if(buf == ""){              //跳过空行  

            Ln = Ln + 1  

            continue  

        }  

   

        if(StrMid(buf, 0, 1) == "/") {       //需要取消注释,防止只有单字符的行  

            if(StrMid(buf, 1, 2) == "/"){  

                PutBufLine(hbuf, Ln, StrMid(buf, 2, Strlen(buf)))  

            }  

        }  

   

        if(StrMid(buf,0,1) != "/"){          //需要添加注释  

            PutBufLine(hbuf, Ln, Cat("//", buf))  

        }

        Ln = Ln + 1

    }

   

    SetWndSel(hwnd, selection)  

}

/*======================================================================

1、BackSpace后退键

======================================================================*/

macro SuperBackspace()

{

    hwnd = GetCurrentWnd();

    hbuf = GetCurrentBuf();

    if (hbuf == 0)

        stop;   // empty buffer

    // get current cursor postion

    ipos = GetWndSelIchFirst(hwnd);

    // get current line number

    ln = GetBufLnCur(hbuf);

    if ((GetBufSelText(hbuf) != "") || (GetWndSelLnFirst(hwnd) != GetWndSelLnLast(hwnd))) {

        // sth. was selected, del selection

        SetBufSelText(hbuf, " ");  // stupid & buggy sourceinsight 

        // del the " "

        SuperBackspace(1);

        stop;

    }

    // copy current line

    text = GetBufLine(hbuf, ln);

    // get string length

    len = strlen(text);

    // if the cursor is at the start of line, combine with prev line

    if (ipos == 0 || len == 0) {

        if (ln <= 0)

            stop;   // top of file

        ln = ln - 1;    // do not use "ln--" for compatibility with older versions

        prevline = GetBufLine(hbuf, ln);

        prevlen = strlen(prevline);

        // combine two lines

        text = cat(prevline, text);

        // del two lines

        DelBufLine(hbuf, ln);

        DelBufLine(hbuf, ln);

        // insert the combined one

        InsBufLine(hbuf, ln, text);

        // set the cursor position

        SetBufIns(hbuf, ln, prevlen);

        stop;

    }

    num = 1; // del one char

    if (ipos >= 1) {

        // process Chinese character

        i = ipos;

        count = 0;

        while (AsciiFromChar(text[i - 1]) >= 160) {

            i = i - 1;

            count = count + 1;

            if (i == 0)

                break;

        }

        if (count > 0) {

            // I think it might be a two-byte character

            num = 2;

            // This idiot does not support mod and bitwise operators

            if ((count / 2 * 2 != count) && (ipos < len))

                ipos = ipos + 1;    // adjust cursor position

        }

    }

    // keeping safe

    if (ipos - num < 0)

        num = ipos;

    // del char(s)

    text = cat(strmid(text, 0, ipos - num), strmid(text, ipos, len));

    DelBufLine(hbuf, ln);

    InsBufLine(hbuf, ln, text);

    SetBufIns(hbuf, ln, ipos - num);

    stop;

}

/*======================================================================

2、删除键——SuperDelete.em    这个暂时就不用了,在出现半字的时候。

//可以用del键来处理。

======================================================================*/

macro SuperDelete()

{

    hwnd = GetCurrentWnd();

    hbuf = GetCurrentBuf();

    if (hbuf == 0)

        stop;   // empty buffer

    // get current cursor postion

    ipos = GetWndSelIchFirst(hwnd);

    // get current line number

    ln = GetBufLnCur(hbuf);

    if ((GetBufSelText(hbuf) != "") || (GetWndSelLnFirst(hwnd) != GetWndSelLnLast(hwnd))) {

        // sth. was selected, del selection

        SetBufSelText(hbuf, " "); // stupid & buggy sourceinsight 

        // del the " "

        SuperDelete(1);

        stop;

    }

    // copy current line

    text = GetBufLine(hbuf, ln);

    // get string length

    len = strlen(text);

       

    if (ipos == len || len == 0) {

totalLn = GetBufLineCount (hbuf);

lastText = GetBufLine(hBuf, totalLn-1);

lastLen = strlen(lastText);

        if (ipos == lastLen)// end of file

   stop;

        ln = ln + 1;    // do not use "ln--" for compatibility with older versions

        nextline = GetBufLine(hbuf, ln);

        nextlen = strlen(nextline);

        // combine two lines

        text = cat(text, nextline);

        // del two lines

        DelBufLine(hbuf, ln-1);

        DelBufLine(hbuf, ln-1);

        // insert the combined one

        InsBufLine(hbuf, ln-1, text);

        // set the cursor position

        SetBufIns(hbuf, ln-1, len);

        stop;

    }

    num = 1; // del one char

    if (ipos > 0) {

        // process Chinese character

        i = ipos;

        count = 0;

      while (AsciiFromChar(text[i-1]) >= 160) {

            i = i - 1;

            count = count + 1;

            if (i == 0)

                break;

        }

        if (count > 0) {

            // I think it might be a two-byte character

            num = 2;

            // This idiot does not support mod and bitwise operators

            if (((count / 2 * 2 != count) || count == 0) && (ipos < len-1))

                ipos = ipos + 1;    // adjust cursor position

        }

// keeping safe

if (ipos - num < 0)

            num = ipos;

    }

    else {

i = ipos;

count = 0;

while(AsciiFromChar(text) >= 160) {

     i = i + 1;

     count = count + 1;

     if(i == len-1)

   break;

}

if(count > 0) {

     num = 2;

}

    }

    

    text = cat(strmid(text, 0, ipos), strmid(text, ipos+num, len));

    DelBufLine(hbuf, ln);

    InsBufLine(hbuf, ln, text);

    SetBufIns(hbuf, ln, ipos);

    stop;

}

/*======================================================================

3、左移键——SuperCursorLeft.em

======================================================================*/

macro IsComplexCharacter()

{

hwnd = GetCurrentWnd();

hbuf = GetCurrentBuf();

if (hbuf == 0)

   return 0;

//当前位置

pos = GetWndSelIchFirst(hwnd);

//当前行数

ln = GetBufLnCur(hbuf);

//得到当前行

text = GetBufLine(hbuf, ln);

//得到当前行长度

len = strlen(text);

//从头计算汉字字符的个数

if(pos > 0)

{

   i=pos;

   count=0;

   while(AsciiFromChar(text[i-1]) >= 160)

   { 

    i = i - 1;

    count = count+1;

    if(i == 0) 

     break;

   }

   if((count/2)*2==count|| count==0)

    return 0;

   else

    return 1;

}

return 0;

}

macro moveleft()

{

hwnd = GetCurrentWnd();

hbuf = GetCurrentBuf();

if (hbuf == 0)

        stop;   // empty buffer

        

ln = GetBufLnCur(hbuf);

ipos = GetWndSelIchFirst(hwnd);

if(GetBufSelText(hbuf) != "" || (ipos == 0 && ln == 0))   // 第0行或者是选中文字,则不移动

{

   SetBufIns(hbuf, ln, ipos);

   stop;

}

if(ipos == 0)

{

   preLine = GetBufLine(hbuf, ln-1);

   SetBufIns(hBuf, ln-1, strlen(preLine)-1);

}

else

{

   SetBufIns(hBuf, ln, ipos-1);

}

}

macro SuperCursorLeft()

{

moveleft();

if(IsComplexCharacter())

   moveleft();

}

/*======================================================================

4、右移键——SuperCursorRight.em

======================================================================*/

macro moveRight()

{

hwnd = GetCurrentWnd();

hbuf = GetCurrentBuf();

if (hbuf == 0)

        stop;   // empty buffer

ln = GetBufLnCur(hbuf);

ipos = GetWndSelIchFirst(hwnd);

totalLn = GetBufLineCount(hbuf);

text = GetBufLine(hbuf, ln); 

if(GetBufSelText(hbuf) != "")   //选中文字

{

   ipos = GetWndSelIchLim(hwnd);

   ln = GetWndSelLnLast(hwnd);

   SetBufIns(hbuf, ln, ipos);

   stop;

}

if(ipos == strlen(text)-1 && ln == totalLn-1) // 末行

   stop;      

if(ipos == strlen(text))

{

   SetBufIns(hBuf, ln+1, 0);

}

else

{

   SetBufIns(hBuf, ln, ipos+1);

}

}

macro SuperCursorRight()

{

moveRight();

if(IsComplexCharacter()) // defined in SuperCursorLeft.em

   moveRight();

}

/*======================================================================

5、shift+右移键——ShiftCursorRight.em

======================================================================*/

macro IsShiftRightComplexCharacter()

{

hwnd = GetCurrentWnd();

hbuf = GetCurrentBuf();

if (hbuf == 0)

   return 0;

selRec = GetWndSel(hwnd);

pos = selRec.ichLim;

ln = selRec.lnLast;

text = GetBufLine(hbuf, ln);

len = strlen(text);

if(len == 0 || len < pos)

return 1;

//Msg("@len@;@pos@;");

if(pos > 0)

{

   i=pos;

   count=0; 

   while(AsciiFromChar(text[i-1]) >= 160)

   { 

    i = i - 1;

    count = count+1;   

    if(i == 0) 

     break;    

   }

   if((count/2)*2==count|| count==0)

    return 0;

   else

    return 1;

}

return 0;

}

macro shiftMoveRight()

{

hwnd = GetCurrentWnd();

hbuf = GetCurrentBuf();

if (hbuf == 0)

        stop; 

        

ln = GetBufLnCur(hbuf);

ipos = GetWndSelIchFirst(hwnd);

totalLn = GetBufLineCount(hbuf);

text = GetBufLine(hbuf, ln); 

selRec = GetWndSel(hwnd);   

curLen = GetBufLineLength(hbuf, selRec.lnLast);

if(selRec.ichLim == curLen+1 || curLen == 0)



   if(selRec.lnLast == totalLn -1)

    stop;

   selRec.lnLast = selRec.lnLast + 1; 

   selRec.ichLim = 1;

   SetWndSel(hwnd, selRec);

   if(IsShiftRightComplexCharacter())

    shiftMoveRight();

   stop;

}

selRec.ichLim = selRec.ichLim+1;

SetWndSel(hwnd, selRec);

}

macro SuperShiftCursorRight()

{       

if(IsComplexCharacter())

   SuperCursorRight();

shiftMoveRight();

if(IsShiftRightComplexCharacter())

   shiftMoveRight();

}

/*======================================================================

6、shift+左移键——ShiftCursorLeft.em

======================================================================*/

macro IsShiftLeftComplexCharacter()

{

hwnd = GetCurrentWnd();

hbuf = GetCurrentBuf();

if (hbuf == 0)

   return 0;

selRec = GetWndSel(hwnd);

pos = selRec.ichFirst;

ln = selRec.lnFirst;

text = GetBufLine(hbuf, ln);

len = strlen(text);

if(len == 0 || len < pos)

   return 1;

//Msg("@len@;@pos@;");

if(pos > 0)

{

   i=pos;

   count=0; 

   while(AsciiFromChar(text[i-1]) >= 160)

   { 

    i = i - 1;

    count = count+1;   

    if(i == 0) 

     break;    

   }

   if((count/2)*2==count|| count==0)

    return 0;

   else

    return 1;

}

return 0;

}

macro shiftMoveLeft()

{

hwnd = GetCurrentWnd();

hbuf = GetCurrentBuf();

if (hbuf == 0)

        stop; 

        

ln = GetBufLnCur(hbuf);

ipos = GetWndSelIchFirst(hwnd);

totalLn = GetBufLineCount(hbuf);

text = GetBufLine(hbuf, ln); 

selRec = GetWndSel(hwnd);   

//curLen = GetBufLineLength(hbuf, selRec.lnFirst);

//Msg("@curLen@;@selRec@");

if(selRec.ichFirst == 0)



   if(selRec.lnFirst == 0)

    stop;

   selRec.lnFirst = selRec.lnFirst - 1;

   selRec.ichFirst = GetBufLineLength(hbuf, selRec.lnFirst)-1;

   SetWndSel(hwnd, selRec);

   if(IsShiftLeftComplexCharacter())

    shiftMoveLeft();

   stop;

}

selRec.ichFirst = selRec.ichFirst-1;

SetWndSel(hwnd, selRec);

}

macro SuperShiftCursorLeft()

{

if(IsComplexCharacter())

   SuperCursorLeft();

shiftMoveLeft();

if(IsShiftLeftComplexCharacter())

   shiftMoveLeft();

}
/*---END---*/ 

将上述代码,添加到"文档\SourceInsight\Project\utils.em"中,按照如代码中注释设定快捷键(当然,多行注释可以看个人喜好修改)。

便可以实现

1.多行注释

2.左右箭头,退格... 直接对汉字的操作。

//注:当然,汉字操作并不完全(我试过 “?(中文的问号)”,依旧显示乱码),因此del不建议也修改快捷键。

//del仅仅在出现汉字乱码问题的时候使用,其他情况使用“退格”就好
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: