更好的上下文过滤,用于TypeScript基础知识片段

ulydmbyx  于 4个月前  发布在  TypeScript
关注(0)|答案(4)|浏览(69)

VS Code 随附了一个名为 typescript-basics 的扩展,其中包含了诸如控制流构造和基本声明等静态代码片段定义。当 TS Server 为完成请求提供服务时,它包括一个布尔开关,用于控制这些代码片段是否添加到其响应中的完成项中,但它无法确定哪些片段与请求的位置相关——要么全部包含,要么一个都不包含。这导致了相当糟糕的用户体验,例如在类的主体中提供 for-loop:

但是,如果不禁用有用的方法声明代码片段,我们也无法禁用它:

同样令人尴尬的是,方法声明代码片段也会在类之外提供:

现在,由于 TS Server 具有生成代码片段的原生支持,我们可以轻松做得更好。最简单的更改是将这些代码片段从 typescript-basics 复制到 TS Server,并让 TS Server 在给定的响应中仅包含相关的代码片段。(我说“复制”而不是“移动”,以免改变完全禁用了 TS Server 的 JS/TS 用户的行为的用户的行为,或者在 TS Server 不可用的时候。)另一种方法可能是让 TS Server 的完成响应包含某种过滤信息,而不是一个全有或全无的开关来混合来自 typescript-basics 源的代码片段,但这对我来说听起来更复杂、更容易出错,并且向后兼容性较差——但总的来说,我愿意接受其他解决相同问题的方法。

5gfr0r5j

5gfr0r5j1#

协议当前是否有方法可以表达“此完成项目是一个片段”,以便更改图标?也许它是由光标标记的存在所暗示的?

ztmd8pv5

ztmd8pv52#

是的:
TypeScript/src/server/protocol.ts
第2273行 in 449aaa1
| | isSnippet?: true; |

bbuxkriu

bbuxkriu3#

这听起来对我来说是正确的方法。

wribegjk

wribegjk4#

编辑器会议笔记:

  • 可以从typescript-basics中单独禁用静态代码片段并将其绑定到自定义键盘快捷键。我们不想失去这种功能。
  • 这可能是“TS服务器过滤器typescript-basics”模式的一个论据
  • VS Code的对应问题:API to dynamically control which snippets are shown  vscode#58112
  • 将序列化到这样的上下文中感觉很脆弱,就像我们必须不断更新这个DSL一样。也许最好能单独识别每个代码片段。
  • 这个模型是VS Code特定的——编辑器/TS服务器之间的耦合比我们更喜欢的程度要紧密。
  • 另一个选择是确保来自TS服务器的代码片段具有人类可读的稳定标识符,这样禁用/快捷键仍然可以发生。
  • 这似乎是更好的前进方向。
  • 下一步将是确定需要哪些协议更改来支持此功能。我们至少需要在代码片段上附加一些额外的数据 CompletionEntry

相关问题