如何为Ace Tern Editor配置未知属性的自定义自动补全?
问题描述
我有一个带属性配置的default.json文件,结构示例如下:
{ "!name": "test", "Commit": { "!doc": "test", "!type": "fn(connectionName: string, k: string) -> object", "default": { "!doc": "test", "z": { "!doc": "test" }, "p": { "!doc": "test" } } } }
在编辑器中输入以下代码时:
var t = 'string'; Commit.t.
需要在输入Commit.t.后自动补全default下的属性——也就是当Commit不存在t属性时,展示z和p作为补全选项,该如何实现?
实现方案
要实现这个自定义补全逻辑,核心是基于编辑器的**语言服务协议(LSP)**扩展补全能力,具体步骤如下:
- 解析配置文件:读取并解析
default.json,提取Commit.default下的属性列表(z、p),同时记录Commit的类型定义(返回对象的函数)。 - 监听输入上下文:捕获用户输入到
Commit.t.的时刻,识别t是对应Commit函数的第二个参数k。 - 校验触发条件:检查当前场景:
- 确认
Commit是作为函数调用后的对象被访问; - 确认当前访问的
t并非Commit自身挂载的属性;
- 确认
- 返回补全候选:满足条件时,将
default下的z、p作为补全选项返回,同时带上对应的!doc描述信息。
如果基于VS Code这类编辑器的插件API开发,可直接利用内置接口快速实现:
- 插件激活时,通过
vscode.languages.registerCompletionItemProvider注册补全提供者,指定触发字符为.; - 在补全回调中,分析文档语法树,定位到
Commit.t.的代码位置; - 加载并实时解析
default.json的配置内容; - 验证上下文符合要求后,创建包含
z、p的补全项,配置好描述文档后返回给编辑器。
另外要处理配置文件的动态更新:一旦default.json内容修改,需重新解析配置,保证补全选项始终为最新状态。
内容的提问来源于stack exchange,提问作者Тина Погодина
相关产品推荐
相关产品推荐

