解决source insight输入中文间距大,删除键Del键左右方向光标半个汉字的问题

来源:互联网 发布:ubuntu alt 指令 编辑:程序博客网 时间:2024/06/06 12:23

在默认情况下,往Source Insight里输入中文,字间距相当的大,下面将帮助你解决这个问题。具体设置如下:
1.Options->Style Properties
2. 在左边Style Name下找到Comment Multi Line和Comment.在其右边对应的Font属性框下的Font Name中选“Pick...” 设置为宋体、常规、小四。确定,退回Style Properties界面,Size设为10。最后设置Clolors框下Foreground,点“Pick...”选择一种自己喜欢的颜色就OK了。
3.完成

Source Insight3 中文操作(左右键、删除和后退键)支持宏:

解决方法:

1.打开 Project→Open Project,打开Base项目;
2.复制下面的宏代码段复制粘贴到utils.em文件的最后(原有内容留着不动),使其添加入Base项目;
3.重启SourceInsight;
4.Options→Key Assignments,将Marco: SuperBackspace绑定到BackSpace键;

5.同样的操作Del键和左右键,分别绑定相应的键位。

 

下面是宏代码,可以整个拷贝,附加到utils.em文件的最后

//1、后退键/** 代替SourceInsight原有的Backspace功能(希望如此)* 增加了对双字节汉字的支持,在删除汉字的时候也能同时删除汉字的高字节而缓解半个汉字问题* 能够对光标在汉字中间的情况进行自动修正* This program is free software; you can redistribute it and/or modify* it under the terms of the GNU General Public License as published by* the Free Software Foundation; either version 2 of the License, or* (at your option) any later version.** This program is distributed in the hope that it will be useful,* but WITHOUT ANY WARRANTY; without even the implied warranty of* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the* GNU General Public License for more details.** You should have received a copy of the GNU General Public License* along with this program; if not, write to the Free Software* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA*/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;}//参考上面以及SourceInsight中的chm帮助文档;//有缺点:(1)移动箭头也会记录到历史操作步骤,应该能够避免这些操作被记录;(2)函数没有整理,有冗余;//2、删除键——SuperDelete.emmacro 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 safeif (ipos - num < 0)            num = ipos;    }    else {i = ipos;count = 0;while(AsciiFromChar(text[i]) >= 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.emmacro 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 bufferln = 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.emmacro moveRight(){hwnd = GetCurrentWnd();hbuf = GetCurrentBuf();if (hbuf == 0)        stop;   // empty bufferln = 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.emmacro 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.emmacro 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();}



 

转自:http://blog.sina.com.cn/s/blog_628bebe4010137il.html

原创粉丝点击