Closed hikerpig closed 4 years ago
顺便推荐一下 https://github.com/draivin/hsnips ,可以根据输入交互式地更新
不好意思, 今天才看到这个PR, github的首页一直没有通知我,我会尽快处理的.
基于 completion item provider 的话,在选中一段文字的时候无法调出来 completion, 像
$TM_SELECTED_TEXT
这样的功能就没法用了。vscode 的 api 我不是很清楚,之前见人说需要选择一段以后调出editor.action.showSnippets
这个 command,可以在保留选中状态的同时展开。感觉 Vsnips 也需要一个类似的 command ?
我刚刚试用了一下TM_SELECTED_TEXT
:
{
"nls-snippet": {
"prefix": "tt",
"body": [
"nls.localize('${1:key}', '$TM_SELECTED_TEXT');$0"
]
}
}
我认为基于completion item provider
也可以用, 只是开始考虑制作Vsnips, 只支持UltiSnips兼容的代码片段, 因为我不是只用VSCode, 平时也需要用在Vim中, 如果vim中有类似的命令, 我会考虑添加一条替换语句.
- python script 的解释,不如考虑一下直接用一个外部的 python 程序执行一段拼出的代码,就不用用 js 再解析一遍 python 语句了,之前 ultisnips 里的 python 对象源码也可以直接用。但是的确这个可能工作量比较大。
软件开始设计之初就已经考虑过这个问题, 除非TypeScript上能有轻量级运行Python脚本的库, 否则不会使用Python拼接代码这样的方案. 这样的操作需要进程或是线程的开销, 我认为自己接受不了这样的延时, 所以不会考虑.
目前的方案是, 支持用户自己写js代码, 模拟Vim的UltiSnips中Python函数的调用形式. Vsnips设计之初就是VSCode插件, 使用js做替换函数也是合理的,
也许其他IDE, 像是JetBrains可能也需要UltiSnips, 但我建议使用该平台提供的解释型语言.
回归正题, 使用 @unisnips/ultisnips 解析 ultisnips 文本
, 很抱歉, 之前的parser的单元测试并不完善, 我最近会把parser的单元测试补充完整, 稍后再考虑切换.
Refer: #6
python script 的解释的确不太好弄,现在简单地检测函数然后替换应该能覆盖多数情况。毕竟多条语句的脚本也不是很多。
我比较喜欢 honza 那个 snippet 仓库里的 bbox ,目前应该是还没法用…… 不过我们能做好对 !js
块的解析执行也可以。
说起来ultisnips也不支持js解析吧,共用一份snippet文件的话我应该是会在trigger上稍微区分一下。
python script 的解释的确不太好弄,现在简单地检测函数然后替换应该能覆盖多数情况。毕竟多条语句的脚本也不是很多。 我比较喜欢 honza 那个 snippet 仓库里的 bbox ,目前应该是还没法用…… 不过我们能做好对
!js
块的解析执行也可以。 说起来ultisnips也不支持js解析吧,共用一份snippet文件的话我应该是会在trigger上稍微区分一下。
我也很喜欢那个bbox, 会尽快学习一下代码, 在这里实现一份的, 毕竟原始的UltiSnips是有这样功能的.
@hikerpig 你暂时不会加新功能了吧, 如果要加的话, 你继续加, 等你加完和我讲一声吧, 现在很难合并了, 等你把想加的功能加完, 我一条条合并吧(预计年后合并, 建议你这段期间把想加的功能加上).
另外我想保持一条分支, 可以的话请保持一下, 建议你把上面的内容可以的话用rebase压缩一下.
估计我cherry-pick的过程会很慢, 其中你修改的command我会尽量保持原状.
感谢你的付出, 可以的话, 请开新的PR, 可以基于你的dev分支, 但务必把现有的分支梳理下, 否则我合并的时候也很痛苦. 我的wx: 15189800598 可以的话, 请备注下Vsnips然后加我哈.
啊不好意思造成这些麻烦。之前的分支我基本上都是给你看一下大概思路的,其实本来已经做好自己提PR之前 rebase 或者diff一次合成一个patch的准备了。 今天我把snippet manager 那条线先整出来开一个 pr。 unisnips 这边我准备再优化一下(会优化extends 的实现,运气好的话能加上tranformation 解析),年后再提pr也成。
先说好处:替换之后,能够增加 'extends' 的支持,之后的 priority 也可以很快加上。目前我本地打包了一个 vsix 自己用,parsing 部分没发现问题。
然后是前因后果 blahblah:
之前在 v2ex 上问了一圈发现没有轻量的方案,所以准备写一个 snippets 转换工具 unisnips(发布了一个 node cli 程序,还没写文档。之后准备弄个 webapp),原意也是从想把自己常用的 ultisnips snippets 换到各种编辑器里原生的 snippet 格式。一开始也是觉得简单的正则匹配就够了,后来看了下 ultisnips 的文档和 honza 的 snippets,发现其实支持的语法还是稍微复杂一点,例如 tabstop 里还可以嵌套 (类似
${1: return ${2: value}}
),还有 transformation 之类高级功能。我目前的思路是把 ultisnips 源码的 parsing 部分用 typescript 写一遍,导出一个中间格式的数据,供不同的 backend 使用。
看到你的项目觉得我们其实可以做得更多,port 一个 vscode 版的 ultisnips 也是可以的。
顺便说几个问题和提议:
问题:
$TM_SELECTED_TEXT
这样的功能就没法用了。vscode 的 api 我不是很清楚,之前见人说需要选择一段以后调出editor.action.showSnippets
这个 command,可以在保留选中状态的同时展开。感觉 Vsnips 也需要一个类似的 command ?提议: