xenogear

当知道了某样知识之后,就会发现其实什么都不知道

语法加亮

看到sumtec的那个加亮的东东,想起来我也写过一个语法加亮的控件,  全是用正则表达式完成的
处理关键字的时候,使用下面的表达式
     info.KeywordExpression = "[\\W|\\s]+" + info.KeyWordName + "[\\W|\\s]+|^" + info.KeyWordName + "[\\W|\\s]+|[\\W|\\s]+" + info.KeyWordName +"$";
还用到了一些分割符
    char[] seperator = new char[]{' ', '\n', '(', ')', ',', '[', ']', '{', '}', ';', '=', '+', '-', '/', '*', '%', '\t', '>', '<', '\\'};

还处理了模式,表达式如 .*/\*.*\*/.* 用来处理c语言的注释

自动缩进处理很简单
    if(e.KeyChar == (char)13)
    {
     int lineNumber = this.rtbSpace.GetLineFromCharIndex(currPosition);
     if(lineNumber > 0)
     {
      string previousLineContent = this.rtbSpace.Lines[lineNumber - 1];
      this.PerformAutoIncrement(sender, previousLineContent);
     }
    }
    currPosition = this.rtbSpace.SelectionStart;


  private void PerformAutoIncrement(object sender, string inputString)
  {
   try
   {
    int currPosition = this.rtbSpace.SelectionStart;
    if(inputString.StartsWith("\t") || (inputString.LastIndexOf("{") == inputString.Length - 1 && inputString.LastIndexOf("{") != -1))
    {
     string s = "\t";
     object o = Clipboard.GetDataObject().GetData(typeof(string));
     if(o != null)
      s = o.ToString();
     Clipboard.SetDataObject("\t", false);
     this.rtbSpace.Paste();
     if(s != null)
      Clipboard.SetDataObject(s);
     this.rtbSpace.SelectionStart = currPosition + 1;
     this.PerformAutoIncrement(sender, inputString.Substring(1));
    }
   }
   catch(Exception ex)
   {
    throw ex;
   }
  }

在处理intellisense的时候,想用激发的关键字,比如
<Intellisense RaiseChar="(" Prefix="printf" EndChar=")" Content="char*, ..." />
简单的测了一下,没有多大问题,有些情况下好像是有bug的
后来忙了,就放到一边了

posted on 2004-07-28 12:44  什么都不知道  阅读(1208)  评论(2编辑  收藏  举报

导航