也可以啊,你发个pr吧
提 pr 了
合并了,谢谢
社区大佬写了一个新的解析器,替代我原来那个不严谨的解析器, volar 这种最暴力和数据流量最大的 LSP server 都好了。
社区大佬厉害,我查了一下午才定位到是解析的问题,还想着上来报问题
你能打开日志 (setq lsp-bridge-enable-log t)
看一下吗? 没有日志,别人不知道你发生了什么事情呀。
看请求和返回的id都是对上的,打开日志看看返回的是不是补全信息,还是报错了?如果有那应该就是后续补全列表的问题,比读不到返回就好处理多了感觉
右边日志往上面翻看看是不是有个有报错,貌似跟我提的那个含中文打开一个问题
我发现,如果triggerKind传3, volar返回的补全项是空的。
如果triggerKind传1,是能返回补全项的。这个对volar有什么区别吗?
补几张图:
有一点小问题,就是补全 foo.bar 时,选择之后会变成 foo…bar
我看了下 volar 的源码,好像如果是3它会从缓存数据里面取,其他的会再调服务去实时补全。。。
多个.的问题,大佬刚推了一版代码是解决这个问题,你可以更新下再试试
我这边已经很流畅了,不过本地需要把triggerKind改成1才行。
这个triggerKind:3为什么会做成缓存啊?
看意思就是指当前的这份数据还能继续接着补全,所以就在直接在这个基础上过滤了
LSP的协议,triggerKind意思: 1 是手动调用,2是通过 triggerCharacters 调用(比如 . → 等), 3是正常补全调用(也就是关键字打一半)
看你们要传递 triggerKind 1, lsp-bridge 目前是没有处理 triggerKind 是 1 的情况, 我主要不知道什么时候该发 1, 大家有啥想法吗?
和 @jadestrong 讨论,应该是这个逻辑:
- 如果和 lsp server 返回的 trigger char 匹配就用 2
- 如果当前输入字符是上一次返回补全列表的一部分就是 3
- 上面都不是就是1, 1我的理解会触发服务器重新计算
刚才提交了一个补丁,避免某一个 LSP server 找不到把 lsp-bridge 进程给弄崩溃了。
手动启动 lsp-bridge-mode 是只对当前文件吗? 我跳转到定义后就跳不回来的,再开启 lsp-bridge-mode 就会再启动一个 server