跳到主要内容

补全和行内补全有什么差别?

结论​

普通补全是用户唤起建议列表,从多项里选。行内补全是编辑器在光标后显示一段灰色预览,用 Tab 接受,用来做整行或整段预测。两套接口、两种交互,不要塞进同一个 Provider。

展开​

普通补全:

  • CompletionItemProvider
  • 触发方式是快捷键、触发字符,或「输入时显示建议」
  • 结果是一个列表,带排序、过滤、文档
  • 适合 API、单词、已有符号

行内补全:

  • InlineCompletionItemProvider
  • 提供 InlineCompletionItem,核心是 insertText 和可选的 range
  • 界面是幽灵文本,不是下拉框
  • 适合模型生成的整行、多行草稿
  • 请求更频繁,必须支持 CancellationToken,慢结果直接丢弃

两者可以同时存在。行内建议不应把候选列表撑满,列表也不该只返回一条长文本冒充行内补全。

行内补全要特别注意:

  • 只返回当前光标能接上的后缀,避免重复用户已经打出的前缀。
  • 多项时编辑器可以循环,但第一项就该是最可能的。
  • 不要在这里做附加的大范围改写。大范围改写更像代码操作。

容易讲错的点​

  • 行内补全不是 CSS 的 inline,也不是 CompletionItem.kind。
  • 把网络模型请求放在普通补全的主路径上,会把建议列表卡住。模型生成更适合行内通道,并且要可取消。
  • 接受行内补全同样会改文档,诊断和语言服务器的 didChange 会跟着来,不要再手动写一遍文本。