对于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"); });
// 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什么都不做 – 这是因为要求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)