动态更新 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 代码的语法高亮显示? [关闭]