Closed hikerpig closed 4 years ago
Command Vsnips.show_available_snippets
想要完成的是类似 vscode 里 editor.action.showSnippets
command 的功能,不过我简单看了一下文档,这个 suggestion UI 好像没有开放出来,可以再研究一下。
今天继续 实现了3和5,发现 vscode.window.showQuickPick
函数可以实现上一条评论说的效果。
同时还有一些零零散散改动。
问题比较多的话建议开多个Issue, 这样好跟踪问题
- 输入任何字符都可以触发 completion provider
设计之初, 我的确是想这样做的, 但是在发现python的snippets很多, 已经把正常的代码补全都遮挡时, 我才选择使用vV作为触发按钮的, 既然你这里提出了疑问. 我觉得可以将触发键位的设置交给用户来做, 由用户选择自己合适的触发键位.
- provideCompletionItems 中根据当前 position 上的 contextWord 做过滤
这个功能可能与vdoc所做的内容类似, 只是vdoc查找了上下文的函数内容, 目前我没有想到比较好的推荐方式, 我个人使用时, 以输入时间为例, 还是习惯先按下v然后da, vscode就会将date这一项推给我, 我看了一下你的代码改动(暂时还未试验), 如果用户输入了vs, 那么vs补全结束之后, vs是否会被保留下来.
- 原先的 V trigger 功能可以改为一个单独的 command 'Vsnips.show_available_snippets',列出所有 completion items
可以考虑的哈, 可能有些用户喜欢command这种方式.
- provideCompletionItems 中构建 completion item 时提供
detail
/documentation
, 将insertText
改为command
。 当用户选择此 item 时触发 command , 此时才进行具体的展开和替换。
我在添加box的时候, 已经改过了这部分代码, 感谢指出哈, 也是在阅读了hsnips之后发现了还可以这么用.
- all.snippets 文件可以单独注册一个 provider。或者可以总体只注册一个
{ scheme: "file" }
的 provider 。即便是这样原先 snippet 文件的分类延迟解析也可以实现,可以单独抽象一个 SnippetManager 之类的,代替原先的has_repush
。
可以简要介绍一下这个抽象类的功能或者简单写一下它的元素与成员函数, 让我有个大致规划. 感谢哈
感谢这位同学 @hikerpig 提出这么多问题以及指导建议, 让我觉得自己的工作也被别人需要, 同时我也能尝试完善Vsnips增加一些新的功能,
作为一个主力用 vscode 的前端狗,已经要被 vscode 原生的 snippet 逼疯了,添加个多行 body 都费劲,我本来都要自己写了,看到你已经做了一些工作,就跟着完善一下就好。
这里列出来的功能我后来在自己的 feature/snippetManager
分支上有跟进,基本到了自己能用的程度。跟之前 unisnips 的分支 diff 大概这样
master中我会cherry-pick你的部分commit. 建议你随后rebase一下.
master中我会cherry-pick你的部分commit. 建议你随后rebase一下.
gayhub可能cherrypick么
@zzz6519003 本地 cherrypick 然后再推分支吧。
我自己的 dev 分支之后强推就好了。
我觉得现在的触发形式有一些问题:
只有输入 V/v 的时候才会触发 completion provider
provideCompletionItems 里把所有该文件类型支持的 snippets 都返了出去,并没有根据当前输入单词(暂且称为 contextWord)做过滤,虽说 vscode 会 根据 label 排序,但总归是生成了一些可能用不到的 completion item,有一些额外的开销。
provideCompletionItems 里调用 get_snip_body 会有一些开销,在实际选择展开该 snippet 之前做似乎有点浪费
觉得可以改进的方向:
输入任何字符都可以触发 completion provider
provideCompletionItems 中根据当前 position 上的 contextWord 做过滤
原先的 V trigger 功能可以改为一个单独的 command 'Vsnips.show_available_snippets',列出所有 completion items
provideCompletionItems 中构建 completion item 时提供
detail
/documentation
, 将insertText
改为command
。 当用户选择此 item 时触发 command , 此时才进行具体的展开和替换。all.snippets 文件可以单独注册一个 provider。或者可以总体只注册一个
{ scheme: "file" }
的 provider 。即便是这样原先 snippet 文件的分类延迟解析也可以实现,可以单独抽象一个 SnippetManager 之类的,代替原先的has_repush
。部分改进的实现(1,2,4)在 我目前的 dev 分支 上有。如果觉得 ok 的话我可以把代码整理一下然后再加上 3 和 5。