2014-01-31 32 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; } 

希望它能帮助!