Monaco Editor 0.23.0如何在引号间启用自动补全,自定义规则未生效解决方法
monaco-editor 0.23.0 引号区间自动补全配置实现
核心失效原因
之前配置无效果是因为0.23.0版本内置补全逻辑存在三个默认限制,仅靠正则规则无法触发补全面板:
- 默认不会将引号字符识别为补全触发入口,输入引号后不会启动补全收集流程
- 内置上下文判定逻辑会直接跳过所有字符串、注释区间的补全请求
- 无自定义补全位置校验逻辑,无法精准识别
test.output('这类特定场景的补全触发时机
配置实现步骤
基础语言规则配置
先确保Python语言下的引号自动闭合逻辑正常,为后续补全场景提供基础:
monaco.languages.setLanguageConfiguration('python', { autoClosingPairs: [ { open: "'", close: "'" }, { open: '"', close: '"' } ] })
注册带精准上下文判断的补全提供者
这部分是实现需求的核心逻辑,需要把单引号加入触发字符列表,同时通过正则校验当前光标位置是否处于目标字符串区间内:
monaco.languages.registerCompletionItemProvider('python', { // 将单引号设为补全触发字符,输入引号时主动唤起补全流程 triggerCharacters: ["'", '('], provideCompletionItems: (model, position) => { // 获取当前光标所在行文本、光标左侧截断内容 const lineContent = model.getLineContent(position.lineNumber) const cursorLeftText = lineContent.substring(0, position.column - 1) // 正则匹配目标触发场景:光标前文本刚好是test.output(' 或test.output(" const targetSceneRegex = /test\.output\(['"]$/ // 非目标场景直接返回空补全列表,避免干扰其他位置的正常补全 if (!targetSceneRegex.test(cursorLeftText)) { return { suggestions: [] } } // 匹配成功后返回需要展示的补全选项 return { suggestions: [ { label: 'showCompletion', kind: monaco.languages.CompletionItemKind.Value, insertText: 'showCompletion', range: new monaco.Range( position.lineNumber, position.column, position.lineNumber, position.column ) } ] } } })
常见踩坑点
- 不要依赖monaco内置的
wordBasedSuggestions规则实现字符串内补全,该规则默认会过滤所有字符串、注释区间的内容,必须通过自定义补全提供者绕开过滤逻辑 - 正则匹配必须以光标左侧的截断文本为判断依据,不能匹配整行内容,否则会出现已跳转到后续参数位置时,仍误触发当前补全的问题
- 如果需要兼容双引号包裹的同一场景,正则中的引号匹配段要同时覆盖单、双引号两种类型,不要遗漏
- 0.23.0版本不支持通过语言配置直接修改字符串区间的补全开关,所有字符串场景的自定义补全都必须通过自定义CompletionItemProvider实现
内容的提问来源于stack exchange,提问作者喵喵喵
相关产品推荐
相关产品推荐

