Winform语法高亮的编辑器比拼
先鼓励一下园子里面的一位兄弟,这个是他自己些的东西
http://surfsky.cnblogs.com/archive/2005/12/12/295814.html
他也说现在他也不用这个东西了,AnyWay,鼓励一下!
举几个说说事,以后慢慢的补上。
ICSharpCode.TextEditor
这个东西是作为著名的开发工具SharpDevelop的一个开发组件存在,就是其中的代码编辑器,功能自是不必说,强大。
而且,开源!
语法文件集成到编译包中,目前支持的不是很多,XML配置,很简单,语法高亮可以使用程序设置,目前是我首选。
Essential Studio
Syncfusion公司出品的套件中包含了一个Editor,支持所有的编辑器的功能。你想要的都有了,呵呵,语法文件内置,也可以引入,非常不错,功能介绍自己上主站去看吧。
这个东西的问题一是版权,而是中文支持比较菜,我尝试修改了一下代码,但是还是存在光标定位的问题,代码太复杂了,跟踪了很久,也就放弃了。
Scintilla
http://scintilla.sourceforge.net/index.html
老牌的C下面的编辑器了,最大的优点就是跨平台的实现,有个仁兄封装了一个DotNet的包,所以才会在这里出现,呵呵,开源,但是看不懂,复杂啊复杂。
可能是考虑太多的平台移植性,这个东西的界面有些~~~嗯,丑陋。至少比起它的其他兄弟姐妹来说,它的界面就显得很老土了。
语法加亮是没有问题的,积累了这么多的经验,怎么也能划拉啦。配置文件使用unix的配置信息文件,显得有些落伍,但是就本身而言,配置文件也就是这样了,XML最多也就是多一个层次而已,呵呵,没什么可以值得炫耀的。
代码折叠就有些哪样了,至少我看不惯,很像JBuilder的代码折叠,TM折叠了一半。而且前面的那个图标也有点那个啥,呵呵。
无中文问题,很顺利,也很意外,至少和其他的几个比起来,这点做的不错。速度非常快,要说是C的?太违心了,还是代码写得好啊。
结论:我肯定是不用的。
FireEdit
http://sourceforge.net/projects/dotnetfireball
实话说,就一个编辑器,附加那么多DLL,有些不合算,呵呵。
语法文件内置,编译的时候已经提供了大量的语法文件,是全部编辑器里面内置最多的一个编辑器。可以使用DLL文件对语法进行扩充。提供设置界面对语法高亮进行设置,只是界面不咋滴,呵呵,过于简单了一些。提供传说中的无限级别的redo功能,这个功能的确是编辑器不可或缺的。提供find和replace 功能。中文支持不是差劲的问题,是非常非常差劲。一旦输入中文就会出现光标位置不对,@_@.
代码折叠存在问题,没有办法折叠注释块。正常的代码折叠,我测试了一下C#和Java没有问题,但是XML折叠存在问题,只能折叠CDATA,有点不可思议。
折叠的方式比较漂亮,和VS的风格一致
有意思的是,这个编辑器组件对在注释中的东东也进行了语法高亮、括号匹配,不知道是错误还是就是如此,哈哈。
致命伤:输入中文的时候出现错误,例如你输入"测试",在编辑器里面会出现"测试测试",任何中文字符都是如此,如果使用Copy则不会出现这样的问题。在输入中文的时候redo也存在问题,原本输入两个汉字变成4个汉字,但是redo的时候却需要redo 4次,:)。有兴趣的同学可以直接打开源代码,参考后面我提供的那个Essential Studio修改一下,呵呵,我老早之前看过它的源代码,现在已经忘记了是那个类了。
结论:我不会用,因为我要输入中文。
Appendix
Syncfusion Editor组件支持中文
StreamEditControl.cs
函数protected void TextInsertInternal( int iLine, int iColumn, string str, bool update, bool bUseTabStops )
修改
if (m_wrapper.Encoding.GetMaxByteCount(1) == 1 && Encoding.Default.GetByteCount(str) > str.Length &&
m_wrapper.Encoding.GetString( m_wrapper.Encoding.GetBytes( str ) ) != str)
{
ChangeEncoding( Encoding.Default );//强制转换成default的编码方式
}
protected override void OnKeyPress( KeyPressEventArgs e )
if( !e.Handled )
{
ProcessAutoReplace( e.KeyChar );
InsertChar( e.KeyChar );
ProcessIntellisenseKey( e );
e.Handled = true;//增加本行,如果不增加则输入中文的时候会重复输入一次,寒
}
RegexTokenizer.cs
构造函数
public RegexTokenizer(Stream input)
{ m_reader = new StreamReader(input, Encoding.Default, true); //这里最重要,否则什么都是白搭
修改之后没解决的问题
光标移动的时候会出现错位
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/skyremember/archive/2008/10/21/3119483.aspx
posted on 2011-02-11 17:25 Eason Jiang 阅读(1373) 评论(0) 编辑 收藏 举报