1 語法著色定義(官方文檔)
1.1 概述
EverEdit有著優異的語法著色引擎,可以高亮現存的絕大多數的編程語言。在EverEdit的語法著色中有Region和Item兩個概念,Region表示著不同的區塊。而Item則代表著這些區塊中不同的部分。一般情況下,Region表示跨行的文本匹配,而Item表示一行內的文本匹配。另外,Region也支持空匹配,也就是說您可以指定某個特定的位置用來表達Region的起始或者結束,比如行頭和行尾甚至于某個特定的列,從而可以完美的高亮markdown等語言的文件。同時Item還支持捕獲分組,可以極大地提高定義著色文件的準確性。在安裝目錄的syntax文件夾中已包含很多語法著色文件,您可以參照它們寫出更加優美正確的著色效果!
1.2 綁定代碼片段
不同的Region可以綁定不同的代碼片段,比如html中的css,js區域等。比如php.mac中的:
rPhp.AddSnippet "php.snippet"
這樣就把snippet加入到了php區域中了。這些snippet僅在該區域起作用,用戶輸入完整的提示字符,然后按下tab鍵就可以快速展開。一個區域可以使用AddSnippet
函數添加多個snippet。同樣,一個文件也可能會有多個不同的著色區域,通過如此搭配,可以實現嚴格的區分效果。
1.3 類和函數
著色文件是可編程的,每個著色文件都是一個按照指定語法書寫的腳本文件。因EverEdit開發的歷史原因,目前著色文件的語法僅支持vbscript。
1.4 顏色定義
在定義語法文件的時候,一定會想到要把不同的部分顯示為不同的顏色。EverEdit內置多種顏色,趕快讓您的文件多彩起來吧!下面是syntax目錄中const.mac描述的顏色值。注意:顏色的具體設定是在主題里面指定的,這些只是顏色的定義,不是具體的顏色表達。
Const COLOR_DEFAULT =0
Const COLOR_COMMENT1 =1
Const COLOR_COMMENT2 =2
Const COLOR_STRING1 =3
Const COLOR_STRING2 =4
Const COLOR_TAG =5
Const COLOR_MACRO =6
Const COLOR_URL =7
Const COLOR_EMAIL =8
Const COLOR_NUMBER =9
Const COLOR_FOUND =10
Const COLOR_PAIR =11
Const COLOR_FUNCTION =12
Const COLOR_VAR =13
Const COLOR_SUBLAN =14
Const COLOR_OPERATOR =15
Const COLOR_WORD1 =16
Const COLOR_WORD2 =17
Const COLOR_WORD3 =18
Const COLOR_WORD4 =19
Const COLOR_HIGHLIGHT1 =20
Const COLOR_HIGHLIGHT2 =21
Const COLOR_HIGHLIGHT3 =22
Const COLOR_HIGHLIGHT4 =23
Const COLOR_HIGHLIGHT5 =24
Const COLOR_HIGHLIGHT6 =25
Const COLOR_HIGHLIGHT7 =26
Const COLOR_HIGHLIGHT8 =27
Const COLOR_IGNORE =29
Const COLOR_CONCEAL =30
注意: 凡是被指定為COLOR_IGNORE
模式的字符串,它的前景色將和主界面的背景色一致,看起來好像不存在一樣。只有被選擇的時候,才會看到!而COLOR_CONCEAL
則是一個比較有意思的模式,被指定為COLOR_CONCEAL
的字符僅當處于選區或者當前行的時候,才是可見的!借助這個特性,可以實現出很多非常有用的功能!
1.5 SyntaxItem
// 捕獲可以用于對item定義的正則表達式,在進行更細節的著色描述
// 比如第一個捕獲的顏色為word1, 第二個為word2等
void Capture(int group, int state);
string Name;//get,set
1.6 WordItem
bool AutoCase;//get,set
string Name;//get,set
SyntaxRegion
1.7 函數
// 添加snippet到該Region。strName為snippet的文件名稱,因所有的snippet文件必須放到snippet文件夾,所以只需要提供snippet的文件名稱即可。bCase:snippet在匹配的時候是否區分大小寫
bool AddSnippet(string strName, bool bCase=true)void AddItem(SyntaxItem item );void AddWord(WordItem item );void AddRegion(SyntaxRegion child );// 指定語法文件的折疊方法。strFold和strUnFold指示了折疊和反折疊的正則表達式。bFCase/bUFCase:是否匹配大小寫
void FoldText(string strFold, bool bFCase, string strUnFold, bool bUFCase);// 塊注釋的文本。主要用于Ctrl+Shift+/的調用。比如c++中,可以這么設置 cpp.CommentBlock "/*", “*/"
void CommentBlock(string strOn, string strOff);// 行注釋的文本。用戶Ctrl+/的調用。比如c++中,可以這么設置 cpp.CommentLine "//"
void CommentLine(string strText);// 指示該Region可用的配對字符。strText:包含所有的配對字符。配對字符必須連續的放在一塊定義,很顯然strText的長度應為偶數。
void SetPairs(string strText);// 定義用于縮進和反縮進的正則表達式。
void IndentText(string strIndnet, bool c1, string strUnIndnet, bool c2);// 定義函數提示,具體參考函數提示部分。
void AddCallTip( string strPathName, bool bCase, string strWord="", string strBegin="(", string strSep=",", string strEnd=")", bool bRemoveSpace=false );// 添加snippet
void AddSnippet( string title, string trigger, string text, bool script=false);
1.8 屬性
// 當該區域的文本結束時,該Region默認情況下將會自動跳轉到父Region;如果定義了TransRegion那么將會跳轉到Region。
void TransRegion;//set// 該Region的名稱。設置該名稱之后,在腳本中可以獲取光標位置的詞法狀態。
string Name;//get;set
1.9 Parser
Parser默認情況下包含了一個DefaultRegion
。部分針對Default Region
函數的使用可以參考SyntaxRegion
的說明。
1.9.1 函數
bool AddSnippet(string strPathName, bool case_sensitve=true );void AddItem(SyntaxItem item );void AddWord(WordItem item );void AddRegion(SyntaxRegion child);// 復制一個Region。用于某兩個不相關的Region可能包含類似的代碼。該函數較耗費資源。
SyntaxRegion CopyRegion(SyntaxRegion pCopy);/**創建正則表達式描述的匹配規則。state:顏色值。strMatch:正則描述的匹配文本bCase:是否區分大小寫bToRight:如果該匹配正好在行末,那么背景色是否延伸到窗口右側。
**/
SyntaxItem CreateItem(int state, string strMatch, bool bCase, bool bToRight=false);/**創建關鍵字匹配。理論上CreateItem可以代替CreateWord,但CreateWord的效率更高且可以自動完成和自動糾正大小寫。strMatch:以空格分割的關鍵字字符串。bCase:是否區分大小寫strDelimiters:默認的情況下strMatch所匹配的文本只包括字母數字和下劃線,strDelimiters則表示哪些特殊字符可以被當作一個詞,比如中劃線-等。
**/
WordItem CreateWord(int state, string strMatch, bool bCase, string strDelimiters="");// 設置單行著色的最大字符上限。默認的情況下,EverEdit只著色每一行的前1000個字符。注意:過大的設置,可能導致程序運行速度過于緩慢!
void SetParseMax(int value);// 直接在語法文件中,聲明一個代碼片段
void AddSnippet( string title, string trigger, string text, bool script=false);// 從文件中創建一個關鍵字列表并指定顏色和大小寫,該文件必須放置于syntax目錄
WordItem CreateWordFromFile(int color, string strFileName, bool bCase)/**從文件中添加指定規則的關鍵字,它不返回創建的對象,直接按照規則把文件中所有的關鍵字加入到指定的region。文件的每一行是一個關鍵字,頭尾不可有空格。;開頭的是注釋,#開頭的是新的關鍵字描述,后面更有3個數字,比如#16,1,0。第一個數字表示詞法狀態,第二個表示是否區分大小寫,第三個表示是否自動更正大小寫。典型的keyword文件如下:#16,1,0long...#17,1,0string...
**/
AddWordFromFile(string strFileName, string strDelimiters)/**創建一個正則表達式描述的Region。strBegin/strEnd:描述該區域開始或者結束的正則表達式bCase:strBegin/strEnd描述的正則是否區分大小寫bToRight:如果該Region在行末,那么擴展背景色到右側窗口注意:被+兩個加號+包圍起來的文本表示這不是一個正則表達式,就是普通的文字匹配(效率更高)
**/
SyntaxRegion CreateRegion(int state, string strBegin, string strEnd, bool bCase, bool bToRight=false );/**創建字符串匹配。strChar:字符串指示字符,通常為"或者'。strEscape:轉義字符,通常為\mline:字符串是否跨行。strContinueChar:字符串續行符,比如C++中的\
**/
SyntaxRegion CreateStringRegion(int state, string strChar, string strEscape, bool mline, string strContinueChar );void FoldText(string strFold, bool bFCase, string strUnFold, bool bUFCase);void IndentText(string strIndnet, bool c1, string strUnIndnet, bool c2);/**正則表達式描述的較為寬松的折疊。nLevel:折疊的層級strText:正則表達式
**/
void FoldAnyText(int nLevel, string strText);void SetPairs(string strText);void CommentBlock(string strOn, string strOff);void CommentLine(string strText);void AddCallTip( string strPathName, bool bCase, string strWord="", string strBegin="(", string strSep=",", string strEnd=")", bool bRemoveSpace=false );void SetFont( string font_name, int font_size, int base_line, bool bold);// 為該語法文件獨立綁定一個字體,當打開用該語法文件渲染的文本時,將會忽略用戶的設置,自動使用語法著色文件指定的字體。
void SetCJKFont( string font_name, int font_size, int base_line, bool bold);
1.9.2 屬性
// 默認區域的命名
string Name;//get,set// 該語法文件的折疊方法。取值為syntax/indent/anytext
string FoldingMethod;//get,set// 該語法文件可以被認為是單詞的特殊字符。當鼠標雙擊或者其它操作選擇詞匯時將會使用該設置。
string WordChars;//get,setSyntaxRegion DefaultRegion;//get// 事件處理腳本,當顯示該文件類型的大綱視圖時,會自動的調用這個腳本,該腳本應該按照指定格式輸出大綱視圖識別的格式,該格式后續會介紹。
string OnOutLine;//set// 事件處理腳本,當按下回車鍵時,會自動調用該腳本,該腳本可以執行常見的腳本函數。
string OnNewLine;
1.10 實例1:創建C++著色器
以C語言為例,描述一下如何去定義一個新的語法描述文件!那么,首先讓我們看一下C語言中常見的元素:
- 單行注釋
- 多行注釋
- 字符串
- 關鍵字
絕大多數的著色文件均是由上面幾個非常簡單的元素構成。好了,開始我們的自定義吧!建立一個新的文件mycpp.mac并把它放到syntax目錄下。為了使用顏色值,我們可以把已經定義好的cosnt.mac包含進來,當然您也可以直接把該文件的內容粘貼到這個文件當中。
Include( ".\const.mac" )
創建一個自定義的Parser,命名為cpp。
Set cpp=Parser.CreateParser()
在創建完自定義Parser之后,我們就要開始為之添加各種各樣的元素了! 創建單行注釋匹配:單行注釋很顯然是一個Region,而不是一個Item,因為它有開始和結束的標志!那就是以//開始,以行尾結束!
Set regionLine=cpp.CreateRegion( COLOR_COMMENT1, "+//+", "$", True )
注意:這兒我們使用了++, 其中被+包圍了, 表示這兒為了提高效率不使用正則表達式進行匹配! 結束標志我們把它定義成$, 明確表示匹配到行尾, 不然的話只會匹配//了! 創建多行注釋匹配:
Set regionBlock=cpp.CreateRegion( COLOR_COMMENT1, "+/*+", "+*/+", True )
創建字符串匹配:
Set regionString=cpp.CreateStringRegion( COLOR_STRING1, """", "\", False )
創建關鍵字匹配:
Set itemWord=cpp.CreateItem(COLOR_WORD1, "\b(int|float|double|char|void|
for|while|if|else|return|break|continue)\b", True)
注意:為了更好的創建關鍵字匹配, 可以使用CreateWord函數, 比如上文中的關鍵字匹配, 也可以這么寫,效率更高:
Set itemWord2=cpp.CreateWord(COLOR_WORD1, "int float double char void for while if else return break continue", True)
把所有創建的匹配加入到主區域中:
cpp.AddRegion( regionLine )
cpp.AddRegion( regionBlock )
cpp.AddRegion( regionString )
cpp.AddItem( itemWord )
到這兒為止我們就自定義了一個簡單的C語言著色引擎,看看成品吧!
Include( ".\const.mac" )
Set cpp=Parser.CreateParser()
Set regionLine=cpp.CreateRegion( COLOR_COMMENT1, "+//+", "", True )
Set regionBlock=cpp.CreateRegion( COLOR_COMMENT1, "+/*+", "+*/+", True )
Set regionString=cpp.CreateStringRegion( COLOR_STRING1, """", "\", False )
Set itemWord=cpp.CreateItem(COLOR_WORD1, "\b(int|float|double|char|void|for|while|if|else|return|break|continue)\b", True)
cpp.AddRegion( regionLine )
cpp.AddRegion( regionBlock )
cpp.AddRegion( regionString )
cpp.AddItem( itemWord )
別著急,還剩下最后一步。那就是讓EverEdit可以識別它!打開語法著色對話框,新建一文件類型為MyCpp,并選擇語法文件為剛剛定義的mycpp.mac!
1.11 實例2:細化C++著色器
在實例1中我們學習了如何創造一個自定義的著色引擎, 那么讓我們來進一步豐富這個引擎吧!首先, 我想讓注釋中所有大寫的TODO都顯示為一種特殊的顏色! 注意僅僅是注釋中, 其它的部分不變!
1.11.1 定義TODO匹配
Set itemTodo=cpp.CreateItem(COLOR_HIGHLIGHT1, "\bTODO\b", True)
把TODO匹配加入到單行和多行注釋中:
regionLine.AddItem( itemTodo )
regionBlock.AddItem( itemTodo )
這樣我們就可以僅僅在注釋中顯示高亮為COLOR_HIGHLIGHT1
顏色的TODO文字了!EverEdit同樣為代碼折疊提供了簡單方便的調用接口。比如當遇到{時折疊一次,遇到}時反折疊一次,那么可以簡單的像下面書寫:
cpp.FoldText "\{", False, "\}", False
1.11.2 自動縮進
假設在mycpp中有這樣一種縮進:當您在行尾是EEA的時候,輸入回車時,自動縮進一次;輸入的行滿足含有EverEdit時,自動反縮進一次。
cpp.IndentText "EEA$ ", False, "EVEREDIT", False
1.11.3 括號匹配
我們定義[],{},(),“”,''是匹配的字符。
cpp.SetPairs "[]{}()""""''"
可以被快捷鍵調用的快速注釋:
cpp.CommentLine "//"
cpp.CommentBlock "/*", "*/"
到這兒為止,我們為mycpp添加了TODO高亮;添加了縮進和反縮進,添加了括號匹配和代碼折疊,同時還添加了可以被快捷鍵或者菜單命令調用的注釋和反注釋的匹配!EverEdit以其強大的功能,為您提供了大量的自定義特性!趕快動手試一下吧!
1.12 和著色文件綁定的操作
著色文件不僅描述了如何以分色的方式顯示一串文字的不同部分,同時還有一些特定的操作是和著色文件綁定在一起的,比如縮進規則、折疊規則、大綱顯示的規則、自定義工具、菜單、工具條等等,這些在EverEdit中均可實現。
1.13 縮進規則
在EverEdit中,按下回車的時候,是縮進的時機,這個時候應該根據上下行的規則進行細節判斷是縮進還是不縮進。那么反縮進呢?反縮進沒有更好的時機,在EverEdit中當用戶輸入的時候,如果光標行所在的文本滿足特定的正則表達式的話,進行一次反縮進。這么做不是100%完美的,多少會有些瑕疵。
1.14 折疊規則
首先我們需要知道的是,完美的代碼折疊如果不做語義分析的話,是做不到的,往往眼睛看到的、直觀的、應該折疊的地方,卻無法找到一個有效的模式去描述。EverEdit的折疊規則非常簡單,如果該行文本滿足折疊表達式,則折疊一次;滿足反折疊表達式,則反折疊一次;同時滿足,則折疊歸零。這么做非常高效,可以解決絕大數的常見的折疊,同時EverEdit還可以自動的對處于同一個Region的代碼進行折疊,不同的Region還可以綁定不同的折疊規則,就像html中的js區域和css區域一樣。
那么,有一些語言是比較特殊的,比如ini,它應該折疊折疊每一個section,這些section無法用折疊表達式來描述,所以EverEdit又提供了另一種折疊描述,那就是anytext。anytext是指定義一個規則和指定的level,遇到該規則,則自動的使用指定的level而不是EverEdit自動判斷的level。看看ini中的代碼折疊。
ini.FoldingMethod="anytext"
ini.FoldAnyText 0, "^\s*\[.*?\]$"
另外,EverEdit還提供了依據縮進進行折疊,很多縮進規則比較好的語言,用縮進更美觀。比如python中的折疊。
python.FoldingMethod="indent"
1.15 主題
EverEdit的主題非常的強大,但是它有一個缺點,那就是所有的語法文件都會應用到同一個主題。有時候我們期望某個獨特類型的文件能使用自己的主題,可不可以呢?當然沒問題!只要打開對應的語法著色文件,然后加一行代碼就可以了!
parser.SetTheme(“xxxx.ini”)
為什么要獨立設定主題? 比如markdown里面有加粗、傾斜等字體樣式,這些樣式有時候我們只希望在markdown中應用,這個時候獨立的主題就很有用了。
1.16 模式
模式文件的綁定需要通過界面進行操作。主菜單→工具→設置→語法著色
,選定您的語法文件,然后點擊高級,綁定即可!
1.17 幫助文件
每一種文件類型可以綁定后綴為chm或者hlp的幫助文件,當打開對應的幫助文件的時候,EverEdit會自動根據選區的內容,定位到適合的章節。比如我們可以把php的幫助文檔,綁定到php中,這樣當不知道某個函數的用法的時候,選定這個函數,幫助→關聯幫助
就可以迅速定位了。除此之外,在模式中也可以調用腳本完成,實現更多的幫助文件的綁定。
1.18 函數提示
EverEdit支持簡單的基于字符匹配的函數提示,當輸入函數的某個開始字符時,會在上方彈出一個文本框,顯示該函數的原型和釋義,方便用戶確認函數的參數和用法,在輸入函數參數的分割符時,EverEdit會自動地以下劃虛線的方式強調表示。函數提示是以文本文件的形式存儲在calltip文件夾中的,如果需要在calltip中顯示中日韓字符,要確保該文件是以UTF8不帶BOM的形式進行保存的。
下面來看看該文件的存儲格式,以c.ecp為例進行說明。
abs(int x):int\nReturns the absolute value of x
其中有\n字符,表示這是一個換行符,后面的部分表示函數的釋義,當然這部分是可以省略的。前面的部分表示函數的原型。abs一定要寫在最開始,EverEdit會從最開始進行匹配,所以我們把函數的返回類型寫在了最后。在定義完一個calltip之后,我們需要明確的告知EverEdit:該calltip要被那個著色文件的哪個region加載,使用下面的函數:
/**strFileName:文件名稱,不需要帶路徑。比如c.ecp。bCase:前面匹配的部分是否要區分大小寫strWord:該參數是指在匹配的時候,哪些字符可以被認為是單詞。以c.ecp的abs函數為例,因為該文件定義的函數都是以字母開始 的,所以不需要特殊的參數。如果某個函數是諸如abs-def(xx)這樣的話,我們可以把-加入到這個參數中,那就是"-"。strBegin:函數開始字符,一般是左括號(strSep:參數分割字符,一般是逗號,strEnd:函數結束字符,一般是右括號)bRemoveSpace:在匹配的時候是否要刪除空格。比如abs(…),設置該參數為true的話,則忽略abs到(之前的空格。
**/
void AddCallTip( string strFileName, bool bCase, string strWord="", string strBegin="(", s
文檔作者聲明:由于gitbook訪問抽風,EverEdit官方手冊訪問時好時壞,本文檔將其搬運,僅用于學習交流,未經作者許可,不得將本文檔用于其他目的。
Copyright ? 2022~2024 All rights reserved.