ace editor dev 的全新功能,动态地向模式文件添加额外规则以进行语法高亮显示我正在执行一个 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");
});
模式文件使用以下内容进行了修补:
// 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);
当页面最初加载时,ace 编辑器获取所有关键字以语法突出显示。这很好用。
问题是当某些事件发生时我们会更改规则,并且希望 ace 编辑器刷新其语法规则。
再次调用 ajax 并调用 setMode 什么都不做 - 这是因为 require js 没有重新加载文件。
我在 GitHub 上发布了一个尚未解决的问题:
https://github.com/ajaxorg/ace/issues/1835
"If you really want to keep global variable, you can wrap everything in a function, call that function to get updated Mode constructor, and then call setMode(new Mode)."
我不知道该怎么做,我们将不胜感激。
有人知道如何动态更新 ace 编辑器语法高亮规则吗?
最佳答案
参见 https://github.com/ajaxorg/ace/blob/9cbcfb35d3/lib/ace/edit_session.js#L888
setMode
缓存模式,除非它们有选项
这样你就可以打电话
session.setMode({
path: "ace/mode/python",
v: Date.now()
})
强制它创建一个新模式。
另一种方式是做
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()
};
然后每当高亮规则发生变化时
// update keywords
editor.session.$mode.$highlightRules.setKeywords({"keyword": "foo|bar|baz"})
// force rehighlight whole document
editor.session.bgTokenizer.start(0)
关于javascript - 动态更新 Ace 编辑器的语法高亮模式规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22166784/