2014-01-31 71 views
2

我目前在CodeMirror中爲當前項目添加了一種新的語言模式。這是用戶可以創建新關鍵字的專有語言。基本上我試圖在運行時更新現有的關鍵字列表,我的語法突出顯示器可以選擇這個新的關鍵字。Codemirror爲語法高亮添加關鍵字

var mode = editor.doc.modeOption; 
     if(mode === "dmsrl") mode = "text/dmsrl"; 
     var keyWords = CodeMirror.resolveMode(mode).keywords; 
     keyWords[x]=true; 

目前我正在試圖增加新的關鍵字像上面,但不知何故,該列表是沒有得到更新,新的關鍵字是我tokebase()方法不可用。

任何幫助,將不勝感激。

回答

0

您可以嘗試重新定義hintOptions對象,該對象傳遞給Codemirror的init函數,並且使用此數據在特定的提示插件中構建提示。剛剛嘗試這一點

cm.setOption("hintOptions", { "keywords" : ["k1", "k2"] }); 

在SQL-暗示的例子來看一下第一(link):

cm.setOption("hintOptions", { "tables" : ["k1", "k2"] }); 

對於SQL模式,這不是繁重的操作

0

我想達到同樣的目標作爲你的,但有更多的自由度,包括輸入一個容器,我可以在運行中重新定義它。

1)把下面的代碼放到一個文件custom.mode.js,從您的網頁

var _glob_keywords = [ [ "key1", "keyword1" ], 
         [ "key2", "keyword2" ] 
        ] ; 

var cm_custom_check_stream_fn = function(stream) 
{ 
    for(var _i = 0 ; _i < _glob_keywords.length ; _i++) 
    { 
     if (stream.match(_glob_keywords[_i][0])) return _glob_keywords[_i][1] ; 
    } 
    return "" ; 
} 

CodeMirror.defineMode("custom.mode", function() 
{ 
    return { 
    token: function(stream,state) 
      { 
       var _ret = cm_custom_check_stream_fn(stream) ; 
       if (_ret.length > 0) return _ret ; 
       else { stream.next(); return null; } 
      } 
      }; 
}); 

該代碼會自動嵌入到Codemirror對象動態處理的輸入裝文本框。 例如:如果找到「key1」,則返回「keyword1」。

我們假設「關鍵字」,「關鍵字2」是指項自定義CSS定義文件中,作爲codemirror文檔中解釋,那就是,

.cm-keyword1 { color:#8BA8C4; } 
.cm-keyword2 { color:lime; } 

希望它能幫助!