sourceinsight - Perfect support for Chinese comments

  1. Project→Open Project, open the Base project, and copy all the content functions in the code box in the text to the end of the utils.em file;
  2. Restart SourceInsight;
  3. Options→Key Assignments, bind the following macros to the corresponding keys in turn:
    • Marco: SuperBackspace is bound to the BackSpace key;
    • Marco: SuperCursorLeft is bound to the <- key,
    • Marco: SuperCursorRight is bound to -> key,
    • Marco: SuperShiftCursorLeft is bound to Shift+<-,
    • Macro: SuperShiftCursorRight is bound to shift+->,
    • Macro: SuperDelete binds to del
  4. Enjoy
/*======================================================================
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);
    //getstring 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;//donot 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 modand 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
======================================================================*/
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);
    //getstring 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;//donot 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 modand 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---*/

Note: The method to solve the Chinese spacing of source insight: By default, enter Chinese into Source Insight, and the word spacing is quite large. To solve this problem, the specific settings are as follows:

  1. Options->Style Properties
  2. *Find Comment Multi Line and Comment under the Style Name on the left.
    Select "Pick..." in the Font Name under the corresponding Font property box on the right, and set it to Arial, Regular, and Small Four. OK, return to the Style Properties interface, and set the
    Size to 10. Finally, set Foreground under the Clolors box, click "Pick..." to choose a color you like and it's OK. *

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325426492&siteId=291194637