遇到这样的需求,对于整个编辑器来说,只能使用0~71列。如果以下栏目(72~)有内容,则应将这些内容标记为注释。如果第 0 到 71 列中出现逗号,则该逗号及其后面的内容为注释。
我编写了以下标记器:
return {
tokenizer: {
root: [
[/(,\s+)(.*)/, ['default', 'comment']],
[/^(.{0,71})(.*)/, ['default', 'comment']]
],
},
};
我想把第二条规则当作“全局规则”,它会一直生效,然后其他规则也可以生效。但我发现第一条规则永远不会生效,而第二条规则总是生效。
尝试将
[/,\s+/, { token: 'default', next: '@comment'}],
放在第一行。如果输入 ddd,
则不会匹配该规则。直接符合第二条规则。
不知道哪里出错了,也不知道Monaco编辑器中是否有配置可以满足上述要求?
也许你应该改变主意。你应该把匹配注释的规则放在前面,让它们先匹配。
这是您需要的示例:游乐场
// 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");
}