在摩纳哥编辑器分词器中,有没有办法让一条规则始终生效,并且其他规则基于它生效?

问题描述 投票:0回答:1

遇到这样的需求,对于整个编辑器来说,只能使用0~71列。如果以下栏目(72~)有内容,则应将这些内容标记为注释。如果第 0 到 71 列中出现逗号,则该逗号及其后面的内容为注释。

我编写了以下标记器:


return {
  tokenizer: {
    root: [
      [/(,\s+)(.*)/, ['default', 'comment']],
      [/^(.{0,71})(.*)/, ['default', 'comment']]
    ],
  },
};

我想把第二条规则当作“全局规则”,它会一直生效,然后其他规则也可以生效。但我发现第一条规则永远不会生效,而第二条规则总是生效。

尝试将

[/,\s+/, { token: 'default', next: '@comment'}],
放在第一行。如果输入
ddd,
则不会匹配该规则。直接符合第二条规则。

不知道哪里出错了,也不知道Monaco编辑器中是否有配置可以满足上述要求?

monaco-editor ngx-monaco-editor
1个回答
0
投票

也许你应该改变主意。你应该把匹配注释的规则放在前面,让它们先匹配。

这是您需要的示例:游乐场

// Register a new language
monaco.languages.register({ id: "mySpecialLanguage" });

// Register a tokens provider for the language
monaco.languages.setMonarchTokensProvider("mySpecialLanguage", {
    tokenizer: {
        root: [
            [/^.{72,}$/, "comment"],
            [/(.*)(,\s+)(.*)/, ['default','default', 'comment']],
        ],
    },
});

monaco.editor.defineTheme("myCoolTheme", {
    base: "vs",
    inherit: false,
    rules: [
        { token: "comment", foreground: "ff0000", fontStyle: "bold" },
    ],
    colors: {
        "editor.foreground": "#000000",
    },
});

monaco.editor.create(document.getElementById("container"), {
    theme: "myCoolTheme",
    value: getCode(),
    language: "mySpecialLanguage",
});

function getCode() {
    return [
        "This is comment: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
        "normal line",
        "normal line with comment, 123",
    ].join("\n");
}
© www.soinside.com 2019 - 2024. All rights reserved.