语法加亮
看到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的
后来忙了,就放到一边了