Winform语法高亮的编辑器比拼

先鼓励一下园子里面的一位兄弟,这个是他自己些的东西

http://surfsky.cnblogs.com/archive/2005/12/12/295814.html

他也说现在他也不用这个东西了,AnyWay,鼓励一下!

举几个说说事,以后慢慢的补上。

ICSharpCode.TextEditor


    这个东西是作为著名的开发工具SharpDevelop的一个开发组件存在,就是其中的代码编辑器,功能自是不必说,强大。

而且,开源!

语法文件集成到编译包中,目前支持的不是很多,XML配置,很简单,语法高亮可以使用程序设置,目前是我首选。

Essential Studio


http://www.syncfusion.com/

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编辑  收藏  举报

导航