我是重度 wolfram engine + vscode 玩家, 所以这方面需求很强烈.
主要需求就是 lsp 提供的
- 高亮
- 格式化
- 补全
- 查文档
- 动态运行结果
已有的方案实现了高亮 + 部分补全. 于是我需要写格式化 + 查文档 + 补全 + 动态运行结果
mmaf1
查文档是最方便的, shell 语言就是
但是调 shell 的 find 不文明, 而且万一没有. 于是用 nodejs 的 fs/promise 重写了一遍, 思路一模一样. 还加了很多符号的查询, 比如
//
mmafmt
格式化这个之前打算 PR, 发现没有回音后就自己写小工具了. 但是遇到问题, mma 的 format 实现冷启动极慢, 需要 4-5s. 于是经过前端的经验, 我决定起一个 http server 监听端口. 一路试错按下不表, 最后效果很好.
mmaplayer
动态运行结果也是长期想要的, PR 一直没合就自己单独做了. 由于也需要运行结果, 所以同理 server 解决.
mmacompletion
mma 有很多没文档的函数, 使用起来很麻烦, 官方也不太建议用.
一开始想根据前缀动态生成, 但是发现写不来. 经过思考决定静态匹配, 于是甚至不需要 server , 问题就解决了.
最后效果自然是极好 🙂
小插曲:
由于用到了 http server, 所以不可避免用到了 callback, 但需要返回值, 于是就用到了 cps 变换, 在 js 里
await new Promise((resolve) => ... resolve(val))
就可以了.但是 await 又会陷入染色函数的问题, 好在可以全局染色, 问题就解决了.
server 的 on data 会以 stream 的形式返回 chunk, 需要拼接起来, 在 on end 时再一起作为返回值打出来.
在插件开发中和网友也聊了会, 他提到我做的实际就是 lsp
当我后来基本写完时, 翻了下 ms 的文档

所以等于是某些功能是实现了 lsp 的一个子集.
