zaf*_*zaf 8 javascript syntax-highlighting requirejs ace-editor
对于ace编辑器开发人员来说,要动态地向模式文件中添加其他规则以进行语法突出显示我正在进行ajax调用,该调用设置了要处理的模式文件中可用的全局变量.
这是设置和初始ajax调用:
var editor = ace.edit("editor");
$.ajax({
url: "json-mode-rules.php",
dataType: "json"
}).done(function(data) {
window.myModeRules=data; // ("foo","bar","etc")
editor.getSession().setMode("ace/mode/python");
});
Run Code Online (Sandbox Code Playgroud)
模式文件使用以下内容进行修补:
// keywords has already been initialised as an array
// e.g. var keywords = ("and|as|assert...etc")
var extraRules=window.codebenderModeLibrary["myModeRules"].join("|");
keywords=(keywords[0]+"|"+ extraRules);
Run Code Online (Sandbox Code Playgroud)
当页面被初始加载时,ace编辑器会获得语法高亮的所有关键字.这非常有效.
问题是我们在某些事件发生时会更改规则,并希望ace编辑器刷新其语法规则.
再次执行ajax调用并调用setMode什么都不做 - 这是因为要求js不重新加载文件.
我在GitHub上发布了一个没有解决方案的问题:
https://github.com/ajaxorg/ace/issues/1835
"如果你真的想保留全局变量,你可以将所有东西都包装在一个函数中,调用该函数来获得更新的Mode构造函数,然后调用setMode(new Mode)."
我不知道该怎么做,任何帮助将不胜感激.
有关如何动态更新ace编辑器语法突出显示规则的技术的人?
a u*_*ser 15
请参阅https://github.com/ajaxorg/ace/blob/9cbcfb35d3/lib/ace/edit_session.js#L888
setMode 缓存模式,除非他们有选项,所以你可以打电话
session.setMode({
path: "ace/mode/python",
v: Date.now()
})
Run Code Online (Sandbox Code Playgroud)
强制它创建一个新模式.
另一种方法是做
var DynHighlightRules = function() {
// add function to change keywords
this.setKeywords = function(kwMap) {
this.keywordRule.onMatch = this.createKeywordMapper(kwMap, "identifier")
}
this.keywordRule = {
regex : "\\w+",
onMatch : function() {return "text"}
}
this.$rules = {
"start" : [
{
token: "string",
start: '"',
end: '"',
next: [{ token : "language.escape", regex : /\\[tn"\\]/}]
},
this.keywordRule
]
};
this.normalizeRules()
};
Run Code Online (Sandbox Code Playgroud)
然后每当突出显示规则改变时
// update keywords
editor.session.$mode.$highlightRules.setKeywords({"keyword": "foo|bar|baz"})
// force rehighlight whole document
editor.session.bgTokenizer.start(0)
Run Code Online (Sandbox Code Playgroud)
见http://jsbin.com/ojijeb/445/edit
| 归档时间: |
|
| 查看次数: |
9386 次 |
| 最近记录: |