javascript - 动态更新 Ace 编辑器的语法高亮模式规则

标签 javascript requirejs syntax-highlighting ace-editor

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)

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

关于javascript - 动态更新 Ace 编辑器的语法高亮模式规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22166784/

相关文章:

javascript - RequireJS JQuery 上下文菜单问题

c++ - vim 不高亮某些 c++ 关键字

javascript - 使用 IDE 中的文档使用 JavaScript 进行编程

javascript - 检查 React 中的状态是脏的还是干净的

javascript - 使用数字和拆分导致意外的日期结果

javascript - RequireJS require-less 和 require-css 路径

JavaScript Array.find 正则表达式

javascript - 使用 require.js 将 jQuery、Underscore 和 Backbone 包含为 AMD 模块的最佳方法是什么?

syntax-highlighting - 如何在不编辑的情况下向 Sublime Text 中的语法定义添加功能?

iphone - 开源 Objective-C 语法荧光笔?