corvofeng / Vsnips

Ultisnips for vscode
38 stars 3 forks source link

毛遂自荐 使用 @unisnips/ultisnips 解析 ultisnips 文本 #3

Closed hikerpig closed 4 years ago

hikerpig commented 4 years ago

先说好处:替换之后,能够增加 '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 也是可以的。

顺便说几个问题和提议:

问题:

  1. 基于 completion item provider 的话,在选中一段文字的时候无法调出来 completion, 像 $TM_SELECTED_TEXT 这样的功能就没法用了。vscode 的 api 我不是很清楚,之前见人说需要选择一段以后调出 editor.action.showSnippets 这个 command,可以在保留选中状态的同时展开。感觉 Vsnips 也需要一个类似的 command ?
  2. python script 的解释,不如考虑一下直接用一个外部的 python 程序执行一段拼出的代码,就不用用 js 再解析一遍 python 语句了,之前 ultisnips 里的 python 对象源码也可以直接用。但是的确这个可能工作量比较大。

提议:

  1. 测试需要的 .vim 文件还是加到项目里 git 追踪好了,否则其他人一开始测试也不好跑起来
hikerpig commented 4 years ago

顺便推荐一下 https://github.com/draivin/hsnips ,可以根据输入交互式地更新

corvofeng commented 4 years ago

不好意思, 今天才看到这个PR, github的首页一直没有通知我,我会尽快处理的.

corvofeng commented 4 years ago

基于 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"
        ]
    }
}

Peek 2020-01-09 21-28

我认为基于completion item provider也可以用, 只是开始考虑制作Vsnips, 只支持UltiSnips兼容的代码片段, 因为我不是只用VSCode, 平时也需要用在Vim中, 如果vim中有类似的命令, 我会考虑添加一条替换语句.

corvofeng commented 4 years ago
  1. python script 的解释,不如考虑一下直接用一个外部的 python 程序执行一段拼出的代码,就不用用 js 再解析一遍 python 语句了,之前 ultisnips 里的 python 对象源码也可以直接用。但是的确这个可能工作量比较大。

软件开始设计之初就已经考虑过这个问题, 除非TypeScript上能有轻量级运行Python脚本的库, 否则不会使用Python拼接代码这样的方案. 这样的操作需要进程或是线程的开销, 我认为自己接受不了这样的延时, 所以不会考虑.

目前的方案是, 支持用户自己写js代码, 模拟Vim的UltiSnips中Python函数的调用形式. Vsnips设计之初就是VSCode插件, 使用js做替换函数也是合理的,

也许其他IDE, 像是JetBrains可能也需要UltiSnips, 但我建议使用该平台提供的解释型语言.

corvofeng commented 4 years ago

回归正题, 使用 @unisnips/ultisnips 解析 ultisnips 文本, 很抱歉, 之前的parser的单元测试并不完善, 我最近会把parser的单元测试补充完整, 稍后再考虑切换. Refer: #6

hikerpig commented 4 years ago

python script 的解释的确不太好弄,现在简单地检测函数然后替换应该能覆盖多数情况。毕竟多条语句的脚本也不是很多。 我比较喜欢 honza 那个 snippet 仓库里的 bbox ,目前应该是还没法用…… 不过我们能做好对 !js块的解析执行也可以。 说起来ultisnips也不支持js解析吧,共用一份snippet文件的话我应该是会在trigger上稍微区分一下。

corvofeng commented 4 years ago

python script 的解释的确不太好弄,现在简单地检测函数然后替换应该能覆盖多数情况。毕竟多条语句的脚本也不是很多。 我比较喜欢 honza 那个 snippet 仓库里的 bbox ,目前应该是还没法用…… 不过我们能做好对 !js块的解析执行也可以。 说起来ultisnips也不支持js解析吧,共用一份snippet文件的话我应该是会在trigger上稍微区分一下。

我也很喜欢那个bbox, 会尽快学习一下代码, 在这里实现一份的, 毕竟原始的UltiSnips是有这样功能的.

corvofeng commented 4 years ago

@hikerpig 你暂时不会加新功能了吧, 如果要加的话, 你继续加, 等你加完和我讲一声吧, 现在很难合并了, 等你把想加的功能加完, 我一条条合并吧(预计年后合并, 建议你这段期间把想加的功能加上).

另外我想保持一条分支, 可以的话请保持一下, 建议你把上面的内容可以的话用rebase压缩一下.

估计我cherry-pick的过程会很慢, 其中你修改的command我会尽量保持原状.

image

感谢你的付出, 可以的话, 请开新的PR, 可以基于你的dev分支, 但务必把现有的分支梳理下, 否则我合并的时候也很痛苦. 我的wx: 15189800598 可以的话, 请备注下Vsnips然后加我哈.

hikerpig commented 4 years ago

啊不好意思造成这些麻烦。之前的分支我基本上都是给你看一下大概思路的,其实本来已经做好自己提PR之前 rebase 或者diff一次合成一个patch的准备了。 今天我把snippet manager 那条线先整出来开一个 pr。 unisnips 这边我准备再优化一下(会优化extends 的实现,运气好的话能加上tranformation 解析),年后再提pr也成。