A browser based code editor that powers Visual Studio Code
—
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Pending
The risk profile of this skill
Language registration, tokenization, and provider registration for IntelliSense features across Monaco Editor's 80+ supported languages.
monaco.languages.register(language: ILanguageExtensionPoint): voidRegisters a new language.
interface ILanguageExtensionPoint {
id: string;
extensions?: string[];
filenames?: string[];
filenamePatterns?: string[];
firstLine?: string;
aliases?: string[];
mimetypes?: string[];
configuration?: Uri;
}// Register a custom language
monaco.languages.register({
id: 'myCustomLanguage',
extensions: ['.mcl'],
aliases: ['My Custom Language', 'mcl'],
mimetypes: ['text/mcl']
});monaco.languages.getLanguages(): ILanguageExtensionPoint[]Gets all registered languages.
const languages = monaco.languages.getLanguages();
console.log('Available languages:', languages.map(l => l.id));Monaco Editor includes support for lazy-loading languages to improve initial bundle size.
monaco.languages.onLanguageEncountered(languageId: string, callback: () => void): IDisposableFired when a language is first encountered, useful for lazy loading language features.
monaco.languages.registerTokensProviderFactory(languageId: string, factory: ITokensProviderFactory): IDisposableRegisters a factory for creating tokenization providers on demand.
interface ITokensProviderFactory {
create(): Promise<IMonarchLanguage | languages.ITokensProvider>;
}// Lazy load language tokenization
monaco.languages.onLanguageEncountered('myLanguage', () => {
// Load language configuration when first used
import('./myLanguageConfig').then(config => {
monaco.languages.setLanguageConfiguration('myLanguage', config.languageConfig);
});
});
// Register a tokens provider factory for lazy loading
monaco.languages.registerTokensProviderFactory('myLanguage', {
create: async () => {
const { tokenProvider } = await import('./myLanguageTokens');
return tokenProvider;
}
});Monaco Editor uses the Monarch tokenizer for syntax highlighting of 80+ programming languages.
monaco.languages.setMonarchTokensProvider(languageId: string, languageDef: IMonarchLanguage): IDisposableSets a Monarch tokenizer for a language.
interface IMonarchLanguage {
tokenizer: { [name: string]: IMonarchLanguageRule[] };
ignoreCase?: boolean;
defaultToken?: string;
brackets?: IMonarchLanguageBracket[];
start?: string;
tokenPostfix?: string;
// ... many more options
}// Simple tokenizer example
monaco.languages.setMonarchTokensProvider('myLanguage', {
tokenizer: {
root: [
[/\[error.*/, "custom-error"],
[/\[notice.*/, "custom-notice"],
[/\[info.*/, "custom-info"],
[/\[[a-zA-Z 0-9:]+\]/, "custom-date"],
]
}
});Monaco includes Monarch tokenizers for many languages:
monaco.languages.setLanguageConfiguration(languageId: string, configuration: LanguageConfiguration): IDisposableSets language-specific configuration.
interface LanguageConfiguration {
comments?: CommentRule;
brackets?: CharacterPair[];
wordPattern?: RegExp;
indentationRules?: IndentationRule;
onEnterRules?: OnEnterRule[];
autoClosingPairs?: IAutoClosingPairConditional[];
surroundingPairs?: IAutoClosingPair[];
folding?: FoldingRules;
__electricCharacterSupport?: IBracketElectricCharacterContribution;
}monaco.languages.setLanguageConfiguration('myLanguage', {
comments: {
lineComment: '//',
blockComment: ['/*', '*/']
},
brackets: [
['{', '}'],
['[', ']'],
['(', ')']
],
autoClosingPairs: [
{ open: '{', close: '}' },
{ open: '[', close: ']' },
{ open: '(', close: ')' },
{ open: '"', close: '"' },
{ open: "'", close: "'" }
],
surroundingPairs: [
{ open: '{', close: '}' },
{ open: '[', close: ']' },
{ open: '(', close: ')' },
{ open: '"', close: '"' },
{ open: "'", close: "'" }
]
});Providers supply IntelliSense features like completion, hover information, and diagnostics.
monaco.languages.registerCompletionItemProvider(
languageId: string,
provider: CompletionItemProvider
): IDisposableRegisters a completion item provider.
interface CompletionItemProvider {
triggerCharacters?: string[];
provideCompletionItems(
model: ITextModel,
position: Position,
context: CompletionContext,
token: CancellationToken
): ProviderResult<CompletionList>;
resolveCompletionItem?(
item: CompletionItem,
token: CancellationToken
): ProviderResult<CompletionItem>;
}monaco.languages.registerCompletionItemProvider('myLanguage', {
provideCompletionItems: function(model, position) {
const suggestions = [
{
label: 'simpleText',
kind: monaco.languages.CompletionItemKind.Text,
insertText: 'simpleText'
},
{
label: 'testing',
kind: monaco.languages.CompletionItemKind.Keyword,
insertText: 'testing(${1:condition})',
insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet
}
];
return { suggestions: suggestions };
}
});monaco.languages.registerHoverProvider(
languageId: string,
provider: HoverProvider
): IDisposableRegisters a hover information provider.
interface HoverProvider {
provideHover(
model: ITextModel,
position: Position,
token: CancellationToken
): ProviderResult<Hover>;
}monaco.languages.registerHoverProvider('myLanguage', {
provideHover: function(model, position) {
const word = model.getWordAtPosition(position);
if (word) {
return {
range: new monaco.Range(position.lineNumber, word.startColumn, position.lineNumber, word.endColumn),
contents: [
{ value: '**' + word.word + '**' },
{ value: 'This is hover information for: ' + word.word }
]
};
}
}
});monaco.languages.registerDocumentSymbolProvider(
languageId: string,
provider: DocumentSymbolProvider
): IDisposableRegisters a document symbol provider for outline view.
interface DocumentSymbolProvider {
provideDocumentSymbols(
model: ITextModel,
token: CancellationToken
): ProviderResult<DocumentSymbol[]>;
}monaco.languages.registerDefinitionProvider(
languageId: string,
provider: DefinitionProvider
): IDisposableRegisters a "Go to Definition" provider.
interface DefinitionProvider {
provideDefinition(
model: ITextModel,
position: Position,
token: CancellationToken
): ProviderResult<Definition>;
}monaco.languages.registerReferenceProvider(
languageId: string,
provider: ReferenceProvider
): IDisposableRegisters a "Find All References" provider.
monaco.languages.registerRenameProvider(
languageId: string,
provider: RenameProvider
): IDisposableRegisters a symbol rename provider.
monaco.languages.onLanguage(languageId: string, callback: () => void): IDisposableFires when a language is first needed (model is opened with that language).
Use this to lazily register providers:
monaco.languages.onLanguage('myLanguage', () => {
// Register providers for myLanguage
monaco.languages.registerCompletionItemProvider('myLanguage', completionProvider);
monaco.languages.registerHoverProvider('myLanguage', hoverProvider);
});monaco.languages.registerCodeActionProvider(
languageId: string,
provider: CodeActionProvider
): IDisposableRegisters a code action provider for quick fixes and refactorings.
interface CodeActionProvider {
provideCodeActions(
model: ITextModel,
range: Range,
context: CodeActionContext,
token: CancellationToken
): ProviderResult<CodeActionList>;
}monaco.languages.registerCodeActionProvider('myLanguage', {
provideCodeActions: function(model, range, context) {
const actions = [];
// Add a quick fix action
actions.push({
title: 'Fix this issue',
kind: 'quickfix',
edit: {
edits: [{
resource: model.uri,
edit: {
range: range,
text: 'fixed text'
}
}]
}
});
return {
actions: actions,
dispose: function() {}
};
}
});monaco.languages.registerDocumentFormattingEditProvider(
languageId: string,
provider: DocumentFormattingEditProvider
): IDisposableRegisters a document formatting provider.
interface DocumentFormattingEditProvider {
displayName?: string;
provideDocumentFormattingEdits(
model: ITextModel,
options: FormattingOptions,
token: CancellationToken
): ProviderResult<TextEdit[]>;
}monaco.languages.registerDocumentRangeFormattingEditProvider(
languageId: string,
provider: DocumentRangeFormattingEditProvider
): IDisposableRegisters a range formatting provider.
monaco.languages.registerOnTypeFormattingEditProvider(
languageId: string,
provider: OnTypeFormattingEditProvider
): IDisposableRegisters an on-type formatting provider.
monaco.languages.registerSignatureHelpProvider(
languageId: string,
provider: SignatureHelpProvider
): IDisposableRegisters a signature help provider for parameter hints.
monaco.languages.registerDocumentHighlightProvider(
languageId: string,
provider: DocumentHighlightProvider
): IDisposableRegisters a document highlight provider for highlighting occurrences.
monaco.languages.registerImplementationProvider(
languageId: string,
provider: ImplementationProvider
): IDisposableRegisters a "Go to Implementation" provider.
monaco.languages.registerTypeDefinitionProvider(
languageId: string,
provider: TypeDefinitionProvider
): IDisposableRegisters a "Go to Type Definition" provider.
monaco.languages.registerDeclarationProvider(
languageId: string,
provider: DeclarationProvider
): IDisposableRegisters a "Go to Declaration" provider.
monaco.languages.registerColorProvider(
languageId: string,
provider: DocumentColorProvider
): IDisposableRegisters a color provider for color decorations and color picker.
interface DocumentColorProvider {
provideDocumentColors(
model: ITextModel,
token: CancellationToken
): ProviderResult<IColorInformation[]>;
provideColorPresentations(
model: ITextModel,
colorInfo: IColorInformation,
token: CancellationToken
): ProviderResult<IColorPresentation[]>;
}monaco.languages.registerFoldingRangeProvider(
languageId: string,
provider: FoldingRangeProvider
): IDisposableRegisters a folding range provider for code folding.
interface FoldingRangeProvider {
provideFoldingRanges(
model: ITextModel,
context: FoldingContext,
token: CancellationToken
): ProviderResult<FoldingRange[]>;
}monaco.languages.registerSelectionRangeProvider(
languageId: string,
provider: SelectionRangeProvider
): IDisposableRegisters a selection range provider for smart select/expand selection.
monaco.languages.registerLinkedEditingRangeProvider(
languageId: string,
provider: LinkedEditingRangeProvider
): IDisposableRegisters a linked editing range provider for simultaneous editing of related symbols.
// Complete language setup example
monaco.languages.register({ id: 'myLanguage' });
monaco.languages.setMonarchTokensProvider('myLanguage', {
tokenizer: {
root: [
[/\bfunction\b/, 'keyword'],
[/\b\d+\b/, 'number'],
[/"([^"\\]|\\.)*$/, 'string.invalid'],
[/"/, 'string', '@string']
],
string: [
[/[^\\"]+/, 'string'],
[/"/, 'string', '@pop']
]
}
});
monaco.languages.setLanguageConfiguration('myLanguage', {
comments: { lineComment: '//' },
brackets: [['(', ')'], ['{', '}'], ['[', ']']],
autoClosingPairs: [
{ open: '(', close: ')' },
{ open: '{', close: '}' },
{ open: '[', close: ']' },
{ open: '"', close: '"' }
]
});
monaco.languages.registerCompletionItemProvider('myLanguage', {
provideCompletionItems: () => {
return {
suggestions: [
{
label: 'function',
kind: monaco.languages.CompletionItemKind.Keyword,
insertText: 'function ${1:name}() {\n\t$0\n}'
}
]
};
}
});