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

Posted

技术标签:

【中文标题】动态更新 Ace 编辑器的语法高亮模式规则【英文标题】:Dynamically update syntax highlighting mode rules for the Ace Editor 【发布时间】: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 编辑器语法高亮规则吗?

【问题讨论】:

【参考方案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) 之后视图没有正确更新。荧光笔仍会突出显示初始规则,但自动完成功能会从新规则集中正确识别新关键字。我错过了什么? 请显示有错误的页面,没有它就不可能知道你错过了什么

以上是关于动态更新 Ace 编辑器的语法高亮模式规则的主要内容,如果未能解决你的问题,请参考以下文章

哪个文本编辑器支持 Wiki 代码的语法高亮显示? [关闭]

Vim中如何设置语法高亮和行号

Ace-Editor JSON 自动格式/缩进

语法高亮:.NET 的富文本框控件

远程登录Linux主机在只有命令行下运行VIM编辑器怎样设置语法高亮?

Eclipse安装各种语法高亮编辑器