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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM