2010-09-04 186 views
3

是否有任何簡單的代碼示例或如何使如何使Ricicit控件做語法 - 突出顯示? 我試過SynEdit,但它對我來說非常複雜,我想知道是否有一個小的代碼片段,我可以工作?或者只是想知道如何像IDE一樣快地做到這一點?語法高亮示例?

乾杯;

+1

很大一部分與SynEdit組件一起工作對你來說很難嗎? – RRUZ 2010-09-04 01:47:30

+6

在語法突出的世界中,「小代碼片段」,「簡單」和「與IDE一樣快」是從未見過的單詞。 – dthorpe 2010-09-04 03:12:49

+1

使用SynEdit編寫一個語法突出顯示器要比使用SynEdit困難得多(這比較容易)。 – 2010-09-04 09:30:27

回答

1

你可以看看Gexperts的來源。根據Martin Waldenburg的Pascal Parser IIRC,有「Source Export」。
但我不確定它是「簡單」的。

10

的SynEdit(或者更確切地說,它的前身mwEdit)項目正是開始,因爲一個標準的豐富的編輯控制是一個非常糟糕的適合語法高亮。

豐富的編輯控件通過將包含的文本以塊形式存儲在每個文本塊的格式信息中工作。現在想象一下爲它構建的語法高亮控制Pascal。插入{作爲文本的第一個字符將需要掃描整個文本,直到不在字符串內的第一個},然後循環遍歷所有的塊,直到包含}的文本爲止,將文本的格式更改爲格式多行註釋,然後重新突出文本的其餘部分。刪除插入的字符或撤銷編輯同樣需要重新整理文本。現在爲快速打字每秒做幾次事實證明,在九十年代後期的機器上以快速無閃爍的方式做不到這一點。

因此,所有快速語法高亮編輯控件都是作爲自定義編輯控件實現的,而不是Windows標準控件的後代。他們爲自己實現所有的文本存儲,文本繪製和編輯。通常使用許多預定義的文本屬性(對於關鍵字,註釋,符號,數字等),並且對於每個可見字符確定要使用的文本屬性,然後對於繪製文本設置字體和顏色屬性,並且全部具有相同屬性的字符被繪製。

基本上有兩種方法可以做到這一點,第一種是計算突出顯示信息一次併爲文本中的每個字符存儲信息(例如Scintilla文本控件的工作方式),另一種是重新掃描文本每次需要繪製(這就是SynEdit的工作原理)。通過存儲每條線的初始狀態,SynEdit優化了這一點,因此爲了畫線1000到1010,它不需要從第一條線重新掃描,它使用線1000的保存狀態初始化當前語法高亮顯示器並從那裏掃描。

存儲有關每個角色的信息需要更多的空間,但有幾個好處。即使突出信息不能單獨由文本確定,也可以突出顯示第一個文本,例如帶有時間戳的日誌消息;其次每個字符數據可以用於存儲附加信息,例如用於文本摺疊,或者用於插入或改變字符的信息。

我不認爲今天從頭開始實現語法高亮控制,任意文本大小,完全支持Unicode,完全撤銷/重做,多視圖,代碼摺疊等作爲一對一的方式實現,努力。或者也許可以完成,但是人員需要熟悉現有突出顯示控件的內部結構,以便在創建過程中不犯錯誤或做出次優決策。

+0

似乎對我來說很合理,也感謝信息:D – killercode 2010-09-05 13:31:05

0

我使用LMD SyntaxEdit,它很不錯。它帶有示例和文檔。語法突出顯示從不簡單,但在使用此組件幾個小時後,您應該可以開始運行。