corvofeng / Vsnips

Ultisnips for vscode
38 stars 3 forks source link

completion provider 补全列表生成的一些改进 #7

Closed hikerpig closed 4 years ago

hikerpig commented 4 years ago

我觉得现在的触发形式有一些问题:

  1. 只有输入 V/v 的时候才会触发 completion provider

  2. provideCompletionItems 里把所有该文件类型支持的 snippets 都返了出去,并没有根据当前输入单词(暂且称为 contextWord)做过滤,虽说 vscode 会 根据 label 排序,但总归是生成了一些可能用不到的 completion item,有一些额外的开销。

  3. provideCompletionItems 里调用 get_snip_body 会有一些开销,在实际选择展开该 snippet 之前做似乎有点浪费

觉得可以改进的方向:

  1. 输入任何字符都可以触发 completion provider

  2. provideCompletionItems 中根据当前 position 上的 contextWord 做过滤

  3. 原先的 V trigger 功能可以改为一个单独的 command 'Vsnips.show_available_snippets',列出所有 completion items

  4. provideCompletionItems 中构建 completion item 时提供 detail/documentation, 将 insertText 改为 command。 当用户选择此 item 时触发 command , 此时才进行具体的展开和替换。

  5. all.snippets 文件可以单独注册一个 provider。或者可以总体只注册一个 { scheme: "file" } 的 provider 。即便是这样原先 snippet 文件的分类延迟解析也可以实现,可以单独抽象一个 SnippetManager 之类的,代替原先的 has_repush

部分改进的实现(1,2,4)在 我目前的 dev 分支 上有。如果觉得 ok 的话我可以把代码整理一下然后再加上 3 和 5。

hikerpig commented 4 years ago

Command Vsnips.show_available_snippets 想要完成的是类似 vscode 里 editor.action.showSnippets command 的功能,不过我简单看了一下文档,这个 suggestion UI 好像没有开放出来,可以再研究一下。

2020-01-10 14 12 38

hikerpig commented 4 years ago

今天继续 实现了3和5,发现 vscode.window.showQuickPick 函数可以实现上一条评论说的效果。

2020-01-10 19 07 18

同时还有一些零零散散改动。

corvofeng commented 4 years ago

问题比较多的话建议开多个Issue, 这样好跟踪问题

corvofeng commented 4 years ago
  1. 输入任何字符都可以触发 completion provider

设计之初, 我的确是想这样做的, 但是在发现python的snippets很多, 已经把正常的代码补全都遮挡时, 我才选择使用vV作为触发按钮的, 既然你这里提出了疑问. 我觉得可以将触发键位的设置交给用户来做, 由用户选择自己合适的触发键位.

corvofeng commented 4 years ago
  1. provideCompletionItems 中根据当前 position 上的 contextWord 做过滤

这个功能可能与vdoc所做的内容类似, 只是vdoc查找了上下文的函数内容, 目前我没有想到比较好的推荐方式, 我个人使用时, 以输入时间为例, 还是习惯先按下v然后da, vscode就会将date这一项推给我, 我看了一下你的代码改动(暂时还未试验), 如果用户输入了vs, 那么vs补全结束之后, vs是否会被保留下来.

corvofeng commented 4 years ago
  1. 原先的 V trigger 功能可以改为一个单独的 command 'Vsnips.show_available_snippets',列出所有 completion items

可以考虑的哈, 可能有些用户喜欢command这种方式.

corvofeng commented 4 years ago
  1. provideCompletionItems 中构建 completion item 时提供 detail/documentation, 将 insertText 改为 command。 当用户选择此 item 时触发 command , 此时才进行具体的展开和替换。

我在添加box的时候, 已经改过了这部分代码, 感谢指出哈, 也是在阅读了hsnips之后发现了还可以这么用.

corvofeng commented 4 years ago
  1. all.snippets 文件可以单独注册一个 provider。或者可以总体只注册一个 { scheme: "file" } 的 provider 。即便是这样原先 snippet 文件的分类延迟解析也可以实现,可以单独抽象一个 SnippetManager 之类的,代替原先的 has_repush

可以简要介绍一下这个抽象类的功能或者简单写一下它的元素与成员函数, 让我有个大致规划. 感谢哈

corvofeng commented 4 years ago

感谢这位同学 @hikerpig 提出这么多问题以及指导建议, 让我觉得自己的工作也被别人需要, 同时我也能尝试完善Vsnips增加一些新的功能,

hikerpig commented 4 years ago

作为一个主力用 vscode 的前端狗,已经要被 vscode 原生的 snippet 逼疯了,添加个多行 body 都费劲,我本来都要自己写了,看到你已经做了一些工作,就跟着完善一下就好。 这里列出来的功能我后来在自己的 feature/snippetManager 分支上有跟进,基本到了自己能用的程度。跟之前 unisnips 的分支 diff 大概这样

hikerpig commented 4 years ago

中间发现 triggerCharacters 有一些坑,所以 "输入任何字符都可以触发 completion provider" 这个的实现,我选择了不使用 triggerCharacters 。 原因在我自己的 commit message 有说明,然后也给 hsnips 的作者提了一个 issue

corvofeng commented 4 years ago

中间发现 triggerCharacters 有一些坑,所以 "输入任何字符都可以触发 completion provider" 这个的实现,我选择了不使用 triggerCharacters 。 原因在我自己的 commit message 有说明,然后也给 hsnips 的作者提了一个 issue

你说的这个问题我发现了, 我写Vsnips代码的时候, 所有以v开头的变量都不给我提示补全. command会加上. 我本人不太喜欢用command, 应该也会保留trigger.

corvofeng commented 4 years ago

master中我会cherry-pick你的部分commit. 建议你随后rebase一下.

zzz6519003 commented 4 years ago

master中我会cherry-pick你的部分commit. 建议你随后rebase一下.

gayhub可能cherrypick么

hikerpig commented 4 years ago

@zzz6519003 本地 cherrypick 然后再推分支吧。

我自己的 dev 分支之后强推就好了。