У меня есть собственный токенизатор Monarch для имен функций в Monaco, который хорошо работает, когда открытый парен появляется в той же строке:
![image](https://i.stack.imgur.com/shmAY.png)
Но токенизатор не может правильно идентифицировать имя функции, если открытая скобка отображается в отдельной строке:
![image](https://i.stack.imgur.com/GIOtO.png)
Обратите внимание, что функция foo
в строке 1 выделена правильно, но токенизатор теряется, когда дело доходит до функция foo
в строке 5, поэтому она выделяет ее как «недопустимую» (по умолчанию). ( Для дальтоников, извините за зеленый / красный цвет ... это тема по умолчанию. )
Токенизатор использует регулярные выражения, но похоже, что я ничего не могу сделать, чтобы заставить регулярное выражение должно охватывать больше, чем текущая строка. Есть ли способ указать токенизатору Монако использовать многострочное сопоставление, или это просто известное ограничение? Я не могу найти ни одного упоминания об этом в документации , так или иначе.
Вот простая реплика, которую вы можете скопировать / вставить в Monaco Editor Playground :
// Register a new language
monaco.languages.register({ id: 'mySpecialLanguage' });
// Register a tokens provider for the language
monaco.languages.setMonarchTokensProvider('mySpecialLanguage', {
defaultToken: "invalid",
tokenizer: {
root: [
[
/(foo)([\s\n\r]*)([(])/,
["type.function", "", "@brackets"],
],
[
/"/,
{
token: "string.quote",
bracket: "@open",
next: "@string",
},
],
[
/[()\[\]]/,
"@brackets",
],
],
string: [
[
/[^"]+/,
"string",
],
[
/"/,
{
token: "string.quote",
bracket: "@close",
next: "@pop",
},
],
],
}
});
monaco.editor.create(document.getElementById("container"), {
theme: 'vs',
value: 'foo\t(\n\t\t"bar"\n\t)\n\nfoo\n\t(\n\t\t"bar"\n\t)\n',
language: 'mySpecialLanguage'
});