我是重度 wolfram engine + vscode 玩家, 所以这方面需求很强烈.
主要需求就是 lsp 提供的
  1. 高亮
  1. 格式化
  1. 补全
  1. 查文档
  1. 动态运行结果
已有的方案实现了高亮 + 部分补全. 于是我需要写格式化 + 查文档 + 补全 + 动态运行结果

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 的文档
notion image
所以等于是某些功能是实现了 lsp 的一个子集.
notion image

 
Loading...
Steven Lynn
Steven Lynn
喂马、劈柴、周游世界
最新发布
我与 Dify 的半年
2025-3-9
我的2022年终小结
2024-11-9
记录雅思考试经历与一点学习心得
2024-11-9
Hackergame 2024 思路小结
2024-11-9
黑客松、日本、入职:我的2024下半年的总结
2024-11-9
NotionNext:基于Notion和NextJS的开源博客
2024-11-9