lsp-bridge -- 速度最快的语法补全插件

:joy: annotation 还需要处理一下,可以参考 eglot:

       :annotation-function
       (lambda (proxy)
         (eglot--dbind ((CompletionItem) detail kind)
             (get-text-property 0 'eglot--lsp-item proxy)
           (let* ((detail (and (stringp detail)
                               (not (string= detail ""))
                               detail))
                  (annotation
                   (or detail
                       (cdr (assoc kind eglot--kind-names)))))
             (when annotation
               (concat " "
                       (propertize annotation
                                   'face 'font-lock-function-name-face))))))

或者大佬你看怎么好看怎么来吧。现在还有点小问题会挤在一起
image

挤在一起好说呀,插入点空格, 哈哈哈哈。


关闭 buffer 的时候 lsp-bridge 会有这个错,是进程已经被释放了吗?

现在是工程里面最后一个文件关闭后就退出 lsp server 进程,我嫌 lsp server 退太慢了,直接把他杀掉了, 哈哈哈哈。

你图标用的那个包呀?

坛里的这个。

@smallzhan 大佬,你这个好用,我直接集成到 lsp-bridge.el 里面,可以吗?

集成吧,没问题。 windows 下的 lsp-bridge 跑 pyright 好像有点问题, 好像是 initialize 之后就没回复了。

Cache action change_cursor, wait for file x:/WalkingPad/RPadDoctor/main.pyw to open it before executing.

--- Send request (1): initialize
{
   "jsonrpc": "2.0",
   "method": "initialize",
   "params": {
      "processId": 16996,
      "rootPath": "X:/WalkingPad/RPadDoctor",
      "clientInfo": {
         "name": "emacs",
         "version": "GNU Emacs 28.1 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.33, cairo version 1.17.6)\n of 2022-04-04"
      },
      "rootUri": "file:///X:/WalkingPad/RPadDoctor",
      "capabilities": {},
      "initializationOptions": {}
   },
   "id": 12452
}

--- Recv message:  window/logMessage
{
   "jsonrpc": "2.0",
   "method": "window/logMessage",
   "params": {
      "type": 3,
      "message": "Pyright language server 1.1.245 starting"
   }
}

--- Recv message:  window/logMessage
{
   "jsonrpc": "2.0",
   "method": "window/logMessage",
   "params": {
      "type": 3,
      "message": "Server root directory: c:\\Users\\smallqiang\\AppData\\Roaming\\npm\\node_modules\\pyright/dist/"
   }
}

之后就再也收不到消息了。send 倒是一直正常发。

搞定了,好看。

大佬, corfu 的字体能够定制调大一点吗?

把这行注释打开 lsp-bridge/lspserver.py at ef4dbc09fbb40295395915275d81cc960f827766 · manateelazycat/lsp-bridge · GitHub

看看是不是真的接不到消息,还是解析代码出问题了?

1 个赞

(set-face-attribute 'corfu-default nil :height 200) 类似这样?没设过不太清楚

lsp-bridge-lang-server-list 可以支持多个 mode 对应一个服务吗,比如这样

((latex-mode Tex-latex-mode texmode context-mode texinfo-mode bibtex-mode) . "texlab")

而不用写成

(latex-mode . "texlab")
(Tex-latex-mode . "texlab")
...

可以呀,只要 lsp-bridge-get-lang-server 代码要写对同时不要太耗费性能就行了。

没消息。我换了 pylsp (GitHub - python-lsp/python-lsp-server: Fork of the python-language-server project, maintained by the Spyder IDE team and the community) 是可以的,所以可能还是哪里选项的问题。

服务器 settings 参数一定要对,LSP 协议怪的很,参数不对,它不告诉你哪个参数有问题,反正就不理了。

开启了 orderless 和 corfu-history,现在 emacs 终于可以用完全不卡手的语义补全了,哈哈哈,感谢懒猫和大佬们。

corfu_

注意, orderless flex match和 api 记忆功能,太赞了!

7 个赞

(custom-set-faces '(corfu-default ((t (:height 1.3)))))

这样可以把字体调大一点,也不用改默认的颜色,我看 corfu 作者默认还做了深浅模式适配。

1 个赞

补一个视频:

10 个赞

补全过程中 Lsp-bridge 经常崩溃

--- Recv message
ERROR:epc:ReturnError([Symbol('wrong-type-argument'), Symbol('char-or-string-p'), []])

--- Recv message
ERROR:epc:ReturnError([Symbol('args-out-of-range'), 0, 1])


还没发现问题在哪,改这两处可以改善但不能根治(所以就不交 pr 了)

另外 . 后面补全结果经常奇奇怪怪,感觉像是 items 还没更新过来

char-or-string-p 那个报错我在 windows 下见过,还挺频繁,好像是在 corfu–post-command 里面报的,但是没查到在哪。

Elisp端报错,导致 hook 挂了, Emacs 发现 hook 函数挂了就会自动从 hook 中移除函数,函数被移除以后,就没法向 lsp server 发送消息,最后就像没返回一样(虽然 python 进程还在)