【问题标题】:Dynamically update syntax highlighting mode rules for the Ace Editor动态更新 Ace 编辑器的语法高亮模式规则
【发布时间】:2014-04-05 16:23:26
【问题描述】:

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 没有任何作用 - 这是由于要求 js 不重新加载文件。

我在 GitHub 上发布了一个尚未解决的问题:

https://github.com/ajaxorg/ace/issues/1835

"如果你真的想保留全局变量,你可以包装一切 在函数中,调用该函数以获取更新的 Mode 构造函数,以及 然后调用 setMode(new Mode)。”

我不知道该怎么做,如果有任何帮助,我们将不胜感激。

有人知道如何动态更新 ace 编辑器语法高亮规则吗?

【问题讨论】:

    标签: javascript requirejs syntax-highlighting ace-editor


    【解决方案1】:

    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

    【讨论】:

    • 谢谢。我会尽快检查这两种方法并报告。
    • 添加日期选项有效。当我有更多时间时,我会检查另一种方法。干杯。
    • 可以用这个来改变ace/mode/javascript中的关键字吗?
    • 我有类似的设置,但是在 bgTokenizer.start(0) 之后视图没有正确更新。荧光笔仍会突出显示初始规则,但自动完成功能会从新规则集中正确识别新关键字。我错过了什么?
    • 请显示有错误的页面,没有它就不可能知道你错过了什么
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多