Monaco Editor에 Shiki 하이라이팅 적용하기
현우
npm install monaco-editor shiki @shikijs/monacoimport * as monaco from 'monaco-editor'
import { createHighlighter } from 'shiki'
import { shikiToMonaco } from '@shikijs/monaco'
async function createEditor() {
const highlighter = await createHighlighter({
themes: ['github-dark', 'github-light'],
langs: ['typescript', 'javascript', 'json'],
})
// Shiki로 강조할 언어는 Monaco에도 등록해야 한다.
for (const id of ['typescript', 'javascript', 'json']) {
monaco.languages.register({ id })
}
// Shiki 테마와 문법 강조 규칙을 Monaco에 등록한다.
shikiToMonaco(highlighter, monaco)
monaco.editor.create(document.getElementById('editor')!, {
value: `const greeting: string = 'Hello, Shiki!'`,
language: 'typescript',
theme: 'github-dark',
automaticLayout: true,
})
}
void createEditor()function applyTheme(isDark: boolean) {
monaco.editor.setTheme(isDark ? 'github-dark' : 'github-light');
}import myDslGrammar from './my-dsl.tmLanguage.json'
import * as monaco from 'monaco-editor'
import { createHighlighter } from 'shiki'
import { shikiToMonaco } from '@shikijs/monaco'
const highlighter = await createHighlighter({
themes: ['github-dark'],
langs: [myDslGrammar],
})
monaco.languages.register({ id: 'my-dsl' })
shikiToMonaco(highlighter, monaco)editor.setModelLanguage(editor.getModel()!, 'my-dsl'){
"name": 'my-dsl',
"scopeName": "source.my-dsl",
"patterns": [
{
"name": "keyword.control.my-dsl",
"match": "\\b(task|when|end)\\b"
},
{
"name": "string.quoted.double.my-dsl",
"begin": "\"",
"end": "\""
}
]
}