javascript – 动态更新Ace编辑器的语法突出显示模式规则

对于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)

http://jsbin.com/ojijeb/445/edit

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...