如何在Monaco编辑器中移除JSON的$schema自动补全选项
解决Monaco Editor JSON模式下移除$schema自动补全选项的问题
我之前做JSON编辑UI时也碰到过这个烦人的$schema自动补全,折腾了几次终于找到可行方案,分两种场景给你说明:
方法一:全局禁用Schema相关补全(简单直接)
如果完全不需要任何schema相关提示,一行代码就能搞定,直接通过Monaco的JSON默认配置关闭:
// 关闭JSON Schema的补全建议 monaco.languages.json.jsonDefaults.setOptions({ suggest: { schemaSuggestions: false } });
这个配置会直接关掉所有和schema相关的自动补全(包括$schema选项),同时不会影响你自己的自定义补全功能。
方法二:精细过滤$schema选项(保留其他默认补全)
如果你还想保留JSON默认的语法补全(比如对象、数组的结构提示),只是单独去掉$schema,可以通过自定义Completion Item Provider实现。核心思路是先获取默认补全列表,过滤掉$schema后再合并自己的自定义补全:
monaco.languages.registerCompletionItemProvider('json', { // 和JSON默认触发补全的字符保持一致 triggerCharacters: ['"', ':'], async provideCompletionItems(model, position) { // 获取JSON默认的补全提供者 const defaultProvider = monaco.languages.json.jsonDefaults.completionItemProvider; // 获取默认补全列表 const defaultCompletions = await defaultProvider.provideCompletionItems(model, position); // 过滤掉label为$schema的补全项 const filteredDefaultItems = defaultCompletions.items.filter(item => item.label !== '$schema'); // 这里添加你的自定义补全项,示例如下 const customCompletions = [ { label: 'myCustomKey', kind: monaco.languages.CompletionItemKind.Property, insertText: '"myCustomKey": "$1"', insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet, documentation: '这是我的自定义配置项' } ]; // 返回合并后的补全列表 return { items: [...filteredDefaultItems, ...customCompletions] }; } }, { // 设置优先级高于默认提供者,确保过滤逻辑生效 priority: 1 });
这里要注意设置priority: 1,让自定义提供者的优先级高于默认的,这样我们的过滤逻辑才能覆盖默认的补全结果。
为什么之前的completionProvider没生效?
大概率是两个原因:要么直接注册自定义提供者时完全覆盖了默认补全,要么优先级设置低于默认导致$schema还是会显示。上面的方法既保留了有用的默认补全,又去掉了不需要的$schema,同时能正常加入自定义内容,应该能解决你的问题。
内容的提问来源于stack exchange,提问作者Tim Perry
相关产品推荐
相关产品推荐

