补全和行内补全有什么差别?
结论
普通补全是用户唤起建议列表,从多项里选。行内补全是编辑器在光标后显示一段灰色预览,用 Tab 接受,用来做整行或整段预测。两套接口、两种交互,不要塞进同一个 Provider。
展开
普通补全:
CompletionItemProvider- 触发方式是快捷键、触发字符,或「输入时显示建议」
- 结果是一个列表,带排序、过滤、文档
- 适合 API、单词、已有符号
行内补全:
InlineCompletionItemProvider- 提供
InlineCompletionItem,核心是insertText和可选的range - 界面是幽灵文本,不是下拉框
- 适合模型生成的整行、多行草稿
- 请求更频繁,必须支持
CancellationToken,慢结果直接丢弃
两者可以同时存在。行内建议不应把候选列表撑满,列表也不该只返回一条长文本冒充行内补全。
行内补全要特别注意:
- 只返回当前光标能接上的后缀,避免重复用户已经打出的前缀。
- 多项时编辑器可以循环,但第一项就该是最可能的。
- 不要在这里做附加的大范围改写。大范围改写更像代码操作。
容易讲错的点
- 行内补全不是 CSS 的 inline,也不是
CompletionItem.kind。 - 把网络模型请求放在普通补全的主路径上,会把建议列表卡住。模型生成更适合行内通道,并且要可取消。
- 接受行内补全同样会改文档,诊断和语言服务器的
didChange会跟着来,不要再手动写一遍文本。