Monaco 使用 OnTypeFormattingEditProvider

Monaco 中如何使用 OnTypeFormattingEditProvider,OnTypeFormat 是指输入指定字符后 Monaco 会自动进行格式化,例如换行、大括号、分号。效果如下:
在这里插入图片描述
首先通过 registerOnTypeFormattingEditProvider 注册 OnTypeFormattingEditProvider 处理函数
在这里插入图片描述
实现 autoFormatTriggerCharacters 和 provideOnTypeFormattingEdits,autoFormatTriggerCharacters 返回触发格式化的字符。provideOnTypeFormattingEdits 返回格式化后的文档。
在这里插入图片描述
代码实现如下

首先开启 TypeOnFormat

添加启动配置 formatOnType: true

<Editor
        height="90vh"
        defaultLanguage="mySpecialLanguage"
        defaultValue=""
        options={{ 'semanticHighlighting.enabled': true, 'linkedEditing': true, 
          'formatOnType': true }}
        onMount={handleEditorDidMount}
      />

添加自定义语言

首先需要自定义需要配置的语言,例如 mySpecialLanguage。

monaco.languages.register({ id: "mySpecialLanguage" });

实现注册函数

export function onTypeFormattingEditProvider(editor: monacoEditor.editor.IStandaloneCodeEditor, monaco: typeof monacoEditor){
  return monaco.languages.registerOnTypeFormattingEditProvider('mySpecialLanguage', {
    autoFormatTriggerCharacters: ['a', '\n'],
    provideOnTypeFormattingEdits: (model, position, ch, options, token) => {
        const edits: monacoEditor.languages.TextEdit[] = [];

        // Example: Auto indent on typing '}' or newline
        if (ch === '}' || ch === '\n') {
            const lineContent = model.getLineContent(position.lineNumber);
            const indentMatch = lineContent.match(/^(\s*)/);

            if (indentMatch) {
                const indent = indentMatch[1];
                const newIndent = ch === '}' ? indent.substring(0, indent.length - 2) : indent + '  ';
                
                // Insert formatting edit
                edits.push({
                    range: new monaco.Range(position.lineNumber, 1, position.lineNumber, position.column),
                    text: newIndent
                });
            }
        }

        return edits;
    }
  })

}
  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值