Ace编辑器自定义模式–向现有集中添加突出显示规则

问题描述

我有一个与GraalVM脚本相关的JavaScript编辑器(Ace Editor),在其中添加了一些自定义JavaScript规则。我希望使用自定义突出显示规则将它们反映在编辑器中。但是,无论尝试如何,似乎都无法添加新规则。我有一个正确包含的自定义模式,问题出在规则中。

我的起点看起来像这样(不包括模式代码):

ace.define('ace/mode/custom_highlight_rules',['require','exports','ace/lib/oop','ace/mode/text_highlight_rules'],(acequire,exports) => {
    const oop = acequire('ace/lib/oop');
    const JavaScriptHighlightRules = acequire("./javascript_highlight_rules").JavaScriptHighlightRules;

    const CustomHighlightRules = function CustomHighlightRules() {
        this.$rules = new JavaScriptHighlightRules().getRules();
    };

    oop.inherits(CustomHighlightRules,JavaScriptHighlightRules);

    exports.CustomHighlightRules = CustomHighlightRules;
});

现在,我尝试使用文档中的addRules(),如下所示:

this.addRules({
    start: [ {
        token: "keyword",regex: "my_keyword",} ]
},'custom-');

但是,my_keyword未突出显示。

请注意,将其替换为:

this.$rules = {
    start: [ {
        token: "keyword",} ]
};

是否突出显示此关键字,但没有其他内容,因为没有其他规则-这就是我知道代码完全在做任何事情的原因。

我也尝试过这样的事情:

this.$rules.start.push({
    token: "keyword",next: "start",});

因此该规则位于内置start对象中,但似乎不起作用。还尝试了正则表达式的变体(例如,使用本机RegEx代码,例如/my_keyword/)。

我注意到使用addRules()时,自定义对象中没有processed: true,这表明我添加规则的时间是否太晚?看来这是正确的地方。

我在做什么错了?

解决方法

我没有解释为什么它起作用,但是看起来this.$rules的分配需要在最后完成,因此首先需要构建对象,然后进行分配。有关如何执行此操作的有效示例,请参见:TypeScript下的https://ace.c9.io/tool/mode_creator.html,它完全按照我的意愿继承了JavaScript。

因此我的功能现在看起来像这样:

const CustomHighlightRules = function CustomHighlightRules(options) {
    let customRules = [
        {
            token: "keyword",regex: "my_keyword"
        }
    ];

    let JSRules = new JavaScriptHighlightRules({jsx: (options && options.jsx)}).getRules();

    JSRules.no_regex = customRules.concat(JSRules.no_regex);
    this.$rules = JSRules;
}

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...