zoukankan      html  css  js  c++  java
  • 改进Source Insight对汉字的支持

    转自:http://blog.chinaunix.net/u/8681/showart_1356633.html
    http://blog.163.com/zhuzhihuacan@126/blog/static/12757945420102123576521/                           
    我的版本:
    改进Source <wbr>Insight对汉字的支持
    解决汉字乱码的问题,一句话说就是调整字体为宋体
    改进Source <wbr>Insight对汉字的支持
    之 后会打开对话框:
    改进Source <wbr>Insight对汉字的支持之 后注释中就可以正常输入中文了,字距正常。< br>
    下面是一个宏定义文件,绑定了Backspace,让它能正确删除一个汉字。
    需要先关闭当前项目,打开Base项目,这个Base项目是Source Insight为你自带的,代表项目的项目设置,你的其它自建项目应该是以它为基础。
    改进Source <wbr>Insight对汉字的支持
    会 打开下面的对话框,在其中选择Base项目打开。
    改进Source <wbr>Insight对汉字的支持
    在Base Project中,新建一个SuperBackSpace.em文件,把下面所给出的代码写到文件中保存到 Base 项目中:
    在项目文件列表中用右键单击:
    改进Source <wbr>Insight对汉字的支持然 后,打开键绑定对话框:
    改进Source <wbr>Insight对汉字的支持会 打开下面的对话框:刚才添加进来的宏定义文件中新定义的宏 SuperBackspace就列在下面 Command 一栏。
    改进Source <wbr>Insight对汉字的支持
    在 Command:下面的字体框中输入Mac, 下面的列表会只显示以Mac开头的项。这样很容易就选择到了这个宏,然后点击"Assign New Key..."按钮,弹出下面的对话框,改进Source <wbr>Insight对汉字的支持
    此时按下退格键(Backspace),"确定" 退出即可。设置成功后该对话框显示为:
    改进Source <wbr>Insight对汉字的支持
    此 时再试一下退格键,可以成功删除一整个汉字了。但是:
    用鼠标选择注释中的汉字部分,仍然可以选中“半个“汉字,此时显示为乱码。
    而 用左右箭头键移动光标时,仍然可以移动到一个汉字的半中间,就是说移动光标仍然是半个汉字为单位。
    改进Source <wbr>Insight对汉字的支持
    上面 一行是鼠标选中半个汉字的情况,下面的那行是光标移到汉字“中”的半中间时,光标闪烁至刚好显示那个小棍棍时的截截。
    另外。在base 项目中选中 SuperBackspace.em 本身,在下面的Context窗口中可以看到该文件的内容,这个文件开头的部分是中文注释,显示为乱码,在Context中右键单击,改变字体为宋体,仍 然会显示乱码,汉字有的能正常显示,有的则不能。
    改进Source <wbr>Insight对汉字的支持
    Source Insight对汉字的支持,说一句糟糕真不过分。

    使用下面的一个宏,即 Project→Open Project,

    打开Base项目;

    新建一个SuperBackSpace.em文件,将下面的代码加入进去并保存,

    把SuperBackSpace.em文件复制到Base工程的工程目录下。选择【Project】→【Add and Remove Project Files...】打开对话框,加入SuperBackSpace.em文件;重启 SourceInsight;

    打开Options→Key Assignments(对话框)

    将Marco: SuperBackspace绑定到BackSpace键(在Key Assignments 对话框中先选中Commant 一栏的Marco:SuperBackspace,然后点击按钮“Assign New Key” 会弹出一个提示框,接着用手指按下键盘上的“Backspace”键,然后再点击“是/YES”,最后在点击“OK/确认”这样 就可以了,下面类似)

    Marco: SuperCursorLeft绑定到<-键

    Marco: SuperCursorRight绑定到->键

    Marco: SuperShiftCursorLeft绑定到Shift+<-

    macro,SuperShiftCursorRight绑定到 shift+->

    Macro:SuperDelete绑定到del。

    代码:

    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

    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[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.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();
    }

    注:如果加入SuperBackSpace.em 后出现非法关闭sourceinsight 则需要把原先自带的utils.em从base项目中去掉才行,去掉不影响使用,我的就是出现了这个问题,结果异常关闭之后,每次再打开都是自动异常关闭,最后不得已删除我的文档中的sourceinsight目录,然后重装才搞定,所以最好在Add and Remove Project Files...】SuperBackSpace.em 时,把utils.em给去除掉。

  • 相关阅读:
    log4net编译后命名空间找不到的问题
    网络流建模汇总
    零散知识点收集
    CentOS7中“ONBOOT”已设置为“yes”但开机后ens33不会自启动解决方案
    Hanoi塔问题
    Mosquitto用户名密码配置
    Activiti5 数据库表结构
    皮尔森相关系数(Pearson correlation coefficient)
    如何用研发流程搞垮一个团队?
    Java 编程规范
  • 原文地址:https://www.cnblogs.com/AI-Algorithms/p/3356634.html
Copyright © 2011-2022 走看看